【原创】手动脱壳Enigma Protector过程(申请邀请码)
昨天下载了一个Enigma Protector加壳的二次加密软件练手,结果成功了,把过程发上来分享。
00421C6D 55 push ebp ; 典型Enigma Protector入口
00421C6E 8BEC mov ebp,esp
00421C70 83C4 F0 add esp,-10
00421C73 B8 00104000 mov eax,练习目标.00401000
00421C78 E8 01000000 call 练习目标.00421C7E
00421C7D 9A 83C4108B E>call far 5DE5:8B10C483
00421C84 - E9 DBC61E00 jmp 练习目标.0060E364 ; F4到这里,F8。
00421C89 3AB6 9F2324D6 cmp dh,byte ptr ds:[esi+D624239F]
--------------------------------------------------------------------------------------------------------
Enigma Protector的壳,开始遇到jmp直接F4,这样快点。
经过N个jmp来到这里。
0060E73C ^\E9 D9FFFFFF jmp 练习目标.0060E71A
0060E741 68 00400000 push 4000 ; F4直接到这里
0060E746 68 00B40C00 push 0CB400
0060E74B 56 push esi
0060E74C FF95 B8A01A00 call dword ptr ss:[ebp+1AA0B8]
......
0060E7B9 0118 add dword ptr ds:[eax],ebx
0060E7BB 49 dec ecx
0060E7BC 49 dec ecx
0060E7BD 83C7 02 add edi,2
0060E7C0 ^ E9 C8FFFFFF jmp 练习目标.0060E78D
0060E7C5 E9 04000000 jmp 练习目标.0060E7CE ; F4直接到这里
......
0060E7E5 3010 xor byte ptr ds:[eax],dl
0060E7E7 40 inc eax
0060E7E8 49 dec ecx
0060E7E9 ^ 0F85 F6FFFFFF jnz 练习目标.0060E7E5
0060E7EF E9 04000000 jmp 练习目标.0060E7F8 ; F4直接到这里
0060E7F4 D5 68 aad 68 ; 观察这里代码变化
0060E7F6 1E push ds
0060E7F7 17 pop ss
......
0060E88A 8945 00 mov dword ptr ss:[ebp],eax
0060E88D 58 pop eax
0060E88E 81C5 04000000 add ebp,4 ; 注意下面的2个jmp
0060E894 ^ E9 BFFFFFFF jmp 练习目标.0060E858 ; jmp返回
0060E899 5D pop ebp
0060E89A 81C7 14000000 add edi,14
0060E8A0 ^ E9 5FFFFFFF jmp 练习目标.0060E804 ; jmp返回
......
0060E8C8 8B40 04 mov eax,dword ptr ds:[eax+4]
0060E8CB 90 nop
0060E8CC 56 push esi
0060E8CD 03C6 add eax,esi
0060E8CF FFD0 call eax ; 看到这个就快返回了
0060E8D1 61 popad
0060E8D2 8B40 00 mov eax,dword ptr ds:[eax]
......
0060E8DF 8B70 3C mov esi,dword ptr ds:[eax+3C]
0060E8E2 96 xchg eax,esi
0060E8E3 8B8430 280000>mov eax,dword ptr ds:[eax+esi+28]
0060E8EA 03C6 add eax,esi
0060E8EC 50 push eax
0060E8ED C3 retn ; F4到这里,F8。
--------------------------------------------------------------------------------------------------------
006B18C4 55 push ebp ; 返回到这里了
006B18C5 8BEC mov ebp,esp
006B18C7 83C4 C4 add esp,-3C
006B18CA B8 24156B00 mov eax,练习目标.006B1524
006B18CF E8 0868F6FF call 练习目标.006180DC
006B18D4 A1 7C9E6C00 mov eax,dword ptr ds:[6C9E7C]
006B18D9 C600 01 mov byte ptr ds:[eax],1
006B18DC E8 0B47F6FF call 练习目标.00615FEC ; F4到这里,F7
006B18E1 8D40 00 lea eax,dword ptr ds:[eax]
006B18E4 0000 add byte ptr ds:[eax],al
006B18E6 0000 add byte ptr ds:[eax],al
在这里首先要处理IAT加密,返回到这里后,Ctrl+S
搜索:mov dword ptr ds:[edx+eax*4+4],ecx
共找到3个,全部nop掉。
=========================================================
00684494 8B0C8D B0856B>mov ecx,dword ptr ds:[ecx*4+6B85B0]
0068449B 894C82 04 mov dword ptr ds:[edx+eax*4+4],ecx ; nop
0068449F 83C3 04 add ebx,4
006844A2 E9 D8000000 jmp 练习目标.0068457F
=========================================================
00684592 8B0C8D 58866B>mov ecx,dword ptr ds:[ecx*4+6B8658]
00684599 894C82 04 mov dword ptr ds:[edx+eax*4+4],ecx ; nop
0068459D 83C3 04 add ebx,4
006845A0 66:8B3B mov di,word ptr ds:[ebx]
006845A3 83C3 02 add ebx,2
006845A6 66:85FF test di,di
006845A9 74 5E je short 练习目标.00684609
=========================================================
00685171 8B4D F0 mov ecx,dword ptr ss:[ebp-10]
00685174 894C82 04 mov dword ptr ds:[edx+eax*4+4],ecx ; nop
00685178 47 inc edi
00685179 FF4D D0 dec dword ptr ss:[ebp-30]
0068517C ^ 0F85 CAFAFFFF jnz 练习目标.00684C4C
-------------------------------------------------------------------------------------------------------
进入006B18DC的call里。
00615FEC 53 push ebx
00615FED 56 push esi
00615FEE 57 push edi
00615FEF 55 push ebp
00615FF0 BB 30B66C00 mov ebx,练习目标.006CB630
00615FF5 BE 00206B00 mov esi,练习目标.006B2000
00615FFA BF 40B06C00 mov edi,练习目标.006CB040
00615FFF 807B 28 00 cmp byte ptr ds:[ebx+28],0
......
00615F30 31C0 xor eax,eax
00615F32 8705 00206B00 xchg dword ptr ds:[6B2000],eax
00615F38 F7D8 neg eax
00615F3A 19C0 sbb eax,eax
00615F3C 40 inc eax
00615F3D BF 30B66C00 mov edi,练习目标.006CB630
00615F42 8B5F 18 mov ebx,dword ptr ds:[edi+18]
00615F45 8B6F 14 mov ebp,dword ptr ds:[edi+14]
00615F48 FF77 1C push dword ptr ds:[edi+1C]
00615F4B FF77 20 push dword ptr ds:[edi+20]
00615F4E 8B37 mov esi,dword ptr ds:[edi]
00615F50 B9 0B000000 mov ecx,0B
00615F55 F3:A5 rep movs dword ptr es:[edi],dword ptr d>
00615F57 5F pop edi
00615F58 5E pop esi
00615F59 C9 leave
00615F5A C2 0C00 retn 0C ; F4到这里,F8返回
00615F5D C3 retn
-------------------------------------------------------------------------------------------------------
返回到这里。
006B0A4F C3 retn
006B0A50 55 push ebp ; 练习目标.00400000
006B0A51 8BEC mov ebp,esp
006B0A53 81C4 E4FEFFFF add esp,-11C
006B0A59 53 push ebx
006B0A5A 56 push esi
006B0A5B 57 push edi
006B0A5C 33C0 xor eax,eax
006B0A5E 8945 E8 mov dword ptr ss:[ebp-18],eax
006B0A61 8945 E4 mov dword ptr ss:[ebp-1C],eax
......
006B0AFA 8160 14 F00FF>and dword ptr ds:[eax+14],FFFF0FF0
006B0B01 8160 18 00DC0>and dword ptr ds:[eax+18],0DC00
006B0B08 C780 B8000000>mov dword ptr ds:[eax+B8],练习目标.006B0B15 ; 注意6B0B15地址
006B0B12 31C0 xor eax,eax
006B0B14 C3 retn
006B0B15 64:8F05 00000>pop dword ptr fs:[0] ; 6B0B15在这里对应
006B0B1C 83C4 04 add esp,4
006B0B1F 68 3B0B6B00 push 练习目标.006B0B3B
......
006B0B61 8378 10 00 cmp dword ptr ds:[eax+10],0
006B0B65 ^ 0F85 B560FDFF jnz 练习目标.00686C20
006B0B6B C780 B8000000>mov dword ptr ds:[eax+B8],练习目标.006B0B78 ; 注意6B0B78地址
006B0B75 31C0 xor eax,eax
006B0B77 C3 retn
006B0B78 64:8F05 00000>pop dword ptr fs:[0] ; 6B0B78和这里对应
006B0B7F 83C4 04 add esp,4
006B0B82 B8 00000100 mov eax,10000 ; UNICODE
"ALLUSERSPROFILE=C:\Documents and Settings\All Users"
......
006B0BB9 B8 F70B6B00 mov eax,练习目标.006B0BF7
006B0BBE E8 85E6FCFF call 练习目标.0067F248
006B0BC3 010424 add dword ptr ss:[esp],eax
006B0BC6 C3 retn ; F4到这里,F8返回
--------------------------------------------------------------------------------------------------------
返回到这里溜一圈。
006B0BF7 C643 12 01 mov byte ptr ds:[ebx+12],1
006B0BFB E8 3CC6FCFF call 练习目标.0067D23C
006B0C00 E8 AB45FDFF call 练习目标.006851B0
006B0C05 C643 06 01 mov byte ptr ds:[ebx+6],1
006B0C09 E8 FA34FDFF call 练习目标.00684108
......
006B0CD5 E8 AE77F6FF call 练习目标.00618488 ; jmp to kernel32.GetComputerNameA
006B0CDA 8B0D BC9F6C00 mov ecx,dword ptr ds:[6C9FBC] ; 练习目标.006CBB14
006B0CE0 8B15 509F6C00 mov edx,dword ptr ds:[6C9F50] ; 练习目标.006CBA10
006B0CE6 8B12 mov edx,dword ptr ds:[edx]
006B0CE8 A1 889C6C00 mov eax,dword ptr ds:[6C9C88]
006B0CED E8 6631F7FF call 练习目标.00623E58 ; 下面的注册表是个特征
006B0CF2 68 C8146B00 push 练习目标.006B14C8 ; ASCII "Software\Enigma Protector\"
006B0CF7 A1 A8A06C00 mov eax,dword ptr ds:[6CA0A8]
......
006B0DFF 8160 14 F00FF>and dword ptr ds:[eax+14],FFFF0FF0
006B0E06 8160 18 00DC0>and dword ptr ds:[eax+18],0DC00
006B0E0D C780 B8000000>mov dword ptr ds:[eax+B8],练习目标.006B0E1A ; 注意6B0E1A这个地址
006B0E17 31C0 xor eax,eax
006B0E19 C3 retn
006B0E1A 64:8F05 00000>pop dword ptr fs:[0] ; 6B0E1A地址在这里对应
006B0E21 83C4 04 add esp,4
006B0E24 E8 0FE2FCFF call 练习目标.0067F038
006B0E29 E8 46E4FCFF call 练习目标.0067F274
006B0E2E 50 push eax
006B0E2F 89C1 mov ecx,eax
006B0E31 B8 6F0E6B00 mov eax,练习目标.006B0E6F
006B0E36 E8 0DE4FCFF call 练习目标.0067F248
006B0E3B 010424 add dword ptr ss:[esp],eax
006B0E3E C3 retn ; F4到这里,F8返回
--------------------------------------------------------------------------------------------------------
返回后,F8单步走到返回。
006B1095 E8 A2C1FCFF call 练习目标.0067D23C
006B109A E8 D5E1FCFF call 练习目标.0067F274
006B109F 50 push eax
006B10A0 89C1 mov ecx,eax
006B10A2 B8 E0106B00 mov eax,练习目标.006B10E0
006B10A7 E8 9CE1FCFF call 练习目标.0067F248
006B10AC 010424 add dword ptr ss:[esp],eax
006B10AF C3 retn ; F4到这里,F8返回
-------------------------------------------------------------------------------------------------------
返回到这里。
006B10E0 68 FC106B00 push 练习目标.006B10FC
006B10E5 64:FF35 00000>push dword ptr fs:[0]
006B10EC 64:8925 00000>mov dword ptr fs:[0],esp
006B10F3 31C0 xor eax,eax
006B10F5 3100 xor dword ptr ds:[eax],eax
006B10F7 ^ E9 245BFDFF jmp 练习目标.00686C20
......
006B1120 8160 14 F00FF>and dword ptr ds:[eax+14],FFFF0FF0
006B1127 8160 18 00DC0>and dword ptr ds:[eax+18],0DC00
006B112E C780 B8000000>mov dword ptr ds:[eax+B8],练习目标.006B113B ; 注意6B113B这个地址
006B1138 31C0 xor eax,eax
006B113A C3 retn
006B113B 64:8F05 00000>pop dword ptr fs:[0] ; 6B113B地址在这里对应
006B1142 83C4 04 add esp,4
006B1145 A1 A8A06C00 mov eax,dword ptr ds:[6CA0A8]
......
006B11E0 E8 9F60FDFF call 练习目标.00687284
006B11E5 A1 A8A06C00 mov eax,dword ptr ds:[6CA0A8]
006B11EA 80B8 6A1C0000>cmp byte ptr ds:[eax+1C6A],0 ; F4直接到这里
006B11F1 74 0C je short 练习目标.006B11FF ; 修改[eax+1C6A]=0
006B11F3 A1 A8A06C00 mov eax,dword ptr ds:[6CA0A8]
006B11F8 8B00 mov eax,dword ptr ds:[eax]
006B11FA E8 F95BFDFF call 练习目标.00686DF8
......
006B12B7 E8 30F6FFFF call 练习目标.006B08EC
006B12BC 33C0 xor eax,eax
006B12BE 5A pop edx
006B12BF 59 pop ecx
006B12C0 59 pop ecx
006B12C1 64:8910 mov dword ptr fs:[eax],edx
006B12C4 EB 53 jmp short 练习目标.006B1319 ; F4直接到这里
......
006B131D E8 CEBDFCFF call 练习目标.0067D0F0
006B1322 E8 4DDFFCFF call 练习目标.0067F274
006B1327 50 push eax
006B1328 89C1 mov ecx,eax
006B132A B8 68136B00 mov eax,练习目标.006B1368
006B132F E8 14DFFCFF call 练习目标.0067F248
006B1334 010424 add dword ptr ss:[esp],eax
006B1337 C3 retn ; F4到这里,F8返回
--------------------------------------------------------------------------------------------------------
返回到这里了。
006B1368 A1 A4A06C00 mov eax,dword ptr ds:[6CA0A4] ; 返回到这里
006B136D 8B00 mov eax,dword ptr ds:[eax]
006B136F 8B15 A8A06C00 mov edx,dword ptr ds:[6CA0A8] ; 练习目标.006CBB50
006B1375 0342 28 add eax,dword ptr ds:[edx+28]
006B1378 8B15 A8A06C00 mov edx,dword ptr ds:[6CA0A8] ; 练习目标.006CBB50
006B137E 0382 EC000000 add eax,dword ptr ds:[edx+EC]
006B1384 83C0 18 add eax,18
......
006B1470 E8 03F0FCFF call 练习目标.00680478
006B1475 8B45 14 mov eax,dword ptr ss:[ebp+14]
006B1478 50 push eax
006B1479 A1 A8A06C00 mov eax,dword ptr ds:[6CA0A8]
006B147E 8B80 0C010000 mov eax,dword ptr ds:[eax+10C]
006B1484 50 push eax
006B1485 8B45 18 mov eax,dword ptr ss:[ebp+18]
006B1488 50 push eax ; 看上面的代码多熟悉呀
006B1489 E8 0EF0FCFF call 练习目标.0068049C ; F4到这里,F7进入
006B148E E8 8D57FDFF call 练习目标.00686C20
--------------------------------------------------------------------------------------------------------
进入006B1489的call里。
0068049C 55 push ebp ; 固化了的格式,没问题
0068049D 8BEC mov ebp,esp
0068049F 83C4 F4 add esp,-0C
006804A2 53 push ebx
006804A3 56 push esi
006804A4 57 push edi
006804A5 8B7D 0C mov edi,dword ptr ss:[ebp+C]
006804A8 8D5D F8 lea ebx,dword ptr ss:[ebp-8]
006804AB 8D75 F4 lea esi,dword ptr ss:[ebp-C]
006804AE B8 00020000 mov eax,200
006804B3 E8 3442F9FF call 练习目标.006146EC
......
向下拉N多的代码,到这里了。
00680B80 E8 478BFAFF call 练习目标.006296CC
00680B85 8B45 FC mov eax,dword ptr ss:[ebp-4]
00680B88 - FFE0 jmp eax ; F4直接到这里
00680B8A 5F pop edi
00680B8B 5E pop esi
00680B8C 5B pop ebx
00680B8D 8BE5 mov esp,ebp
00680B8F 5D pop ebp
00680B90 C2 0C00 retn 0C
--------------------------------------------------------------------------------------------------------
从00680B88跳来。
015867A0 E8 CF8A0FFF call 练习目标.0067F274 ; 来到这里,F8单步
015867A5 E9 04000000 jmp 015867AE
015867AA 5A pop edx
015867AB 91 xchg eax,ecx
015867AC ^ 7D 82 jge short 01586730
015867AE 8905 90376E00 mov dword ptr ds:[6E3790],eax
......
省略N个jmp
015868A1 ^\0F85 D8FFFFFF jnz 0158687F ; 别回跳。
015868A7 E9 04000000 jmp 015868B0 ; F4直接到这里
015868AC F681 F05A81C4>test byte ptr ds:[ecx+C4815AF0],7C
......
省略N个jmp
015B305C 68 34144000 push 401434 ; ASCII "VB5!6&vb6chs.dll"
015B3061 E8 2AE2E4FE call 练习目标.00401290
015B3066 - E9 37E2E4FE jmp 练习目标.004012A2
终于到地方了,原来VB的。
-------------------------------------------------------------------------------------------------------
Ctrl+G: 00401000
Ctrl+B: FF 25
找到这里了。
0040111C 90 nop
0040111D - E9 AF1E1A00 jmp 练习目标.005A2FD1
00401122 - FF25 80104000 jmp dword ptr ds:[401080] ; msvbvm60.rtcShell
00401128 90 nop
00401129 - E9 AC1E1A00 jmp 练习目标.005A2FDA
0040112E - FF25 A0104000 jmp dword ptr ds:[4010A0] ; msvbvm60.rtcStringBstr
......
00401279 - E9 581E1A00 jmp 练习目标.005A30D6
0040127E - FF25 9C104000 jmp dword ptr ds:[40109C] ; msvbvm60.GetMemNewObj
00401284 90 nop
00401285 - E9 551E1A00 jmp 练习目标.005A30DF
0040128A - FF25 AC104000 jmp dword ptr ds:[4010AC] ; msvbvm60.SetMemNewObj
00401290 90 nop
00401291 - E9 521E1A00 jmp 练习目标.005A30E8
00401296 0000 add byte ptr ds:[eax],al
00401298 E8 7E483E4D call 4D7E5B1B
0040129D B7 01 mov bh,1
0040129F A4 movs byte ptr es:[edi],byte ptr ds:[esi>
按照VB的OEP格式应该在00401298,复制015868A1二行代码,修正OEP,新建EIP。
00401285 - E9 551E1A00 jmp 练习目标.005A30DF
0040128A - FF25 AC104000 jmp dword ptr ds:[4010AC] ; msvbvm60.SetMemNewObj
00401290 90 nop
00401291 - E9 521E1A00 jmp 练习目标.005A30E8
00401296 0000 add byte ptr ds:[eax],al
00401298 68 34144000 push 练习目标.00401434 ; ASCII "VB5!6&vb6chs.dll"
0040129D E8 EEFFFFFF call 练习目标.00401290
004012A2 0000 add byte ptr ds:[eax],al
004012A4 40 inc eax
004012A5 0000 add byte ptr ds:[eax],al
--------------------------------------------------------------------------------------------------------
LordPE转存为dumped.exe。
ImportREC,oep=401298-400000=00001298,rva=00001000。
保存。
PEiD测试为Microsoft Visual Basic 5.0 / 6.0。
至此,脱壳成功。
因属于商业软件,这里就不提供附件了。有兴趣的可以留言。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课