我正在启动一个类似项目的保护器/打包器/粘合剂。
目标是当您拥有完整的应用程序目录时
- /图片/
- /音乐/
- 基础 *.ini 文件
- dll
- exes
您只需在其上使用 packer.exe,所有这些文件都被打包、加密并存储在生成的 exe 中。
生成的 exe 然后创建一个透明的虚拟文件系统,如果找不到文件,该文件系统将回退到“真实”文件系统。
我已经可以处理(不是很准确)从内存中加载 dll 等,但是我的 hmm 钩子有问题..
现在,作为 ProofOfConcept,我将调试器(用 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 等的断点,我在为目标提供可用数据时遇到问题。
我应该创建一个假句柄然后抓住它并处理它吗?还是这种方法有太多可能出错的地方?
这是 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 并推送 shellcodes [编辑:对不起,我使用这些词中的许多词来描述不同的事物,但我认为你会明白我的意思 :)]在那里执行我的伪造代码?
或者可能注入一个 dll 来处理 int3s 并通过加载程序设置的异常处理程序将控制权传递给它?但是,这可能会很棘手……该 dll 必须在虚拟文件系统中!所以我必须在任何其他初始化发生之前手动加载它。
我想在最终版本中完全删除调试器。它只会引起问题并严重损害项目的保护器部分。