(这只是草稿,有些错的,按能力断章取义)
程序没能跑起来,目前只是这样,静态分析没有毛病,如果程序的函数被vm了,就没法静态分析了。
过VMP的反调试保护原理代码VMP的反调试保护主要有两处
1、tls callback检测 解决方法 将TLS CALLBACK ARRAY的第一个成员置就行了 tls是在程序执行之前的一个回调,具体百度。
2、调用NtSetInformationThread使线程的HideFromDebug被置位
解决方法
__try{
PEPROCESS pEprocess = PsGetCurrentProcess();
PLIST_ENTRY pThreadListHead =(PLIST_ENTRY)((ULONG)pEprocess + 0x190);
PLIST_ENTRY pThreadList = pThreadListHead;
do {
pThreadList = pThreadList->Blink;
ULONG pHideFromDebug = (ULONG)pThreadList+0x1c;
*(ULONG *)pHideFromDebug = *(ULONG *)pHideFromDebug&!4;
}while(pThreadList->Blink!=pThreadListHead);
}
__except(EXCEPTION_EXECUTE_HANDLER) {
DbgPrint("exception occured\n");
}
handler是啥?
这个要学虚拟机才能搞明白,搞清楚。(这里的虚拟机跟vmware不太一样,具体可以看《加密与解密》里面有写)
vmp函数混淆,主要是勾住handler的头部和尾部,这样我们就可以拿到函数的参数和返回值,同样可以达到■■软件的目的。vmp勾引了一些函数来防止你调试它,所以这些我们可以用strongOD来过掉,但是这个插件做了些什么我们也需要知道。
还有就是jcc指令爆破,这个吾爱汇编上面也有人出了一个x64位程序的爆破插件,其实原理还是就像反汇编引擎一样我们把jcc指令还原成x86汇编原来的样子。
被VMP HOOK的ZwProtectVirtualMemory介绍ZwProtectVirtualMemory,是一个修改内存输入的API函数,VirtualProtect和VirtualProtectEx修改内存属性都会通过ZwProtectVirtualMemory这个API函数.
要脱VMP必须先搞懂虚拟机,知道handler是什么,不然听不懂别人讲的是什么。
在网上找的vmp3-import-fix的IAT表修复工具成功找的了修复了IAT,限制试试吧。最后还是没能跑起来
同样是用OD打开进行,把Hide PEB打开,隐藏OD的PEB,FakeParentProcess伪造父进程。VMP3.1(above)这个应该就是过掉vmp的虚拟机保护措施,debugport清零啊,什么的。勾选 ZwFunctions ring0,搞定就检测不到调试信息了。不要隐藏我们的进程这样IAT修复工具找不用的都是SharpOD Ver:0.6b
找OEP就不说了,就是下GetVersion,GetStartInfo,GetHandler,这样的函数断点,就会断在函数入口,然后堆栈的第一个就是CALL的下一行,所以跟回去就到OEP的下面几行。
0045C821 55 push ebp
这个时候的OPE是加上了ImageBase的RVA地址,所以我们修复IAT的时候要采用FOA的地址。
运行起来用工具修复的到下面的地址。
[2022-12-07 10:19:17.313] [logger] [info] [+]IAT size:0x648, IAT address:0x4200000
然后我手动修复了ImageBase,但是还是不行,并且我加的壳都没有用进程保护(开始不晓得怎么用>.<)
结果还是没法跑起来,说明就是有问题啊。
eax、ebx、ecx、edx、esi、edi、esp、eip、eflags寄存器
esp+4,对应虚拟机退出后的跳转地址,去执行正常函数
esp+8,正常函数执行完后的跳转地址,通常是虚拟机的入口
esp+12,可能是正常函数的参数一
esp+16,可能是正常函数的参数二
esp+20,可能是正常函数的参数三
esp+24,可能是正常函数的参数四
esp+28,可能是正常函数的参数五
esp+32,可能是正常函数的参数六
群里一个网友的提示:antidump要处理不过我后来发现还是IAT没有修复,感觉是hook了API
看了一下,vmp会hook很多api,突然想到,如果软件本身要执行文件创建或者拷贝操作呢
找OEP的方法:我们可以在GetVersion,GetStartInfo,GetHandler这些函数上下断,返回地址上面就是OEP了,32位程序一般是55 8B EC一般是最后窗口弹出来的那一次上面
断在GetVersion之后堆栈第一个就是函数返回地址,返回去往上就是OEP
OEP是找到了,可是就是IAT一直修复不了,VMP3.x的IAT需要用其它修复工具,貌似通用的修复不了。
vmp的壳它在有些地方跳过去,只要动一下就变了,其实认真看硬编码还是可以看懂的,它就是把段基址给用其它代替了,这样就导致反汇编引擎识别的时候出现只要动一下就不在显示汇编代码。
这里一定要注意OEP找到了以后,dump的时候要把BASEADDRESS给去掉在dump,例如:0045C821>0005C821
IAT表获取不到的就把程序运行起来,这样vmp就已经把数据解密到内存中了,就使用上面的工具进行修复,其实就是通过内存搜索把,dll和函数,全部申请到一个新的地方,这样下面的工具就能找到了。
显示无效的,Trace level 1右键选择这个
不过我发现好像这个输入表修复工具没有正常的修复!!!
因为vmp保护了IAT表!!!
我感觉是因为vmp检测了内存读写函数,这样通用工具就失效了,这个就肯定是有问题的,人家又不傻,不会连这个都不知道。具体是什么原因我很忙占时没有研究它。
而且我加的VMP3.5保护全开,去除重定位表,所以加密强度很高,怎么脱还有待商议。
我的猜测是不是代码起始位置和代码终止位置不正确导致的???
===============================================================
正在修复: hacker.vmp.exe
代码始于: 00000000 → 自动: 00400000代码止于: 00000000 → 自动: 00DB2000新的IAT VA: 00000000 → 自动: 04100000
修复输入表: 是
最后没空研究了,就这样了,静态分析没有毛病了。
在分析分析肯定能跑起来,可是身体不好,实在不行。