|
壳 自己记录2.......
|
脱壳tmd. 先跑脚本判断一下版本。 然后改nooby的脚本。 themida & wl iat repair by nooby tmd_iat.osc ------------------------------------------------------- gmemi eip,MEMORYBASE msg $RESULT
// FIRST TMD/WL SECTION IN THE TARGET mov tmdbase, 008b5000 //把这里改一下。
然后跑脚本。 跑完后 停在这。 /*408358*/ PUSH EBX /*408359*/ MOV EBX,EAX /*40835B*/ XOR EAX,EAX /*40835D*/ MOV DWORD PTR DS:[76A0CC],EAX /*408362*/ PUSH 0 ----------------------------------------- dump后,上uif.选上 fix directly imports---->start----> 接着上ImportREC oep===8358 rva和大小 在uif里找。然后修复转储即可了。 ---------------------------------------------------------------------
偷代码了 还得修复。 http://www.unpack.cn/viewthread.php?tid=22871 这个是delphi的修复 好像很麻烦 ---------------------------------------------------------------------------------------------------------------------------------------- 脱 ASProtect 1.2x - 1.3x [Registered] -> Alexey Solodovnikov 用下面这个脚本。 Aspr2.XX_unpacker_v1.15SC.osc 先配置一下。用odbgScript1.65跑一遍,会提示有偷代码,其实已经补好了。并dump一个de_xxxx.exe.然后根据日志用ImportREC修复一下即可。 ----------------------------------------------------------------------------------------------------------- 自己下的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了。 当然,很顺利运行成功。
//后记 这个壳对于我这个初学者感到还是有挑战性的。不过我很高兴我能独立解决,没有看其他的教程。 这点我感到很欣慰。另外就是脱壳确实挺好玩的,不管是老壳还是新壳,在暂时找不到其他娱乐方式的时候找点 老壳脱脱也能带给自己快乐的。
http://www.kyospace.com/feedcomm.asp?logID=320 |