ACProtect Professional 1.3C 主程序脱壳(3)(图)

互联网   发布时间:2008-10-08 19:05:26   作者:佚名   我要评论
运行程序,crashedL。直接用修复完stolen code的dumped_.exe看看。从EP的第1个call进去就有问题。 在OllyDbg中可以看到: 有部分IAT在壳中。这部分代码前面是跟到了的(在第6次int 3以后),原来认为这只是loader自己需要的API。实际上

开始打算写个inline-patch:

用同样的查表动作,把对应的变形码copy出来,得到对应的API地址,与跳过加密而得到的干净IAT对比。查到匹配值后,修改对应的opcode,使其直接call到IAT中的地址。

用OllyScript脚本跳过IAT加密,得不到变形码(此时从变形码地址表中得到的就是API的真正地址,有46项指针无效,为0xCCCCCCCC)。

另一个问题却是难以解决的,replaced code只有5字节:

这里的call是0xE8,调用壳中的绝对地址。InlinePatch写到一定程度才发现,如果要修复代码,使其调用到IAT,需要相对地址调用6 bytesL。真是个低级错误。

现在patch的结果:


真正需要的是:



这样只有保留变形码。把壳中对应的代码copy过来,OEP前生成正确的变形码。而且脱壳后的程序不能直接看到API名字,很不舒服。

只好把壳的相应代码搬过来。再次修改dumped_.exe入口处代码,在把loader空间中的IAT填好后,跳到处理变形码的位置:



loader在处理IAT时需要调用几个API,及判断dll的映射地址、API地址等,先保存需要的数据(我们有干净的IATJ):



由于在前面避开了IAT加密,生成变形码需要的数据已经被正确的API地址覆盖了。用LoadPE把ACProtect的idata section存到文件,然后加到dumped_.exe。



把这个section的密文数据copy到dumped_.exe的idata section,覆盖掉干净的IAT,我们已经不需要它了。现在只要伪造好现场J。



往下执行loader的IAT处理代码,做几处小小的修改,使其使用刚才保存的API地址等数据。


IAT及变形码处理结束后回到OEP。



执行。又挂了L。这次是内存访问异常。跟一跟可以知道,是在Hooked MessageBoxA中。这里面的代码还没有仔细看,有几个switch-case分枝。第1次eax为5。



进去后有几个查表动作:



用调用Hooked MessageBoxA的返回地址查表。这张表在721F25处,dumped_.exe中有,共21项。
注意查表时不是找相等值,而是找大于返回地址值且最接近的值。



继续->



这里出现了另外2张表。7220B5的表中数据为size。Dumped_.exe中有:



问题出在第3张表:



dump出的数据为0。这段代码要把主程序中的一段数据copy到这张表中数据所指的地址。在loader中执行时,这里填入了指向动态分配内存的指针。



显然不能直接复制这些值。有个简单的办法可以骗过loader。从那张size表中可以看到,最大的数据FD5D。用LoadPE再次增加1个section,size为FFFF即可。



修改dumped_.exe,设置21项数据,使其全部指向该地址。



在W2K下运行,显示窗口,但不能响应输入。在WinXP下运行什么也不显示。
下面该与主程序交手了,这需要把板凳坐穿的耐心L。

相关文章

最新评论