c – 虚拟文件系统设计

c – 虚拟文件系统设计,第1张

概述我开始像项目一样保护/包装/粘合剂. 目标是当你有一个完整的应用程序目录 > / images / > / music / > base * .ini文件 > dlls > exes 你只需在其上使用packer.exe,所有这些文件都打包,加密并存储在生成的exe中. 然后,生成的exe会创建一个透明的虚拟文件系统,如果找不到文件,它将回退到“真实”文件系统. 我已经可以处理(不是非常准确)从内 我开始像项目一样保护/包装/粘合剂.

目标是当你有一个完整的应用程序目录

> / images /
> / music /
> base * .ini文件
> dlls
> exes

你只需在其上使用packer.exe,所有这些文件都打包,加密并存储在生成的exe中.

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

我已经可以处理(不是非常准确)从内存加载dll等,但我有一个问题与hmm钩子..

现在,作为ProofOfConcept我将debBUGer(用c编写)附加到target.exe

看起来有点像

======= Started [target.exe] =======> Placing breakpoint on EP : 0x401130Process startedLoaded 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){//stubcout<<"[!] 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必须在虚拟文件系统中!所以我必须在任何其他初始化之前手动加载它.

我希望,在最终版本中,完全删除调试器.它只会引起问题并严重影响项目的保护部分.

解决方法 如果你希望你的“打包器”在预编译的二进制文件上透明地 *** 作并且希望所有内容都在最终的单个二进制文件中,那么打包器需要将挂钩代码添加到二进制文件中,可能使它作为第一件事执行,然后才传递控制权到二进制文件的原始入口点.这不是很微不足道,虽然肯定是可行的.

但是你有另一个问题.这个挂钩代码将包含解密代码,也可能包含密钥,这一切都可以通过一个带有调试器和其他工具的优秀程序员来破解.

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

总结

以上是内存溢出为你收集整理的c – 虚拟文件系统设计全部内容,希望文章能够帮你解决c – 虚拟文件系统设计所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225887.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存