看到求助区PECompact壳脱不下来这个帖子,就做个小教程吧,网上DLL脱壳的教程也不是很多,正好前一段整理 ExeinfoPE插件的时候也脱了好几个PECompact,这里偶也就再复习一下
长话短说进入正题
载入od
[Asm] 纯文本查看 复制代码 00276794 > B8 7C772700 MOV EAX, 7C96911B.0027777C
00276799 50 PUSH EAX
0027679A 64:FF35 0000000>PUSH DWORD PTR FS:[0]
002767A1 64:8925 0000000>MOV DWORD PTR FS:[0], ESP
002767A8 33C0 XOR EAX, EAX
002767AA 8908 MOV DWORD PTR DS:[EAX], ECX
002767AC 50 PUSH EAX
002767AD 45 INC EBP
002767AE 43 INC EBX
F8两次到0027679A用ESP定律命令窗口 hr esp 然后F9四次到
[Asm] 纯文本查看 复制代码 002777AF 53 PUSH EBX
002777B0 51 PUSH ECX
002777B1 57 PUSH EDI
002777B2 56 PUSH ESI
002777B3 52 PUSH EDX
002777B4 8D98 57120010 LEA EBX, DWORD PTR DS:[EAX+0x1000125>
002777BA 8B53 18 MOV EDX, DWORD PTR DS:[EBX+0x18]
002777BD 52 PUSH EDX
002777BE 8BE8 MOV EBP, EAX
002777C0 6A 40 PUSH 0x40
002777C2 68 00100000 PUSH 0x1000
002777C7 FF73 04 PUSH DWORD PTR DS:[EBX+0x4]
002777CA 6A 00 PUSH 0x0
002777CC 8B4B 10 MOV ECX, DWORD PTR DS:[EBX+0x10]
002777CF 03CA ADD ECX, EDX
002777D1 8B01 MOV EAX, DWORD PTR DS:[ECX]
002777D3 FFD0 CALL EAX
002777D5 5A POP EDX
002777D6 8BF8 MOV EDI, EAX
002777D8 50 PUSH EAX
002777D9 52 PUSH EDX
002777DA 8B33 MOV ESI, DWORD PTR DS:[EBX]
002777DC 8B43 20 MOV EAX, DWORD PTR DS:[EBX+0x20]
002777DF 03C2 ADD EAX, EDX
002777E1 8B08 MOV ECX, DWORD PTR DS:[EAX]
002777E3 894B 20 MOV DWORD PTR DS:[EBX+0x20], ECX
002777E6 8B43 1C MOV EAX, DWORD PTR DS:[EBX+0x1C]
002777E9 03C2 ADD EAX, EDX
002777EB 8B08 MOV ECX, DWORD PTR DS:[EAX]
002777ED 894B 1C MOV DWORD PTR DS:[EBX+0x1C], ECX
002777F0 03F2 ADD ESI, EDX
002777F2 8B4B 0C MOV ECX, DWORD PTR DS:[EBX+0xC]
002777F5 03CA ADD ECX, EDX
002777F7 8D43 1C LEA EAX, DWORD PTR DS:[EBX+0x1C]
002777FA 50 PUSH EAX
002777FB 57 PUSH EDI
002777FC 56 PUSH ESI
002777FD FFD1 CALL ECX
002777FF 5A POP EDX
00277800 58 POP EAX
00277801 0343 08 ADD EAX, DWORD PTR DS:[EBX+0x8]
00277804 8BF8 MOV EDI, EAX
00277806 52 PUSH EDX
00277807 8BF0 MOV ESI, EAX
00277809 8B46 FC MOV EAX, DWORD PTR DS:[ESI-0x4]
0027780C 83C0 04 ADD EAX, 0x4
0027780F 2BF0 SUB ESI, EAX
00277811 8956 08 MOV DWORD PTR DS:[ESI+0x8], EDX
00277814 8B4B 0C MOV ECX, DWORD PTR DS:[EBX+0xC]
00277817 894E 14 MOV DWORD PTR DS:[ESI+0x14], ECX
0027781A FFD7 CALL EDI
0027781C 5A POP EDX
0027781D 33C9 XOR ECX, ECX
0027781F 66:3B4E 2A CMP CX, WORD PTR DS:[ESI+0x2A]
00277823 75 12 JNZ SHORT 7C96911B.00277837
00277825 8BF0 MOV ESI, EAX
00277827 68 00800000 PUSH 0x8000
0027782C 51 PUSH ECX
0027782D 8B4B 14 MOV ECX, DWORD PTR DS:[EBX+0x14]
00277830 03CA ADD ECX, EDX
00277832 57 PUSH EDI
00277833 FF11 CALL DWORD PTR DS:[ECX]
00277835 8BC6 MOV EAX, ESI
00277837 5A POP EDX
00277838 5E POP ESI
00277839 5F POP EDI
0027783A 59 POP ECX
0027783B 5B POP EBX
0027783C 5D POP EBP
0027783D FFE0 JMP EAX
向下拉找到 0027783D FFE0 JMP EAX F2下断点,删除硬件断点,再运行然后单步F8到达OEP
[Asm] 纯文本查看 复制代码 0025D670 55 PUSH EBP
0025D671 8BEC MOV EBP, ESP
0025D673 83C4 C0 ADD ESP, -0x40
0025D676 B8 9CAC2500 MOV EAX, 7C96911B.0025AC9C ; UNICODE "("
0025D67B E8 70F8FCFF CALL 7C96911B.0022CEF0
0025D680 A1 506C2600 MOV EAX, DWORD PTR DS:[0x266C50]
0025D685 50 PUSH EAX
0025D686 E8 39FFFCFF CALL 7C96911B.0022D5C4
0025D68B 6A 00 PUSH 0x0
0025D68D 6A 00 PUSH 0x0
0025D68F 6A 00 PUSH 0x0
0025D691 68 38AC2500 PUSH 7C96911B.0025AC38
0025D696 6A 00 PUSH 0x0
0025D698 6A 00 PUSH 0x0
0025D69A E8 1DFFFCFF CALL 7C96911B.0022D5BC
0025D69F 50 PUSH EAX
0025D6A0 E8 E7FEFCFF CALL 7C96911B.0022D58C
0025D6A5 E8 DEABFCFF CALL 7C96911B.00228288
0025D6AA 8BC0 MOV EAX, EAX
接着就dump,我用od插件OllyDumpEx
Dump之前记得修正一下Image Base 顺手再点一下Fix Virtual Offfset和Get EIP as OEP
修表也简单说一下吧,和exe不大一样,exe的话直接选对应的进程就好了,dll的话先选od目录下的那个loaddll.exe进程,然后点Pick DLL选中调试的那个dll
然而用ImportREC或者Scylla直接AutoSearch都搜不到任何信息这就要用到修表利器UIF了
我也可以随便找个call进去看看API调用变成什么鬼样子了
[Asm] 纯文本查看 复制代码 002D02BC B8 0E18F876 MOV EAX, kernel32.CreateEventW
002D02C1 FFE0 JMP EAX
002D02C3 B8 6A3BF876 MOV EAX, kernel32.CompareStringW
002D02C8 FFE0 JMP EAX
002D02CA B8 E013F876 MOV EAX, kernel32.CloseHandle
002D02CF FFE0 JMP EAX
002D02D1 B8 FF10F876 MOV EAX, kernel32.Sleep
002D02D6 FFE0 JMP EAX
找了几个发现都变成这个样子了也可以手动或者写个脚本自己修复,偶比较懒直接上UIF
填上loaddll的进程ID,代码开始结束就填上调试dll的code段就差不多了,关键是这个NEW IAT VA 这个一定要填一个dll内存范围内的地址,不然后面就麻烦了
接着用ImportREC 填上OEP、RAV、Size,获取输入表修复刚才dump的dll
这个是最后一步,一般DLL都需修复一下,这里用到ReloX,再把此dll加载到不同基址Dump一份,然后用ReloX打开这两份Compare,最后Fix上一步完成修表的dll就好了
PECompact是个压缩壳,载入貌似有点复杂不要怕,绝大多数压缩壳可以用ESP定律搞定的大家记住这一点就好了。
要练手的话也可以用我稍早发布ExeinfoPE插件合集
https://www.52pojie.cn/thread-681775-1-1.html
中的PackUPX.dll这个dll来练练手,这两个要处理的基本差不多
|