首页
社区
课程
招聘
[原创]菜鸟手脱ACProtect v1.09
发表于: 2009-5-2 20:17 2086

[原创]菜鸟手脱ACProtect v1.09

2009-5-2 20:17
2086
自己下的ACProtect v1.09g加壳玩下
加的是vc6.0的程序。peid查看是AntiCrack Protector 1.0x -> RISCO Software Inc.
OEP很好找。
代码段---PE段---代码段下内存访问断就到了。
不过到了后有点偷代码,好在偷的不多,顺便补上就可以了。
004016A2    68 D8504000          PUSH CrackMe.004050D8
004016A7    68 00274000          PUSH CrackMe.00402700
004016AC    64:A1 00000000       MOV EAX,DWORD PTR FS:[0]
004016B2    50                   PUSH EAX
004016B3    64:8925 00000000     MOV DWORD PTR FS:[0],ESP
004016BA    83EC 58              SUB ESP,58
004016BD    53                   PUSH EBX

可根据堆栈中的值来补代码。所补的代码如下
push ebp
mov ebp,esp
push -1

当然IAT也加密了。老方法,dd 405000 内存写入断
可以到这里/*4173D3*/  MOV DWORD PTR DS:[EDI],EAX

就是eax覆盖了。单步跟踪一下可以知道正确的iat是从这得到的
/*417319*/  CALL DWORD PTR SS:[EBP+41C268]   //这里得到的 这是GetProcaddress
/*41731F*/  CMP EBX,DWORD PTR SS:[EBP+404028]  //这里改为jmp 4173D3

那么把下面的改成jmp 4173D3应该是可行的。
那就试试吧
he 417319
改完到oep后记得把偷代码补上就可以dumpfix了。
完了后发现不能运行。原来还有code replace
0040F0FB  - FF25 04701500        JMP DWORD PTR DS:[157004]
0040F101  - FF25 08701500        JMP DWORD PTR DS:[157008]
0040F107  - FF25 0C701500        JMP DWORD PTR DS:[15700C]
0040F10D  - FF25 10701500        JMP DWORD PTR DS:[157010]
0040F113  - FF25 14701500        JMP DWORD PTR DS:[157014]
0040F119  - FF25 18701500        JMP DWORD PTR DS:[157018]
---------------------------------华丽的分割线--------------------------------------
code replace的修复。
进行到这时我本来已经懒得去修复了。想把157004的区段给补上,虽然是拙劣的方式,但对于我这个菜鸟,
我以为首先能脱壳后正常运行起来是主要的。
可这是个低于00400000的地址,直接补区段是不行的。我试过在刚载入程序时首先申请低于400000地址的方法。
无奈对于这个壳好象不是很管用。因为我发现他是用GolbalAlloc来申请内存的。
具体为什么不行我还未弄明白。
怎么办呢,硬着头皮来修复code replace吧,也好锻炼下自己。

我点进一个JMP DWORD PTR DS:[157004]看了下。
原来正确的代码在这
00157FA6    8B55 08              MOV EDX,DWORD PTR SS:[EBP+8]
00157FA9    33C9                 XOR ECX,ECX
00157FAB    C3                   RET

一共6个字节,中间并没有什么花指令。还算温柔了。
而0040F0FB这里的JMP DWORD PTR DS:[157004]也是6个字节。
我就想,如果能把0040F0FB处的6个字节替换成正确的字节码不就OK了吗?

思路通了就开始干吧。
对0040F0FB进行内存写入断点吧。
断到这里了
00411D8B    66:C707 FF25         MOV WORD PTR DS:[EDI],25FF
00411D90    8947 02              MOV DWORD PTR DS:[EDI+2],EAX
00411D93    83C7 06              ADD EDI,6
00411D96    83C0 04              ADD EAX,4
00411D99  ^ E2 F0                LOOPD SHORT CrackMe.00411D8B

ds:[edi]中的代码此时正被替换为JMP DWORD PTR DS:[157004]这个样子。
从MOV WORD PTR DS:[EDI],25FF这句可以明显看出来。

可ds:[edi]中现在是什么东西呢?
经过我分析,发现ds:[edi]中的代码xor 了0xe0就变成正确的机器码了。
从这里可以分析出来的。

/*411D5F*/  MOV ECX,1770
/*411D64*/  LODS BYTE PTR DS:[ESI]
/*411D65*/  XOR AL,BL
/*411D67*/  STOS BYTE PTR ES:[EDI]

那么这就好办了。开始patch代码。
00411D8B          MOV WORD PTR DS:[EDI],25FF
从这里开始。首先这句改为jmp 429669
也就是跳到一个无用的地方吧。
然后在下面写如下代码
xor byte ptr ds:[edi],bl
xor byte ptr ds:[edi+1],bl
xor byte ptr ds:[edi+2],bl
xor byte ptr ds:[edi+3],bl
xor byte ptr ds:[edi+4],bl
xor byte ptr ds:[edi+5],bl
jmp 00411D93     //最后再跳回来

好了,这样patch代码就完了。
重新来过,把按前面所说的跳过iat加密,patch下代码,再补上那偷掉了一点代码。
就可以dumpfix了。
当然,很顺利运行成功。

//后记
这个壳对于我这个初学者感到还是有挑战性的。不过我很高兴我能独立解决,没有看其他的教程。
这点我感到很欣慰。另外就是脱壳确实挺好玩的,不管是老壳还是新壳,在暂时找不到其他娱乐方式的时候找点
老壳脱脱也能带给自己快乐的。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 2575
活跃值: (502)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
2
文章写的好,当把其当着乐趣的时候,估计一批壳要遭殃了
2009-5-2 21:13
0
游客
登录 | 注册 方可回帖
返回
//