2012-03-22 84 views
4

我开始一个保护/包装/粘合剂像项目。虚拟文件系统设计

的目标是当你有

  • /图片/
  • /音乐/
  • 基地* .ini文件
  • 的dll
  • 前男友
一个完整的应用程序目录

你只需使用packer.exe就可以了,所有这些文件都被打包,加密和存储n由此产生的exe。

生成的exe然后创建一个透明的虚拟文件系统,如果找不到文件,它将回退到“真实”文件系统。

我媒体链接可以处理(不很精确地)从存储器等加载DLL但我有与HMM的钩一个问题..

现在,作为ProofOfConcept IM附接debbuger(用C++),以一个target.exe

它看起来有点像

======= Started [target.exe] ======= 
> Placing breakpoint on EP : 0x401130 
Process started 
Loaded module : [target.exe] 
Loaded module : [ntdll.dll] 
Loaded module : [kernel32.dll] 
[...] 
Break point at [0x401130] 
> Restored EP byte. 
Loaded module : [bass.dll] 
Break point at [0x760fcc4e] 
Found set bp : kernel32!CreateFileW 
[!] CreateFileW Callback Function : 
     FileName : C:\Users\user\Desktop\cppve\loader\bin\Debug\target.exe 
     Access : 0x80000000 
     Return Addr: 0x741b91e6 
> Re-setting bp at [0x760fcc4e] 
Break point at [0x760fcc4e] 
Found set bp : kernel32!CreateFileW 
[!] CreateFileW Callback Function : 
     FileName : .\beyond_v.mod 
     Access : 0x80000000 
     Return Addr: 0x760fcfa0 

我正在处理断点调试的东西像CreateFileW的ReadFile等 的具有1M的问题与可用的数据提供的目标。

我应该创建一个假手柄,然后捕获并处理它?还是有太多的东西可能会在这种方法上出错?

这里是CreateFileW

示例回调函数
void callback_createfilew(CONTEXT* ct){ 
//stub 
cout<<"[!] CreateFileW Callback Function :"<<endl; 

void* returnaddr=MemReadDwordPtr(hProcess,(void*)ct->Esp); 
string fn=MemReadCString(hProcess,MemReadDwordPtr(hProcess,(void*)ct->Esp+4),true); 
void* access=MemReadDwordPtr(hProcess,(void*)ct->Esp+8); 
void* sharemode=MemReadDwordPtr(hProcess,(void*)ct->Esp+12); 
void* dwCreationDisposition=MemReadDwordPtr(hProcess,(void*)ct->Esp+20); 
void* dwFlagsAndAttributes=MemReadDwordPtr(hProcess,(void*)ct->Esp+24); 

cout<<"  FileName : "<<fn<<endl; 
cout<<"  Access : "<<(void*)access<<endl; 
cout<<"  Return Addr: "<<(void*)returnaddr<<endl; 

if(fn.compare(".\\beyond_v.mod")==0){ 
    // this is wrong, we need to call it from the target process... 
    HANDLE ret=CreateFileA(".\\_beyond_v.mod",(DWORD)access,(DWORD)sharemode,NULL,(DWORD)dwCreationDisposition,(DWORD)dwFlagsAndAttributes,NULL); 
    ct->Esp+=0x20; 
    ct->Eax=(DWORD)ret; 
    ct->Eip=(DWORD)returnaddr; 
} 

我应该做一个codecave在这个过程中,推动的shellcode [编辑:对不起,我用许多这样的词语来形容不同的事情,但我想你将抓住我的补习:)]那里执行我的伪造代码?

或者可能注入一个DLL来处理int3s并通过加载器设置的异常处理程序将控制权交给它。然而,这可能会很棘手......该DLL必须在虚拟文件系统!所以我将不得不在任何其他初始化发生之前手动加载它。

我想在最终版本中完成删除调试器。只会造成问题,严重影响项目的保护部分。

+0

ProofOfConcept(从内存中播放mod文件的低音dll)完成并工作.o0 – n00b 2012-03-23 01:21:52

回答

1

如果您希望您的“打包器”在预编译的二进制文件上透明地操作,并且希望所有内容都位于生成的单个二进制文件中,那么打包器需要将二进制代码添加到二进制文件中,可能会使其作为第一件事情执行,只有将控制权交给二进制文件的原始入口点。这不是很微不足道,尽管肯定是可行的。

但您在这里还有其他问题。这个挂钩代码将包含解密代码,也可能包含密钥,这一切都可以由优秀的程序员用调试器和其他工具来破解。

至于假手柄,我会看看是否有可能多次打开文件并获取不同的手柄。如果是,只需打开任何现有文件以在共享模式下阅读,请记住该句柄并将其用于内存文件。需要另一个句柄?再次打开文件得到一个。这将保证不会与其他真正的手柄发生碰撞。

+0

共享模式是一个好主意,我可以摆脱我的错误处理欺骗代码:) – n00b 2013-08-10 10:13:03