自己下的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了。
当然,很顺利运行成功。
//后记
这个壳对于我这个初学者感到还是有挑战性的。不过我很高兴我能独立解决,没有看其他的教程。
这点我感到很欣慰。另外就是脱壳确实挺好玩的,不管是老壳还是新壳,在暂时找不到其他娱乐方式的时候找点
老壳脱脱也能带给自己快乐的。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!