我还是使用delphi7的例子..首先上来还是找OEP.. 这个OEP被偷的很过分啊, 如果不是使用退出法找到OEP.. 估计其他类似的程序够呛..

当然这个壳的话, 基本上也没有什么难度, 主要难度还是集中在Code Replace, 脱壳很容易, 这个壳没有合并程序的区段, 很容易还原成完整的区段, 另外这个壳没有将IAT加密, IAT也可以很轻易的就dump一份出来.

首先Ollydbg跑起来, 在idata断下断点, 一般这时候就是填写IAT的地方. 同时可以得到一个信息就是Code段已经解压的差不多了. 在idata断下来以后, 我们需要做的事情全部都在这里了.. 在断点下面一点点, 就是这个代码.

1
2
3
4
5
6
7
0046C298 8BF3     mov esi, ebx
0046C29A 8BFB     mov edi, ebx
0046C29C AC       lods byte ptr [esi]
0046C29D C0C0 03  rol al, 3
0046C2A0 AA stos  byte ptr es:[edi] ; 解密导入DLL的名称
0046C2A1 803F 00  cmp byte ptr [edi], 0
0046C2A4 ^ 75 F6  jnz short delphi71.0046C29C

是的, 这里就是解密要导入DLL的名称.. 然后在下面一点点

1
2
3
4
5
6
0046C2F7 60     pushad
0046C2F8 2BC0   sub eax, eax
0046C2FA 8803   mov byte ptr [ebx], al ; 将导入DLL的名称清空
0046C2FC 43     inc ebx
0046C2FD 3803   cmp byte ptr [ebx], al
0046C2FF ^ 75 F9 jnz short delphi71.0046C2FA

有将导入DLL的名称清空, 太猥琐了,直接nop.完了之后是这里解密函数名称字符串.

1
2
3
4
5
6
0046C356 8BF3   mov esi, ebx
0046C358 8BFB   mov edi, ebx
0046C35A AC     lods byte ptr [esi] ; 这里是解密函数名称
0046C35B C0C0 03 rol al, 3
0046C35E AA     stos byte ptr es:[edi]
0046C35F 803F 00 cmp byte ptr [edi], 0

同样有一个地方在将这个字符串清空..猥琐之极.nop掉.

1
2
3
4
5
6
7
0046C39F 60   pushad
0046C3A0 2BC0 sub eax, eax
0046C3A2 8803 mov byte ptr [ebx], al ;将导入函数名称清空.
0046C3A4 43   inc ebx
0046C3A5 3803 cmp byte ptr [ebx], al
0046C3A7 ^ 75 F9 jnz short delphi71.0046C3A2
0046C3A9 61   popad

再下面这里是有对一些特殊函数特殊照顾的, 比如MessageBoxA什么的.这里我们也可以nop掉.

1
2
3
4
5
6
7
8
0046C3B2 3B85 18104100 cmp eax, dword ptr [ebp+411018] ;user32.MessageBoxA
0046C3B8 74 20 je short delphi71.0046C3DA

 ```

这样就舒服了. 当然这样的函数有好几个, 注意观察下. 连续着的, 都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编译的程序加壳以后都没法跑..权当练手把.