c – 虚拟文件系统设计
我开始像项目一样保护/包装/粘合剂.
目标是当你有一个完整的应用程序目录 > / images / 你只需在其上使用packer.exe,所有这些文件都打包,加密并存储在生成的exe中. 然后,生成的exe会创建一个透明的虚拟文件系统,如果找不到文件,它将回退到“真实”文件系统. 我已经可以处理(不是非常准确)从内存加载dll等,但我有一个问题与hmm钩子.. 现在,作为ProofOfConcept我将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:UsersuserDesktopcppveloaderbinDebugtarget.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; } 我应该在这个过程中做一个编解码器并推送shellcodes [编辑:对不起,我用这些词来描述不同的东西,但我想你会抓住我的想法:)]那里执行我的伪造代码? 或者可能注入一个将处理int3并通过加载程序设置的异常处理程序将控制传递给它的DLL?然而,这可能是棘手的…… dll必须在虚拟文件系统中!所以我必须在任何其他初始化之前手动加载它. 我希望,在最终版本中,完全删除调试器.它只会引起问题并严重影响项目的保护部分. 解决方法
如果你希望你的“打包器”在预编译的二进制文件上透明地操作并且希望所有内容都在最终的单个二进制文件中,那么打包器需要将挂钩代码添加到二进制文件中,可能使它作为第一件事执行,然后才传递控制权到二进制文件的原始入口点.这不是很微不足道,虽然肯定是可行的.
但是你有另一个问题.这个挂钩代码将包含解密代码,也可能包含密钥,这一切都可以通过一个带有调试器和其他工具的优秀程序员来破解. 至于假句柄,我会看到是否可以多次打开文件并获得不同的句柄.如果是,只需打开任何现有文件以便在共享模式下读取,请记住该句柄并将其用于内存文件.需要另一个手柄?再次打开文件以获得一个.这样可以保证不与其他真正的手柄发生碰撞. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- rubygems – 安装rb-appscript gem时出错
- ruby-on-rails – 如何全局覆盖rails url helper?
- Vue form 表单提交+ajax异步请求+分页效果
- Ajax.PeriodicalUpdater
- 在C中从一个线程向另一个线程发送数据的最快方法是什么?
- objective-c – NSWorkspacedidmountNotify /可能是通用的N
- Hybrid (Native + Web) Mobile App Development
- C#抓取网络图片保存到本地
- 大数据学习——你知道Apache Cassandra 的优点有哪些吗?
- ruby – 使用Savon SOAP库“HTTPI尝试使用httpi适配器”错误