先来个快速到达 OEP 方法,目的是让你先有点成功感,想了解为什么这么做,怎么知道要这么做的朋友可以看下面详细分析过程。
后面详细分析过程中我会用不同的方法来脱壳及修复,图文教程用了一种方法,动画中也略有不同,脚本中修复 IAT 又用了跟图文教程中也不一样的方法来修复 IAT。
OD 载入程序后在 00401000 断下个"设置内存写入断点",SHIFT + F9 中断后删除刚才的断点。
然后再下一条指令 POP ESI 上下 F2 断点,中断后删除 F2 断点再在 00401000 断下个"设置内存写入断点"。
中断后删除刚才的断点,因为是 C 或汇编写的程序,所以下 bp GetModuleHandleA 后 SHIFT + F9 4 次就到 OEP 了。
这里断在 00401007 处,真正的 OEP 应该是 00401000。
004059F2 > 55 PUSH EBP ; OD 载入后停在 EP 处
004059F3 8BEC MOV EBP,ESP
004059F5 83C4 F4 ADD ESP,-0C
004059F8 83C4 0C ADD ESP,0C
004059FB 50 PUSH EAX
004059FC EB 02 JMP SHORT 00405A00
004059FE 0000 ADD BYTE PTR DS:[EAX],AL
7C80AE40 kernel32.GetProcAddress 8BFF MOV EDI,EDI
7C80AE42 55 PUSH EBP
7C80AE43 8BEC MOV EBP,ESP
7C80AE45 51 PUSH ECX ; 断在这里
7C80AE46 51 PUSH ECX
7C80AE47 53 PUSH EBX
7C80AE48 57 PUSH EDI
00950AA3 33DB XOR EBX,EBX ; 返回到这里
00950AA5 60 PUSHAD
00950AA6 EB 03 JMP SHORT 00950AAB
00950AA8 EB 03 JMP SHORT 00950AAD
00950AAA C7 ??? ; 未知命令
00940B42 83C4 04 ADD ESP,4
00940B45 85D2 TEST EDX,EDX
00940B47 ^ 75 D6 JNZ SHORT 00940B1F
00940B49 61 POPAD
00940B1F F0:0FC7C8 LOCK CMPXCHG8B EAX ; 非法使用寄存器
00940B23 EB 03 JMP SHORT 00940B28
00940B25 EB 03 JMP SHORT 00940B2A
00940B27 C7 ??? ; 未知命令
009511D3 C40485 D275D661 LES EAX,FWORD PTR DS:[EAX*4+61D675D2]
009511DA 8B85 AD234000 MOV EAX,DWORD PTR SS:[EBP+4023AD]
009511E0 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX
009511E4 61 POPAD
009511E5 FFE0 JMP EAX ; 找到这里,在这句上下断
009511E7 60 PUSHAD
009511E8 8BF0 MOV ESI,EAX
009511EA 8BF9 MOV EDI,ECX
00970000 C7C7 72AFB4DF MOV EDI,DFB4AF72 ; 这下面可以一直 F8 大步走了
00970006 8D3D 5FBA581A LEA EDI,DWORD PTR DS:[1A58BA5F]
0097000C FFCF DEC EDI
0097000E 0FACF7 F2 SHRD EDI,ESI,0F2
00970012 0FBDFE BSR EDI,ESI
009707EB 8BFE MOV EDI,ESI
009707ED 19F7 SBB EDI,ESI
009707EF 6A 00 PUSH 0 ; 这里偷了 OEP 处的第一句的代码
009707F1 65:81E7 70E3980>AND EDI,398E370
009707F8 65:87FF XCHG EDI,EDI
009707FB F2: PREFIX REPNE:
00970C4A 69FE CB2BC651 IMUL EDI,ESI,51C62BCB
00970C50 85F7 TEST EDI,ESI
00970C52 F7C7 1CDC4C87 TEST EDI,874CDC1C
00970C58 81E7 43C67893 AND EDI,9378C643
00970C5E - E9 9F03A9FF JMP UnpackMe.00401002 ; 到 OEP 了
00970C63 0000 ADD BYTE PTR DS:[EAX],AL
00970C65 0000 ADD BYTE PTR DS:[EAX],AL
00970C67 0000 ADD BYTE PTR DS:[EAX],AL
00970C69 0000 ADD BYTE PTR DS:[EAX],AL
0012FF98 00000000
0012FF9C 00405A12 返回到 UnpackMe.00405A12 来自 UnpackMe.00405A36
0012FFA0 FFFFFFFF
0012FFA4 0012FFC0
00401002 E8 DB E8
00401003 F3 DB F3
00401004 0E DB 0E
00401005 00 DB 00
00401006 00 DB 00
00401007 A3 DB A3
00401008 4C DB 4C ; CHAR 'L'
00401009 36 DB 36 ; CHAR '6'
0040100A 40 DB 40 ; CHAR '@'
0040100B 00 DB 00
0040100C 6A DB 6A ; CHAR 'j'
0040100D 00 DB 00
0040100E 68 DB 68 ; CHAR 'h'
0040100F 66 DB 66 ; CHAR 'f'
00401010 10 DB 10
00401011 40 DB 40 ; CHAR '@'
00401012 00 DB 00
00401013 6A DB 6A ; CHAR 'j'
00401014 00 DB 00
00401015 68 DB 68 ; CHAR 'h'
00401000 6A 00 PUSH 0 ; 这里就是 OEP 了
00401002 E8 F30E0000 CALL 00401EFA
00401007 A3 4C364000 MOV DWORD PTR DS:[40364C],EAX
0040100C 6A 00 PUSH 0
0040100E 68 66104000 PUSH 00401066
00401013 6A 00 PUSH 0
00401015 68 00304000 PUSH 00403000 ; ASCII "TESTWIN"
0040101A FF35 4C364000 PUSH DWORD PTR DS:[40364C]
00401020 E8 750E0000 CALL 00401E9A
00401025 50 PUSH EAX
00401026 E8 C30E0000 CALL 00401EEE
0040102B C3 RETN
0040102C 8925 803D4000 MOV DWORD PTR DS:[403D80],ESP
00401032 68 F4344000 PUSH 004034F4 ; ASCII "Unpack started..."
00401037 E8 9B020000 CALL 004012D7
0040103C E8 A9060000 CALL 004016EA
009603C6 /EB 01 JMP SHORT 009603C9
009603C8 |C9 LEAVE
009603C9 \60 PUSHAD
009603CA 0F31 RDTSC
009603CC EB 01 JMP SHORT 009603CF
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)