【软件名称】:forgot的unpackme 1.7
【下载地址】:见附件,
Forgot的unpackme 1.7的简单脱壳
。【脱壳声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
【操作系统】:winxp
【脱壳工具】:OD等传统工具
———————————————————————————————————————————
【脱壳过程】:
forgot的unpackme 1.7 和pack v0.1.6的变化不大,只是加了IAT简单加密。另外和1.6一样加了入口代码修改,但修改字节并不多。
如果看过我脱015版和016版的文章,那么可以省略相关的章节。
第一步,找d-process处:
用OD载入程序,忽略所有异常,bp WriteProcessMemory,F9运行程序,断下:
77E41A94 > 55 PUSH EBP////断下。
77E41A95 8BEC MOV EBP,ESP
77E41A97 51 PUSH ECX
77E41A98 51 PUSH ECX
77E41A99 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
77E41A9C 53 PUSH EBX
观察堆栈数据:
0032797C 0032B349 /CALL 到 WriteProcessMemory 来自 0032B344
00327980 00000034 |hProcess = 00000034
00327984 0032CA56 |Address = 32CA56////重要!记下备用。
00327988 0032C3C5 |Buffer = 0032C3C5
0032798C 0000029A |BytesToWrite = 29A (666.)////重要!记下备用。
00327990 00000000 pBytesWritten = NULL
好,F9直接运行程序,等出现界面时,运行LordPE选中映像文件小的那个进程,然后部分DUMP,把从32CA56处开始大小为29A的数据DUMP下来,命名为32CA56.bin。
第二步,变双进程为单进程:
重新载入程序,bp CreateProcessA,运行程序,断下:
77E41BBC > 55 PUSH EBP////断在这儿。
77E41BBD 8BEC MOV EBP,ESP
77E41BBF 6A 00 PUSH 0
77E41BC1 FF75 2C PUSH DWORD PTR SS:[EBP+2C]
77E41BC4 FF75 28 PUSH DWORD PTR SS:[EBP+28]
77E41BC7 FF75 24 PUSH DWORD PTR SS:[EBP+24]
观察堆栈数据:
00327968 0032A22C /CALL 到 CreateProcessA 来自 0032A227
0032796C 00328F99 |ModuleFileName = "C:Documents and Settingscsjwaman桌面\1.71.7.exe"
00327970 0032A21D |CommandLine = "X"////调试标志。
00327974 00000000 |pProcessSecurity = NULL
00327978 00000000 |pThreadSecurity = NULL
0032797C 00000000 |InheritHandles = FALSE
00327980 00000003 |CreationFlags = DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS
00327984 00000000 |pEnvironment = NULL
00327988 00000000 |CurrentDir = NULL
0032798C 00327CF4 |pStartupInfo = 00327CF4
00327990 00327CE4 pProcessInfo = 00327CE4
重新载入程序,bp GetCommandLineA,运行程序,断下:
77E5E358 > A1 1476EB77 MOV EAX,DWORD PTR DS:[77EB7614]////断在这里。取消断点。
77E5E35D C3 RETN////返回。
返回到:
0032837C 68 9F6F56B6 PUSH B6566F9F
00328381 50 PUSH EAX
00328382 E8 5D000000 CALL 003283E4
00328387 EB FF JMP SHORT 00328388
00328389 71 78 JNO SHORT 00328403
0032838B C2 5000 RETN 50
0032838E ^ EB D3 JMP SHORT 00328363
00328390 5B POP EBX
00328391 F3: PREFIX REP: ; 多余的前缀
搜索二进制字符“803e58”,找到:
00328617 ^71 EB JNO SHORT 00328604
00328619 ^ EB FA JMP SHORT 00328615
0032861B ^ EB 80 JMP SHORT 0032859D/////找到这里,
电脑资料
《Forgot的unpackme 1.7的简单脱壳》(https://www.unjs.com)。这里有个花指令。0032861D 3E:58 POP EAX
0032861F 0F84 8A410000 JE 0032C7AF
00328625 68 9F6F56B6 PUSH B6566F9F
0032862A 50 PUSH EAX
0032862B E8 5D000000 CALL 0032868D
00328630 EB FF JMP SHORT 00328631
NOP掉花指令后:
0032861B 90 NOP
0032861C 803E 58 CMP BYTE PTR DS:[ESI],58////58为调试标志。用于判断是否为子进程。
0032861F 0F84 8A410000 JE 0032C7AF////此处改为JMP!可以变为单进程。
00328625 68 9F6F56B6 PUSH B6566F9F
0032862A 50 PUSH EAX
0032862B E8 5D000000 CALL 0032868D
00A19217 90 NOP
00A19218 803E 58 CMP BYTE PTR DS:[ESI],58
00A1921B 0F84 CA3F0000 JE 00A1D1EB
00A19221 68 9F6F56B6 PUSH B6566F9F
00A19226 50 PUSH EAX
00A19227 E8 5D000000 CALL 00A19289
第三步,修补程序:
修改上面这个跳转后,用十六进制工具把32CA56.bin的数据复盖掉OD的DUMP区从0032CA56处开始的29A个字节数据。
第四步,查找入口:
做完上述工作后,在OD的CPU窗口,Ctrl+G,输入0032CA56,点确定后来到:
0032CA4D ^71 EB JNO SHORT 0032CA3A
0032CA4F ^ EB FA JMP SHORT 0032CA4B
0032CA51 ^ EB F0 JMP SHORT 0032CA43////NOP掉。
0032CA53 0FC7C8 CMPXCHG8B EAX////NOP掉。
0032CA56 FFC3 I