// 解决办法,用 UltraEdit 打开CX3.EXE, 找到 08 47 13 00, (只有一处) // 改成 93 12 8E 00, 叫他就地解密, 嘿嘿.
// 用 OD 载入CX3.EXE还是出错, Shit, Trace into again, 这次时间要1分钟吧 // 错在 414272 CALL MessageBoxA 处 // 难道是 IAT 修复的有问题? 检查了半天, 也没有搞定. // 再仔细看看 Trace into 的记录, 00414044 ---> 00414272
// 用OD 载入未脱壳原程序, 先到OEP 495FAD // bp 414044, F9, 断下, F7走 // 又是一大段花指令, SMC , 循环,
00414044
004141FC 83C4 04 ADD ESP,4 004141FF 66:81F1 D343 XOR CX,43D3 00414204 F8 CLC 00414205 4E DEC ESI 00414206 ^ 0F85 88FFFFFF JNZ XieXieMa.00414194 ; // 循环 0041420C E8 01000000 CALL XieXieMa.00414212 ; // F4 到这里
00414212 83C4 04 ADD ESP,4 00414215 E9 04000000 JMP XieXieMa.0041421E 0041421A 66:BB 1EBA MOV BX,0BA1E 0041421E 61 POPAD 0041421F 8D4D C0 LEA ECX,DWORD PTR SS:[EBP-40] 00414222 6A 03 PUSH 3 00414224 E8 8F3FFFFF CALL XieXieMa.004081B8 ; // F8 00414229 C745 FC 0000000>MOV DWORD PTR SS:[EBP-4],0 00414230 8D4D C0 LEA ECX,DWORD PTR SS:[EBP-40] 00414233 6A 01 PUSH 1 00414235 E8 F640FFFF CALL XieXieMa.00408330 ; // F8 0041423A 8D4D C0 LEA ECX,DWORD PTR SS:[EBP-40] 0041423D 68 A8717F00 PUSH XieXieMa.007F71A8 ; ASCII "XieXieMaster 1.0.10" 00414242 68 A0717F00 PUSH XieXieMa.007F71A0 ; ASCII "XieXie" 00414247 E8 2441FFFF CALL XieXieMa.00408370 ; // F8 0041424C 6A 10 PUSH 10 0041424E FF15 B8544B00 CALL DWORD PTR DS:[4B54B8] ; // F8, 脱壳后是 GetAsyncKeyState 00414254 0FBFC0 MOVSX EAX,AX 00414257 85C0 TEST EAX,EAX 00414259 0F8C D5010000 JL XieXieMa.00414434 0041425F C705 041B4C00 0>MOV DWORD PTR DS:[4C1B04],0 00414269 60 PUSHAD 0041426A 6A 02 PUSH 2 0041426C 6A 00 PUSH 0 0041426E 6A 00 PUSH 0 00414270 6A FF PUSH -1 00414272 FF15 C4544B00 CALL DWORD PTR DS:[4B54C4] ; XieXieMa.008DDB6D, 这里脱壳后成了 MessageBoxA, // 但未脱壳程序不是, F7 进去看看, 发现来到了壳代码,奇怪???
008E951E 60 PUSHAD 008E951F F8 CLC 008E9520 7A 03 JPE SHORT XieXieMa.008E9525 008E9522 7B 01 JPO SHORT XieXieMa.008E9525 008E9524 7A D3 JPE SHORT XieXieMa.008E94F9
// 请看 Acprotect.h (附件中), 各位看官就会明白的... // 原来这个程序使用了 ACProtect 的 EMbedded protector 技术 // 该技术具体见 Acprotect 的帮助 // 我的解决办法, 再次修改 008DD000 代码, 如下, 也去调用壳代码
008DD000 > B8 1E958E00 MOV EAX,008E951E 008DD005 8705 C4544B00 XCHG DWORD PTR DS:[<&user32.MessageBoxA>],EAX 008DD00B - E9 988FBBFF JMP 00495FA8
// CX3.EXE 终于可以运行了, 不过别高兴得太早. // 只要你一走棋, 或点注册, game over... // 用OD 载入CX3.EXE , F9运行, 点注册"OK", 出错
008E9E5C 8BCE MOV ECX,ESI 008E9E5E 8BB48D EC1B4000 MOV ESI,DWORD PTR SS:[EBP+ECX*4+401BEC] 008E9E65 03B5 7BCF4000 ADD ESI,DWORD PTR SS:[EBP+40CF7B] 008E9E6B 8B948D 7C1D4000 MOV EDX,DWORD PTR SS:[EBP+ECX*4+401D7C] 008E9E72 8BBC8D 0C1F4000 MOV EDI,DWORD PTR SS:[EBP+ECX*4+401F0C] 008E9E79 87CA XCHG EDX,ECX 008E9E7B F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] ; // 内寸访问错误 008E9E7D 60 PUSHAD
// 这时 ECX=3445, ESI=004090AF, EDI=00142348 // 出错的地方从 004090AF 拷贝 3445 字节到 00142348 // 到内存镜像一看
Memory map, item 4 Address=00130000 Size=0000B000 (45056.) Owner= 00130000 (itself) Section= Type=Priv 00021004 Access=RW Initial access=RW
// 程序只对 130000 到 13B000-1 有读写权限, 不能访问 00142348 // 跟踪未脱壳原程序, Size=0001C000 // 那我们就在有读写权限的地方加点空间
// 用LordPE 打开 CX3.EXE, 修改 .mackt 段的 VSize 为 10000, 原来 2000, // .mackt 的 VA = 00903000 // 新加空间对应的 VA = 00905000
// 用 UltraEdit 打开CX3.EXE, 找到 48 23 14 00, (只有一处) // 注意前面还有 0013BC40, 0013EF78, 不清楚用处, 一并修改 // 改成 00 50 90 00 ,00 90 90 00, 00 D0 90 00
// 呵呵, 现在再点注册, 弹出一个"Incorret Register Code"的对话框 // 跟未脱壳原程序一样了.
// 这里我还发现了一个Bug (或许就是这样设计的) // 你一走棋, 叫你注册, 你点OK, "Incorrect Register code", 你再走棋 // 几次反复后, 程序出错, 一开始以为脱壳不对, 后来试了原程序也是这样.
// 下面开始暴破, 对 MessageBoxA 下断
// 第一个关键比较 // 注册对话框, 点注册, 断在 4A5232, 看看STACK
0012F9DC 001A0146 |hOwner = 001A0146 (’XieXieMaster 1.0.10> Unregist...’,class=’AfxFrameOrView42s’) 0012F9E0 007FE5AC |Text = "Incorrect registration code !" 0012F9E4 007FCE3C |Title = "XieXie Error" 0012F9E8 00000030 \Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL 0012F9EC 0012FB60 0012F9F0 00418FED RETURN to cx3.00418FED from cx3.004A520A 0012F9F4 007FE5AC ASCII "Incorrect registration code !" 0012F9F8 007FCE3C ASCII "XieXie Error" 0012F9FC 00000030
上一页 1 2 3 4 下一页 |