其他
VMP导入表修复
看雪论坛作者ID:coNg叶
1
VMP的IAT处理的几种情况
1、call ds:[xxx]
2、jmp ds:[xxx]
3、mov reg,ds:[xxx] + call reg
4、壳开始运行时填充到原来的导入表地址,不改变指令。
原来:
保护后变为call vmp0 + 1字节,这里call 后面不全是填充的retn,有可能是其他字节:
保护后变为push/pop reg + call vmp0:
5字节A1 开头的mov eax,ds:[xxx] 直接变为5字节的E8 call vmp0
6字节8B 开头的mov reg,ds:[xxx],则变为5+1或1+5类型的E8 call vmp0
2
获取call vmp0指令地址
3
判断哪种IAT处理类型
2、对于mov reg,ds:[xxx]方式,通过unicorn模拟可以发现返回地址是在E8 call vmp0导致的+5或者+6位置,对应上面1+5和5+1情况,同时只会写入除了ESP外的一个寄存器。
4
判断5+1或者1+5或者只有5字节模式
1、对于push reg +E8 call方式在 call内会通过pop reg来恢复call前因为push reg减少的堆栈,比如如下调用,模拟开始给的esp是0x1000,恢复堆栈的指令为:
pop ebx //恢复堆栈,同时ebx = 返回地址
xchg ebx,[esp] //将返回地址和ebx值还原
[0x1000+4] = 返回地址
xchg edi,[esp] //执行后edi = 返回地址,[esp] = 之前的参数
push edi //push 返回地址
[0x1000] = 0
5
代码
https://github.com/mike1k/VMPImportFixer
原代码把所有的指令都判断为FF 15类型,并且没有判断5+1、1+5和5的模式,以及mov reg,xxx类型和直接填充的类型。
6
参考
1、https://github.com/mike1k/VMPImportFixer
3、手动分析VMP加密的x64驱动导入表(https://bbs.pediy.com/thread-248812.htm)
看雪ID:coNg叶
https://bbs.pediy.com/user-home-753304.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!