![]() |
来源:安全中国 |
【脱文作者】 simonzh2000 【使用工具】 Peid0.91, Ollydbg1.09d(反Antidbg版), ImportREC1.60, LordPE, UltraEdit 【破解平台】 Win2000 【软件名称】 XieXie Master 1.0.10 【软件简介】 一个法国人的电脑中国象棋,棋力超强,接近大师级水平 【软件大小】 877K 【加壳方式】 ACProtect, 使用 Embedded Protect 和 RSA Protect 技术 【破解声明】 在春节前拿到这个软件时,我还是一个脱壳菜鸟, 连 UPX 手动脱壳也不会, 这种加密壳就别提了, 只好上论坛向各位大侠请教. 感谢 heXer , jingulong, fly 等多位大侠的帮助, 帮我脱了壳, 尤其是 heXer 大侠, 还帮我成功破解, 但遗憾的是都没写脱壳笔记. 俺只好自己动手尝试, 春节的时候我看了 DFCG 的 13篇手动脱壳入门教程, 11篇手动脱壳进价教程, 总算有点进步了, 感谢 DFCG 的各位大侠. 下面是我的一点心得,愿与大家分享, 同时有许多问题向大家请教. 本笔记只用于学习交流. 未脱壳原程序 http://tongtian.net/pediybbs/viewtopic.php?t=3336 用peid查壳,UPX 0.89.6 - 1.02 / 1.05 - 1.24 DLL -> Markus & Laszlo. 但 EP Section 可见到 Perplex, ACProtect的特征, 有Stolen Code. OD 异常设置不忽略异常,载入程序,用插件隐藏OD。 77FA144C C3 RETN ; // 系统断点, F9运行 77FA144D > CC INT3 77FA144E C3 RETN // 出来一个 "No License" 警告, 由于 ACP 有RSA保护, 我们没有Key.dat, 点OK后, INT3 异常 008EBC4B 90 NOP ; // 第1次 INT3 异常, Shift+F9 008EBC4C 64:67:8F06 0000 POP DWORD PTR FS:[0] 008EB9F9 CD 01 INT 1 ; // 第2次 内寸访问异常, SEH=008EB9DD 008EB9FB 40 INC EAX ; // 异常处理完毕继续. 这里下断, SHIFT+F9, 取消断点 008EB9FC 40 INC EAX //再来个内寸镜像断点 Memory map, item 12 Address=00401000 Size=000B2000 (729088.) Owner=XieXieMa 00400000 Section=.text Contains=code Type=Imag 01001002 Access=R Initial access=RWE //F9, 断在下面, OEP 就在附近 00495FAD 68 B07B4B00 PUSH XieXieMa.004B7BB0 00495FB2 68 50C04900 PUSH XieXieMa.0049C050 00495FB7 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 00495FBD 50 PUSH EAX 00495FBE 64:8925 0000000>MOV DWORD PTR FS:[0],ESP // 495FAD 前面5个字节是 6D 1D 4C A0 E6 // 根据经验猜测 Stolen Byte 如下 // 如果各位大侠有更好的办法, 请指点 00495F9D A1 B4687F00 MOV EAX,DWORD PTR DS:[7F68B4] 00495FA2 A3 B0687F00 MOV DWORD PTR DS:[7F68B0],EAX 00495FA7 C3 RETN 00495FA8 55 PUSH EBP ; // OEP=495FA8 00495FA9 8BEC MOV EBP,ESP 00495FAB 6A FF PUSH -1 00495FAD 68 B07B4B00 PUSH XieXieMa.004B7BB0 00495FB2 68 50C04900 PUSH XieXieMa.0049C050 // 用OD插件Dump 得到 cx1.EXE, 不要重建 IAT, OEP = 95FA8 // 重新运行XXM, 用 ImportREC 跟踪方式3 修复IAT, 得到CX2.EXE // 运行出错, 用OD加载 CX2.EXE, 用 Trace into, 很容易跟踪到出错的地方 // Trace into 时不要跟进系统函数, 设置一下 00499EBA E8 DA020000 CALL cx2.0049A199 00499EBF 59 POP ECX 00499EC0 E8 18424400 CALL cx2.008DE0DD ; // 这里是第一个出错的地方 00499EC5 8B43 10 MOV EAX,DWORD PTR DS:[EBX+10] 00499EC8 8338 FF CMP DWORD PTR DS:[EAX],-1 00499ECB 75 07 JNZ SHORT cx2.00499ED4 00499ECD 33C0 XOR EAX,EAX 00499ECF E9 0F020000 JMP cx2.0049A0E3 00499ED4 891D 6C667F00 MOV DWORD PTR DS:[7F666C],EBX 00499EDA E8 FE414400 CALL cx2.008DE0DD ; // 又一个 CALL cx2.008DE0DD 00499EDF 83FA FF CMP EDX,-1 00499EE2 8955 FC MOV DWORD PTR SS:[EBP-4],EDX 00499EE5 74 14 JE SHORT cx2.00499EFB 00499EE7 8B8C90 C4000000 MOV ECX,DWORD PTR DS:[EAX+EDX*4+C4] 00499EEE 8B7C90 44 MOV EDI,DWORD PTR DS:[EAX+EDX*4+44] 00499EF2 E8 E6414400 CALL cx2.008DE0DD ; // 一共有 1000 多个, 都调用壳里的代码 //重新来过, bp 499EC0, F9断下, F7 进入壳代码, 记住返回地址 499EC5 008DE0DD 60 PUSHAD 008DE0DE FC CLD 008DE0DF F9 STC 008DE0E0 50 PUSH EAX // 接下来有一大段花指令, SMC, 循环 // 按住 F7 不放, 循环用F4, 到这里 008DE28D 8B4424 20 MOV EAX,DWORD PTR SS:[ESP+20] ; // 取出返回地址 , 第一次是499EC5 008DE291 33C9 XOR ECX,ECX ; // ECX=0 008DE293 8B9C8D B3234000 MOV EBX,DWORD PTR SS:[EBP+ECX*4+4023B3] ; // 这里放返回地址 RVA 008DE29A 039D 7BCF4000 ADD EBX,DWORD PTR SS:[EBP+40CF7B] ; // RVA+400000=VA 008DE2A0 3BC3 CMP EAX,EBX ; // 匹配吗? 008DE2A2 74 07 JE SHORT cx2.008DE2AB |