ACProtect v2.1.3版本脱壳.
文章目录
我还是使用delphi7的例子..首先上来还是找OEP.. 这个OEP被偷的很过分啊, 如果不是使用退出法找到OEP.. 估计其他类似的程序够呛..
当然这个壳的话, 基本上也没有什么难度, 主要难度还是集中在Code Replace, 脱壳很容易, 这个壳没有合并程序的区段, 很容易还原成完整的区段, 另外这个壳没有将IAT加密, IAT也可以很轻易的就dump一份出来.
首先Ollydbg跑起来, 在idata断下断点, 一般这时候就是填写IAT的地方. 同时可以得到一个信息就是Code段已经解压的差不多了. 在idata断下来以后, 我们需要做的事情全部都在这里了.. 在断点下面一点点, 就是这个代码.
|
|
是的, 这里就是解密要导入DLL的名称.. 然后在下面一点点
|
|
有将导入DLL的名称清空, 太猥琐了,直接nop.完了之后是这里解密函数名称字符串.
|
|
同样有一个地方在将这个字符串清空..猥琐之极.nop掉.
|
|
再下面这里是有对一些特殊函数特殊照顾的, 比如MessageBoxA什么的.这里我们也可以nop掉.
|
|
c++ {tabWidth=8} 0046C435 61 popad 0046C436 8907 mov dword ptr [edi], eax ; 这句代码是填写函数地址. 0046C438 8385 00794000 0>add dword ptr [ebp+407900], 4 ```
假如我们直接忽略, 就连Import Rec
也不用了如果我们把这一句nop掉的话, 那就舒服了. 直接连Import Rec修复也不用了. 完完整整的IAT表信息.. 赞一个.这时间IAT表已经解密完成了. 我们差的就是跳到oep了. 但是ACProtect这个壳的话, oep被偷取了. 这时间我们在.code段下个断点, 会发现断点在delphi7程序入口的第一个CALL. 我们在堆栈上回溯下, 会发现调用的代码,这也就是被偷取的变形的代码, 当然不要被一些花指令给迷惑, 我们应该看到ff15.. 太熟悉了这个..call [xxxxx].恩应该就是它, 没错了. 我们在回到delphi7程序中看看这边的代码是什么.. 直接patch…OK这样就差不多了.完了之后就已经可以跑起来了. 就是这个stolen oep需要处理下, 不然看着很恶心. 所以直接copy delphi7的代码过来就好了. 这下看着比较舒服了..
其实这个壳, 现在已经没有什么价值了. 甚至于我用VC8编译的程序加壳以后都没法跑..权当练手把.
文章作者 忆杰
上次更新 2012-09-07