【文章标题】: 手动脱ASProtect 1.23 RC4 - 1.3.08.24 [1] 发现偷了OEP
【作 者】: 八一小龙
【加壳方式】: ASProtect 1.23 RC4 - 1.3.08.24 [1]
【作者声明】: 只是感兴趣,没有其他目的。
--------------------------------------------------------------------------------
【详细过程】
拿到程序初查是ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov
用PEiD 的插件 VerA 1.5 查出结果 Version: ASProtect 1.23 RC4 - 1.3.08.24 [1]
载入停在。
00401000 > 68 01001502 PUSH game.02150001
00401005 E8 01000000 CALL game.0040100B
0040100A C3 RETN
0040100B C3 RETN
0040100C A6 CMPS BYTE PTR DS:[ESI],BYTE PTR ES:[EDI]
0040100D 8A47 6E MOV AL,BYTE PTR DS:[EDI+6E]
00401010 81F3 46DCA775 XOR EBX,75A7DC46
00401016 C6 ??? ; 未知命令
00401017 4E DEC ESI
00401018 307E E9 XOR BYTE PTR DS:[ESI-17],BH
0040101B CA D8AA RETF 0AAD8 ; 远返回
0040101E F4 HLT ; 特权命令
0040101F 5C POP ESP
00401020 51 PUSH ECX
00401021 44 INC ESP
00401022 B2 D5 MOV DL,0D5
一段 Shift + F9 到了我们要来的地方。
029239EC 3100 XOR DWORD PTR DS:[EAX],EAX
029239EE 64:8F05 00000000 POP DWORD PTR FS:[0]
029239F5 58 POP EAX
029239F6 833D B07E9202 00 CMP DWORD PTR DS:[2927EB0],0
029239FD 74 14 JE SHORT 02923A13
029239FF 6A 0C PUSH 0C
02923A01 B9 B07E9202 MOV ECX,2927EB0
02923A06 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
02923A09 BA 04000000 MOV EDX,4
02923A0E E8 2DD1FFFF CALL 02920B40
02923A13 FF75 FC PUSH DWORD PTR SS:[EBP-4]
02923A16 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
02923A19 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
02923A1C 8338 00 CMP DWORD PTR DS:[EAX],0
02923A1F 74 02 JE SHORT 02923A23
02923A21 FF30 PUSH DWORD PTR DS:[EAX]
02923A23 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
02923A26 FF75 EC PUSH DWORD PTR SS:[EBP-14]
02923A29 C3 RETN
02923A2A 5F POP EDI
02923A2B 5E POP ESI
02923A2C 5B POP EBX
02923A2D 8BE5 MOV ESP,EBP
02923A2F 5D POP EBP
02923A30 C3 RETN
02923A31 8D40 00 LEA EAX,DWORD PTR DS:[EAX]
02923A34 B8 847E9202 MOV EAX,2927E84
然后在02923A29 RETN处F2,再Shift + F9
看右下角堆栈。
0012FF5C 02935514
0012FF60 00400000 game.00400000
0012FF64 F848C6F0
0012FF68 0012FFA4
0012FF6C 02910000
就是他了0012FF68 在 命令里输入
hr 0012FF68,
取消02923A29处的断点,再 F9。
太顺利了,程序停在02935633。
02935633 EB 44 JMP SHORT 02935679
02935635 EB 01 JMP SHORT 02935638
02935637 9A 51579CFC BF00 CALL FAR 00BF:FC9C5751 ; 远调用
0293563E 0000 ADD BYTE PTR DS:[EAX],AL
02935640 00B9 00000000 ADD BYTE PTR DS:[ECX],BH
02935646 F3:AA REP STOS BYTE PTR ES:[EDI]
02935648 9D POPFD
02935649 5F POP EDI
0293564A 59 POP ECX
0293564B C3 RETN
0293564C 55 PUSH EBP
0293564D 8BEC MOV EBP,ESP
0293564F 53 PUSH EBX
02935650 56 PUSH ESI
02935651 8B75 0C MOV ESI,DWORD PTR SS:[EBP+C]
02935654 8B5D 08 MOV EBX,DWORD PTR SS:[EBP+8]
02935657 EB 11 JMP SHORT 0293566A
02935659 0FB703 MOVZX EAX,WORD PTR DS:[EBX]
0293565C 03C6 ADD EAX,ESI
0293565E 83C3 02 ADD EBX,2
02935661 8BD0 MOV EDX,EAX
一直F8下去。
029356E0 52 PUSH EDX ; ntdll.KiFastSystemCallRet
029356E1 EB 02 JMP SHORT 029356E5
029356E3 CD 20 INT 20
029356E5 0BD3 OR EDX,EBX
029356E7 65:EB 01 JMP SHORT 029356EB ; 多余的前缀
029356EA F2: PREFIX REPNE: ; 多余的前缀
029356EB 1BD6 SBB EDX,ESI
029356ED EB 02 JMP SHORT 029356F1
029356EF CD 20 INT 20
029356F1 F3: PREFIX REP: ; 多余的前缀
029356F2 EB 02 JMP SHORT 029356F6
029356F4 CD 20 INT 20
029356F6 8D96 8CDEAC04 LEA EDX,DWORD PTR DS:[ESI+4ACDE8C]
029356FC F2: PREFIX REPNE: ; 多余的前缀
029356FD EB 01 JMP SHORT 02935700
029356FF 9A F3EB02CD 206A CALL FAR 6A20:CD02EBF3 ; 远调用
02935706 A9 EB02CD20 TEST EAX,20CD02EB
0293570B C74424 00 FC5693>MOV DWORD PTR SS:[ESP],29356FC
02935713 5A POP EDX
02935714 FF52 1C CALL DWORD PTR DS:[EDX+1C]
02935717 F3: PREFIX REP: ; 多余的前缀
02935718 1E PUSH DS
02935719 57 PUSH EDI
到了这里要F7进去
029356FF 9A F3EB02CD 206A CALL FAR 6A20:CD02EBF3 ; 远调用
再跟一段路到了0293572B
02935722 335424 00 XOR EDX,DWORD PTR SS:[ESP]
02935726 5A POP EDX
02935727 65:EB 01 JMP SHORT 0293572B ; 多余的前缀
0293572A C7 ??? ; 未知命令
0293572B 55 PUSH EBP
0293572C 8BEC MOV EBP,ESP
0293572E 6A FF PUSH -1
02935730 68 C00E5E00 PUSH 5E0EC0
02935735 68 3CF85600 PUSH 56F83C
0293573A 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
02935740 65:EB 01 JMP SHORT 02935744 ; 多余的前缀
02935743 C7 ??? ; 未知命令
02935744 50 PUSH EAX
02935745 64:8925 00000000 MOV DWORD PTR FS:[0],ESP
0293574C 83EC 58 SUB ESP,58
0293574F 65:EB 01 JMP SHORT 02935753 ; 多余的前缀
02935752 C7 ??? ; 未知命令
02935753 53 PUSH EBX
02935754 65:EB 01 JMP SHORT 02935758 ; 多余的前缀
02935757 C7 ??? ; 未知命令
02935758 56 PUSH ESI
02935759 65:EB 01 JMP SHORT 0293575D ; 多余的前缀
0293575C C7 ??? ; 未知命令
0293575D 57 PUSH EDI
0293575E 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
02935761 64:EB 02 JMP SHORT 02935766 ; 多余的前缀
02935764 CD 20 INT 20
02935766 64:EB 01 JMP SHORT 0293576A ; 多余的前缀
02935769 F2: PREFIX REPNE: ; 多余的前缀
0293576A 68 FDF45600 PUSH 56F4FD
0293576F 68 35569302 PUSH 2935635
02935774 C3 RETN
02935775 0000 ADD BYTE PTR DS:[EAX],AL
02935777 0000 ADD BYTE PTR DS:[EAX],AL
02935779 0000 ADD BYTE PTR DS:[EAX],AL
好像就是被偷走的代码啊。继续F8往下走,很轻松就来到了0056F4FD。
0056F4FD FF15 2CC25D00 CALL DWORD PTR DS:[5DC22C]
0056F503 33D2 XOR EDX,EDX
0056F505 8AD4 MOV DL,AH
0056F507 8915 B0F11302 MOV DWORD PTR DS:[213F1B0],EDX
0056F50D 8BC8 MOV ECX,EAX
0056F50F 81E1 FF000000 AND ECX,0FF
0056F515 890D ACF11302 MOV DWORD PTR DS:[213F1AC],ECX
0056F51B C1E1 08 SHL ECX,8
0056F51E 03CA ADD ECX,EDX
0056F520 890D A8F11302 MOV DWORD PTR DS:[213F1A8],ECX
向上拖一下,呵呵,开心了。
0056F4D4 5B POP EBX
0056F4D5 C9 LEAVE
0056F4D6 C3 RETN
0056F4D7 0000 ADD BYTE PTR DS:[EAX],AL
0056F4D9 0000 ADD BYTE PTR DS:[EAX],AL
0056F4DB 0000 ADD BYTE PTR DS:[EAX],AL
0056F4DD 0000 ADD BYTE PTR DS:[EAX],AL
0056F4DF 0000 ADD BYTE PTR DS:[EAX],AL
0056F4E1 0000 ADD BYTE PTR DS:[EAX],AL
0056F4E3 0000 ADD BYTE PTR DS:[EAX],AL
0056F4E5 0000 ADD BYTE PTR DS:[EAX],AL
0056F4E7 0000 ADD BYTE PTR DS:[EAX],AL
0056F4E9 0000 ADD BYTE PTR DS:[EAX],AL
0056F4EB 0000 ADD BYTE PTR DS:[EAX],AL
0056F4ED 0000 ADD BYTE PTR DS:[EAX],AL
0056F4EF 0000 ADD BYTE PTR DS:[EAX],AL
0056F4F1 0000 ADD BYTE PTR DS:[EAX],AL
0056F4F3 0000 ADD BYTE PTR DS:[EAX],AL
0056F4F5 0000 ADD BYTE PTR DS:[EAX],AL
0056F4F7 0000 ADD BYTE PTR DS:[EAX],AL
0056F4F9 0000 ADD BYTE PTR DS:[EAX],AL
0056F4FB 0000 ADD BYTE PTR DS:[EAX],AL
0056F4FD FF15 2CC25D00 CALL DWORD PTR DS:[5DC22C]
0056F503 33D2 XOR EDX,EDX
0056F505 8AD4 MOV DL,AH
0056F507 8915 B0F11302 MOV DWORD PTR DS:[213F1B0],EDX
0056F50D 8BC8 MOV ECX,EAX
0056F50F 81E1 FF000000 AND ECX,0FF
将0056F4D7设为新EIP,后面修复就不演示了。
现在的问题在。0056F4D7-0056F4FC这段代码怎么填呢?
授人鱼不如授人以渔嘛。所以我希望大家可以告诉我,该怎么还原,谢谢各位了。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!