-
-
[原创]也说Zp的IAT加密
-
发表于:
2008-6-24 09:39
6000
-
其实Zp的IAT加密很脆弱。
例子我就直接用lunglungyu的文章里面的代码了,省得自己搞
00402410 - FF25 60304000 jmp dword ptr ds:[403060]
跟进
call 00402410
就是给加密的GETMODULEHANDLEA
00EC0000 50 push eax
00EC0001 60 pushad
00EC0002 68 92D455AA push AA55D492
00EC0007 E8 9404ECFF call 00D804A0
00EC000C 61 popad
00EC000D C3 retn
上面是低强度的,我们比较下一个子选项之后的:
00402344 - E9 4BBF0000 jmp 0040E294 ; yh_packe.0040E294
00402349 90 nop
0040E258 68 A7B93C15 push 153CB9A7
0040E25D ^ E9 52FEFFFF jmp 0040E0B4 ; yh_packe.0040E0B4
这里解释下,0x153CB9A7是Key,用于计算位置,用来干什么的位置?查表……
0040E0B4 这个就是Zp的过程了。开始是一个GetTickCount的计算,一定要小于。然后使用Key产生了一次0xff15的Call []调用,记住这个Call,后面会很有用。然后eax返回的是使用Key计算出来的索引值,放入esi,在另外一个值放入eax捣鼓了几下,对esi做了cmp比较。
其实这里可以猜出来,为什么要比较。只是为了保证Key是正确的,算出的索引esi没有超出表的总项数eax,之后把表的起始位置放入ecx使用ecx+esi*4查表。查出来的值直接丢前面Key在堆栈中的位置。然后retn形成调用。
如果你自己走过那个CALL[]调用,你会发现其实步数不多,除了对esi的操作其他都是nop性质的,而且函数的关联性很差,可以直接提取。这样就可以做脚本来修了。
进入的时候我们不Jmp到0040E0B4,直接Call那个地址,索引值就会出现在eax中,然后我们查表就可以获得函数了,怎么修复,脚本怎么写?算了吧,前一项自己想,后一项我不会……
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法