带头大哥来教大家脱VMP3.x用另外种方式
本帖最后由 Sky__Mo 于 2022-2-20 19:33 编辑我这里以VMP3.5为例,由于资源修复没有想到很好的办法,所以没有勾选加密资源选项。(易语言不需要修复资源,修复下资源相关api就行)
研究过VMP3.x的朋友都知道,VMP是通过lea eax,dword ptr ds:指令来获取到API地址,大致意思就是先获取差值,然后通过差值加上常数来取得地址。
有了这一个思路,于是我就开始从这个地方入手。
VMP加密会有部分IAT不会加密上,所以我在图1
0x00422400这个地址上下写入断点,断在了图2上<本意是想知道VMP是如何获取API地址的,后来找出来了加密方式>
这里是写入API地址得地方,下入断点后再次运行后断在图3的地方,从这里我开始反复推敲出各个数据,从图3上我们可以看到
eax为写入差值的地址,ecx为差值, ESP + C那个地址里面保存的是以序号或者名称导入形式(这个不重要可以忽略),第二个是差值的偏移,也就是eax=0x00400000+001F9783,第三个就很明显了,就是lea 取地址的那个常数,ecx 2078FF9D+560206C2 = 767B065F(为ApiAddress),从这里开始,我已经有了一个大体的流程。
VMP加密API获取表里的API地址,通过获取到的Api地址减去常数,得到差值后存放到地址里(这个存放的会进行一个加减法加密,这里没必要深究这个地址)。
VMP调用API流程,也就是像上面说的那样调用。
到了这里,思路开始很是清晰了,我通过写脚本匹配出API和对应的常数,再在vmp0段里扫描出常数地址,用capstone识别出lea指令和寄存器类型,然后全部重建成
mov reg,这种类型的。图4是脚本以及脚本匹配出的数据
图5 图6是识别出指令然后重新写入成mov类型
还有一点就是VMP会模拟个别API,比如GetVersion等,这个可以在内存中扫到,然后找到地址,构建一段shellcode,从入口点跳转至shellcode后获取api然后填充进地址。
图7是用UIF和Scylla修复好后运行的图
不知道说啥,给楼主顶一下吧! 感谢楼主 感谢楼主 谢谢分享 大牛厉害!感谢分享! 谢谢分享 回复,顶帖,赚币,谢谢楼主 谢谢大神的奉献 感谢楼主