本文为看雪论坛优秀文章
看雪论坛作者ID:冰鸡
在很久很久以前,神奇的nooby有了个天才的想法,通过修改themida的引擎,使其强制输出了没有混淆和加密的程序,很轻松的就分析完了外壳逻辑和vm的逻辑,盖亚。
通过nooby的想法,我们也将vmp3.5.1的引擎进行了修改,使其强行输出了没有混淆和vm后的代码,便于我们分析外壳和handler的逻辑。
今天先来看看vmp的反调试原理,先将vmp配置成如下,避免其他功能的干扰。
如图,这时的入口不再是骇人的 push 0xXXXXXX / call xxxxxx,而是:int start()
{
if ( (unsigned int)sub_4F4664() == 1 )
return mainCRTStartup();
sub_4F44EC();
return 0xDEADC0DE;
}
sub_4F4664()是一个非常大的函数,vmp整个外壳的逻辑所在,内存保护,导入表保护,资源保护,压缩等等就是在这个函数中处理的。根据ntdll的版本初始化一些HardCode,后面会用到。
接着我们直奔诸葛亮三轮车,vmp自己封装了一个从模块的导出表直接得到地址的函数,这种方式在shellcode中比较常见。接着通过GetExportAddress和上面通过ntdll定位的syscall序号进行反调试检测。
vmp分别通过了IsDebuggerPresent,CheckRemoteDebuggerPresent, NtQueryInformationProcess,以及ZwSetInformationThread进行用户态反调试,vmp在调用函数之前,会检测头部是不是0xCC,然后直接报错。那么,剩下的贰之型·珠华弄月再说。
看雪ID:冰鸡
https://bbs.pediy.com/user-home-841912.htm
*本文由看雪论坛 冰鸡 原创,转载请注明来自看雪社区
文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458432666&idx=1&sn=4d1ff1a26a262118f5ad91022b362b42&chksm=b18f841086f80d06ba0aff8b739eaa49669b5f45549cf93fe792f4b75bea52934d2edc7db7b3#rd
如有侵权请联系:admin#unsafe.sh