参照simonzh2000[US]的脱文脱壳,但不知道操作步骤,请simonzh2000[US]或各位大侠指点!谢谢!
按照脱文操作可以到OEP,但接下来不知该怎么办?具体如下:
00499780 55 PUSH EBP // 到这里下断, F9, 下面修复 IAT (问题一:这里可以先dump下来吗?修复IAT要不要OD重新载入加密程序?)
00499781 8BEC MOV EBP,ESP
00499783 83C4 F0 ADD ESP,-10
00499786 B8 98954900 MOV EAX,EncryptP.00499598
0049978B E8 D4D3F6FF CALL EncryptP.00406B64
// 往下找找, 发现程序里有很多这样的东西 (这一步是接上面的操作吗?)
00406AA0 90 NOP
00406AA1 - E9 8A70A000 JMP 00E0DB30
00406AA6 8BC0 MOV EAX,EAX
00406AA8 90 NOP
00406AA9 - E9 E26FA000 JMP 00E0DA90
00406AAE 8BC0 MOV EAX,EAX
00406AB0 90 NOP
00406AB1 - E9 4670A000 JMP 00E0DAFC
00406AB6 8BC0 MOV EAX,EAX
00406AB8 90 NOP
00406AB9 - E9 1270A000 JMP 00E0DAD0
00406ABE 8BC0 MOV EAX,EAX
// API
00406AA0 90 NOP
00406AA1 - E9 EE71A000 JMP 00E0DC94 (问题二:这里是要修改吗?需要OD重新载入程序吗?
...
7119D2FD 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C] // 如果JMP E0DC94
7119D301 89C3 MOV EBX,EAX // 那么 EAX=E0DC99
7119D303 83C0 02 ADD EAX,2
7119D306 8B00 MOV EAX,DWORD PTR DS:[EAX]
7119D308 8B00 MOV EAX,DWORD PTR DS:[EAX]
7119D30A 31D8 XOR EAX,EBX
7119D30C 894424 0C MOV DWORD PTR SS:[ESP+C],EAX // EAX 即 API
7119D310 8B00 MOV EAX,DWORD PTR DS:[EAX]
7119D312 3C CC CMP AL,0CC // 检查1
7119D314 74 14 JE SHORT V1200351.7119D32A
7119D316 80FC CC CMP AH,0CC // 检查2
7119D319 74 0F JE SHORT V1200351.7119D32A
7119D31B C1E8 10 SHR EAX,10
7119D31E 3C CC CMP AL,0CC // 检查3
7119D320 74 08 JE SHORT V1200351.7119D32A
7119D322 80FC CC CMP AH,0CC // 检查4
7119D325 74 03 JE SHORT V1200351.7119D32A
7119D327 EB 08 JMP SHORT V1200351.7119D331
7119D329 - E9 C60554F6 JMP 676DD8F4
7119D32E 1B71 01 SBB ESI,DWORD PTR DS:[ECX+1]
7119D331 5B POP EBX
7119D332 58 POP EAX
7119D333 9D POPFD
7119D334 C3 RETN
// 上面就是壳解密 API 的过程
// 写一段恢复 API 的补丁程序, 放到 7119CF60 (问题三:是什么时候把下面的补丁程序加入?需要OD重新载入程序吗?)
7119CF60 60 PUSHAD
7119CF61 B8 50124000 MOV EAX,401250 ; // 搜索从 401250 开始
7119CF66 BA 00000101 MOV EDX,1010000 ; // 把 API 放到 1010000 开始的空闲区域
7119CF6B 66:8138 90E9 CMP WORD PTR DS:[EAX],0E990 ; // 90 E9 = NOP, JMP XXXXXXX
7119CF70 0F85 2F000000 JNZ V1200351.7119CFA5
7119CF76 8BC8 MOV ECX,EAX ; // [EAX] is 90 E9
7119CF78 8B40 02 MOV EAX,DWORD PTR DS:[EAX+2] ; // EAX = XXXXXXXX
7119CF7B 03C1 ADD EAX,ECX
7119CF7D 83C0 06 ADD EAX,6
7119CF80 3D 00000070 CMP EAX,70000000 ; // > 7000 0000 就是 API
7119CF85 0F87 0E000000 JA V1200351.7119CF99
7119CF8B 83C0 05 ADD EAX,5
7119CF8E 8BD8 MOV EBX,EAX
7119CF90 83C0 02 ADD EAX,2
7119CF93 8B00 MOV EAX,DWORD PTR DS:[EAX]
7119CF95 8B00 MOV EAX,DWORD PTR DS:[EAX]
7119CF97 33C3 XOR EAX,EBX ; // < 7000 0000 的 API
7119CF99 8902 MOV DWORD PTR DS:[EDX],EAX ; // 保存 API Address
7119CF9B 83C2 04 ADD EDX,4
7119CF9E 8BC1 MOV EAX,ECX
7119CFA0 90 NOP
7119CFA1 90 NOP
7119CFA2 90 NOP
7119CFA3 90 NOP
7119CFA4 90 NOP
7119CFA5 83C0 04 ADD EAX,4
7119CFA8 3D 208C4300 CMP EAX,438C20 ; // 搜索到 438C20 结束
7119CFAD ^ 72 BC JB SHORT V1200351.7119CF6B
7119CFAF 61 POPAD
60 B8 50 12 40 00 BA 00 00 01 01 66 81 38 90 E9 0F 85 2F 00 00 00 8B C8 8B 40 02 03 C1 83 C0 06 3D 00 00 00
70 0F 87 0E 00 00 00 83 C0 05 8B D8 83 C0 02 8B 00 8B 00 33 C3 89 02 83 C2 04 8B C1 90 90 90 90 90 83 C0 04
3D 20 8C 43 00 72 BC 61
IMPortRec, VA=1010000, RVA = C10000, Size = 688, Get Imports 得到IAT
OEP: 00099780 IATRVA: 00C10000 IATSize: 00000688
............
............
............
............
............
接下来:
所有函数都 OK 了, 但顺序不对, 重新整理,
找一个空闲空间 4A8000-4AB000, 放整理好后的 IAT (问题四:这一步是在OD载入加密程序中操作吗?什么时候操作?该如何操作?)
Kernel32 122 4A8000 - 4A81E4
User32 167 4A81EC - 4A8484
GDI32 75 4A848C - 4A85B4
comctl32 23 4A85BC - 4A8614
Oleaut32 15 4A861C - 4A8654
Advapi32 6 4A865C - 4A8670
version 3 4A8678 - 4A8680
Ole32 1 4A8688 - 4A8688
winspool 4 4A8690 - 4A869C
shell32 1 4A86A4 - 4A86A4
comdlg32 1 4A86AC - 4A86AC
把下面数据拷贝到 1011000(用Excel 花了我半小时)(问题五:如何用Excel拷贝?是拷贝到加密了的程序,还是dump后的程序?
00 80 4A 00
04 80 4A 00
08 80 4A 00
0C 80 4A 00
10 80 4A 00
14 80 4A 00
18 80 4A 00
1C 80 4A 00
20 80 4A 00
24 80 4A 00
28 80 4A 00
2C 80 4A 00
...........
...........
再写一段程序, 修复 (问题六:这一步是在什么时候操作?)
7119CF60 60 PUSHAD
7119CF61 B8 50124000 MOV EAX,401250 ; // 搜索从 401250 开始
7119CF66 BA 00000101 MOV EDX,1010000 ; // 从 1010000 开始的区域取API
7119CF6B 66:8138 90E9 CMP WORD PTR DS:[EAX],0E990 ; // 90 E9 = NOP,
7119CF70 0F85 2F000000 JNZ V1200351.7119CFA5
7119CF76 8BC8 MOV ECX,EAX ; // EAX SAVE IN ECX
7119CF78 8B40 02 NOP
7119CF79 90 NOP
7119CF7A 90 NOP
7119CF7B 66:C700 FF25 MOV WORD PTR DS:[EAX],25FF ; // 改成 JMP [XXXXXXX]
7119CF80 83C0 02 ADD EAX,2
7119CF83 8BDA MOV EBX,EDX
7119CF85 81C3 00100000 ADD EBX,1000 ; // 1011000 开始区域放 IAT 地址
7119CF8B 8B1B MOV EBX,DWORD PTR DS:[EBX] ; // 取出 XXXXXXX
7119CF8D 8918 MOV DWORD PTR DS:[EAX],EBX
7119CF8F 90 NOP
7119CF90 8B02 MOV EAX,DWORD PTR DS:[EDX] ; // 取出 API
7119CF92 8903 MOV DWORD PTR DS:[EBX],EAX ; // [XXXXXXX] = API
7119CF94 90 NOP
7119CF95 90 NOP
7119CF96 90 NOP
7119CF97 90 NOP
7119CF98 90 NOP
7119CF99 90 NOP
7119CF9A 90 NOP
7119CF9B 83C2 04 ADD EDX,4
7119CF9E 8BC1 MOV EAX,ECX
7119CFA0 90 NOP
7119CFA1 90 NOP
7119CFA2 90 NOP
7119CFA3 90 NOP
7119CFA4 90 NOP
7119CFA5 83C0 04 ADD EAX,4
7119CFA8 3D 208C4300 CMP EAX,438C20
7119CFAD ^ 72 BC JB SHORT V1200351.7119CF6B
7119CFAF 61 POPAD
60 B8 50 12 40 00 BA 00 00 01 01 66 81 38 90 E9 0F 85 2F 00 00 00 8B C8 90 90 90 66 C7 00 FF 25
83 C0 02 8B DA 81 C3 00 10 00 00 8B 1B 89 18 90 8B 02 89 03 90 90 90 90 90 90 90 83 C2 04 8B C1
90 90 90 90 90 83 C0 04 3D 20 8C 43 00 72 BC 61
回到 499780 dump
IMPortRec, VA=4A8000, RVA = A8000, Size = 6B0, Get Imports 得到IAT
RVA = A9000, Fixdump
谢谢simonzh2000[US]大侠写出的脱文!只怪木头理解水平低,不能完成理解里面的意思,希望各位大侠能帮助我掌握里面的操作技巧!
再次谢谢了!
木头
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课