- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
菜儿推荐了一个支持单层SMC技术的加壳工具, 看一下效果, 对某程序打入SMC补丁后进行脱壳.
原程序使用ESP加壳:UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo (Die测试为UPX 2.02)
========================================================================
00410E50 > 60 pushad
00410E51 BE 00D04000 mov esi, 0040D000 ; 这里ESP定律
00410E56 8DBE 0040FFFF lea edi, dword ptr [esi+FFFF4000]
00410E5C 57 push edi
00410E5D 83CD FF or ebp, FFFFFFFF
00410E60 EB 10 jmp short 00410E72
ESP定律后来到这里:
00410FD7 8D4424 80 lea eax, dword ptr [esp-80]
00410FDB 6A 00 push 0
00410FDD 39C4 cmp esp, eax
00410FDF ^ 75 FA jnz short 00410FDB
00410FE1 83EC 80 sub esp, -80
00410FE4 - E9 EF04FFFF jmp 004014D8 ; JMP到程序的OEP
========================================================================
我们使用SMC补丁工具写入数据后,PEiD查不到壳,Die测壳仍为UPX 2.02
SMC补丁工具 设置如下图:
========================================================================
00415000 > 55 push ebp ; OD载入后来到这里
00415001 57 push edi
00415002 56 push esi
00415003 52 push edx
00415004 51 push ecx
00415005 53 push ebx
00415006 E8 00000000 call 0041500B
0041500B 5D pop ebp
0041500C 8BC5 mov eax, ebp
0041500E 81ED 57364000 sub ebp, 00403657
00415014 2B85 7C3F4000 sub eax, dword ptr [ebp+403F7C]
0041501A 2D 0B000000 sub eax, 0B
0041501F 8985 803F4000 mov dword ptr [ebp+403F80], eax
00415025 8B4424 18 mov eax, dword ptr [esp+18]
00415029 8985 4A404000 mov dword ptr [ebp+40404A], eax
0041502F 8B85 883F4000 mov eax, dword ptr [ebp+403F88]
00415035 0385 803F4000 add eax, dword ptr [ebp+403F80]
0041503B 60 pushad
0041503C E8 0B000000 call 0041504C ; 跟进看看 Call的数据
00415041 61 popad
00415042 5B pop ebx
00415043 59 pop ecx
00415044 5A pop edx
00415045 5E pop esi
00415046 5F pop edi
00415047 5D pop ebp
00415048 - FFE0 jmp eax ; 这里跳原程序的入口处 EAX=410E50
----------------------------------------
我们跟进这个地址看一下:call 0041504C
0041504C 60 pushad ; Call到这里 Pushad先将所有寄存器放堆栈
0041504D E8 00000000 call 00415052
00415052 5D pop ebp
00415053 81ED 9E364000 sub ebp, 0040369E
00415059 83BD 903F4000 0>cmp dword ptr [ebp+403F90], 1
00415060 75 02 jnz short 00415064
00415062 61 popad
00415063 C3 retn
00415064 8D85 4A404000 lea eax, dword ptr [ebp+40404A]
0041506A 8B00 mov eax, dword ptr [eax]
0041506C 83BD 8C3F4000 0>cmp dword ptr [ebp+403F8C], 0
00415073 75 08 jnz short 0041507D
00415075 50 push eax
00415076 E8 45000000 call 004150C0
0041507B EB 05 jmp short 00415082
0041507D E8 BD000000 call 0041513F
00415082 8985 943F4000 mov dword ptr [ebp+403F94], eax
00415088 8BC8 mov ecx, eax
0041508A 8DBD 2A404000 lea edi, dword ptr [ebp+40402A]
00415090 8D95 983F4000 lea edx, dword ptr [ebp+403F98]
00415096 8D9D 7C3B4000 lea ebx, dword ptr [ebp+403B7C]
0041509C EB 0F jmp short 004150AD
0041509E 8B32 mov esi, dword ptr [edx]
004150A0 03F3 add esi, ebx
004150A2 56 push esi
004150A3 51 push ecx
004150A4 E8 77010000 call 00415220
004150A9 AB stos dword ptr es:[edi]
004150AA 83C2 04 add edx, 4
004150AD 66:833A 00 cmp word ptr [edx], 0
004150B1 ^ 75 EB jnz short 0041509E
004150B3 C785 903F4000 0>mov dword ptr [ebp+403F90], 1
004150BD 61 popad ; 出栈 返回
004150BE C3 retn
--------------------------------------------
执行00415048 - FFE0 jmp eax ( EAX=原程序的入口处 410E50)来到这里
00410E50 > 60 pushad
00410E51 BE 00D04000 mov esi, 0040D000 ; 这里ESP定律
00410E56 8DBE 0040FFFF lea edi, dword ptr [esi+FFFF4000]
00410E5C 57 push edi
00410E5D 83CD FF or ebp, FFFFFFFF
00410E60 EB 10 jmp short 00410E72
ESP定律后来到这里:
00410FD7 8D4424 80 lea eax, dword ptr [esp-80]
00410FDB 6A 00 push 0
00410FDD 39C4 cmp esp, eax
00410FDF ^ 75 FA jnz short 00410FDB
00410FE1 83EC 80 sub esp, -80
00410FE4 68 1A664000 push 0040661A ; 我们发现这里的代码又被SMC补丁工具做了修改。这个push 40661A就是我们SMC打补丁写入数据的地址
00410FE9 E8 F2420000 call 004152E0 ; 这里我们跟进
跟近call 004152E0 :
004152E0 55 push ebp ; call 004152E0 后来到这里
004152E1 8BEC mov ebp, esp
004152E3 83C4 F0 add esp, -10
004152E6 50 push eax
004152E7 8B45 04 mov eax, dword ptr [ebp+4]
004152EA 83E8 0A sub eax, 0A
004152ED 8945 04 mov dword ptr [ebp+4], eax ; 这里的EAX中就是原程序返回OEP的地址:410FE4
004152F0 8945 F8 mov dword ptr [ebp-8], eax
004152F3 58 pop eax
004152F4 60 pushad ; Pushad 积存器又全部入栈
004152F5 E8 00000000 call 004152FA ; 这里使用ESP定律
004152FA 5B pop ebx
004152FB 81EB 46394000 sub ebx, 00403946
00415301 FF75 08 push dword ptr [ebp+8]
00415304 E8 67010000 call 00415470
00415309 0BC0 or eax, eax
0041530B 75 05 jnz short 00415312
0041530D E9 02010000 jmp 00415414
00415312 8945 FC mov dword ptr [ebp-4], eax
00415315 83C0 04 add eax, 4
00415318 8B10 mov edx, dword ptr [eax]
0041531A 83C0 08 add eax, 8
0041531D 0FB708 movzx ecx, word ptr [eax]
00415320 8B75 FC mov esi, dword ptr [ebp-4]
00415323 83C6 0C add esi, 0C
00415326 0FB70E movzx ecx, word ptr [esi]
00415329 83C6 02 add esi, 2
0041532C 03F1 add esi, ecx
0041532E 0FB70E movzx ecx, word ptr [esi]
00415331 83C6 02 add esi, 2
00415334 8B7D FC mov edi, dword ptr [ebp-4]
00415337 8B3F mov edi, dword ptr [edi]
00415339 60 pushad
0041533A 8D83 58404000 lea eax, dword ptr [ebx+404058]
00415340 B9 04000000 mov ecx, 4
00415345 83C0 03 add eax, 3
00415348 99 cdq
00415349 F7F1 div ecx
0041534B F7E1 mul ecx
0041534D 8945 F0 mov dword ptr [ebp-10], eax
00415350 61 popad
00415351 FC cld
00415352 FF75 F0 push dword ptr [ebp-10]
00415355 57 push edi
00415356 6A 01 push 1
00415358 E8 7B010000 call 004154D8
0041535D AC lods byte ptr [esi]
0041535E AA stos byte ptr es:[edi]
0041535F 4F dec edi
00415360 FF75 F0 push dword ptr [ebp-10]
00415363 57 push edi
00415364 6A 00 push 0
00415366 E8 6D010000 call 004154D8
0041536B 47 inc edi
0041536C ^ E2 E3 loopd short 00415351
0041536E 8B7D F8 mov edi, dword ptr [ebp-8]
00415371 8B75 FC mov esi, dword ptr [ebp-4]
00415374 83C6 0C add esi, 0C
00415377 0FB70E movzx ecx, word ptr [esi]
0041537A 83C6 02 add esi, 2
0041537D 57 push edi
0041537E 51 push ecx
0041537F FC cld
00415380 FF75 F0 push dword ptr [ebp-10]
00415383 57 push edi
00415384 6A 01 push 1
00415386 E8 4D010000 call 004154D8
0041538B AC lods byte ptr [esi]
0041538C AA stos byte ptr es:[edi]
0041538D 4F dec edi
0041538E FF75 F0 push dword ptr [ebp-10]
00415391 57 push edi
00415392 6A 00 push 0
00415394 E8 3F010000 call 004154D8
00415399 47 inc edi
0041539A ^ E2 E3 loopd short 0041537F
0041539C 59 pop ecx
0041539D 5F pop edi
0041539E E8 00000000 call 004153A3
004153A3 5B pop ebx
004153A4 81EB EF394000 sub ebx, 004039EF
004153AA 8BB3 52404000 mov esi, dword ptr [ebx+404052]
004153B0 0BF6 or esi, esi
004153B2 75 02 jnz short 004153B6
004153B4 EB 5E jmp short 00415414
004153B6 03B3 803F4000 add esi, dword ptr [ebx+403F80]
004153BC 8BC7 mov eax, edi
004153BE 2B83 803F4000 sub eax, dword ptr [ebx+403F80]
004153C4 50 push eax
004153C5 56 push esi
004153C6 E8 51000000 call 0041541C
004153CB 83F8 01 cmp eax, 1
004153CE 75 3B jnz short 0041540B
004153D0 8B17 mov edx, dword ptr [edi]
004153D2 2B93 843F4000 sub edx, dword ptr [ebx+403F84]
004153D8 0393 803F4000 add edx, dword ptr [ebx+403F80]
004153DE 60 pushad
004153DF B9 04000000 mov ecx, 4
004153E4 FF75 F0 push dword ptr [ebp-10]
004153E7 57 push edi
004153E8 6A 01 push 1
004153EA E8 E9000000 call 004154D8
004153EF 8817 mov byte ptr [edi], dl
004153F1 C1CA 08 ror edx, 8
004153F4 FF75 F0 push dword ptr [ebp-10]
004153F7 57 push edi
004153F8 6A 00 push 0
004153FA E8 D9000000 call 004154D8
004153FF 47 inc edi
00415400 ^ E2 E2 loopd short 004153E4
00415402 61 popad
00415403 83C7 04 add edi, 4
00415406 83E9 04 sub ecx, 4
00415409 EB 04 jmp short 0041540F
0041540B 83C7 01 add edi, 1
0041540E 49 dec ecx
0041540F 83F9 00 cmp ecx, 0
00415412 ^ 7F A8 jg short 004153BC
00415414 61 popad
00415415 C9 leave ; ESP定律后来到这里
00415416 C2 0400 retn 4
retn后来到这里:
00410FE4 - E9 EF04FFFF jmp 004014D8 ; 410FCE4这个地址就是我们使用SMC工具在壳区写入返回OEP的地址
我们F8单步一次后即可来到OEP:
004014D8 68 48474000 push 00404748 ; 返回到OEP
004014DD E8 F0FFFFFF call 004014D2 ; jmp 到 MSVBVM60.ThunRTMain
004014E2 0000 add byte ptr [eax], al
========================================================================
大家还记得这两句代码吧, 程序在执行完这两条指令后
00410FE4 68 1A664000 push 0040661A ; 这个push 40661A就是我们SMC打补丁写入数据的地址
00410FE9 E8 F2420000 call 004152E0 ; 这里我们跟进
打了个圈, 又把00410FE4地址处的数据还原. 这一步的SMC技术的实现好厉害哦~~
00410FD6 61 popad
00410FD7 8D4424 80 lea eax, dword ptr [esp-80]
00410FDB 6A 00 push 0
00410FDD 39C4 cmp esp, eax
00410FDF ^ 75 FA jnz short 00410FDB
00410FE1 83EC 80 sub esp, -80
00410FE4 - E9 EF04FFFF jmp 004014D8
用这个工具随意替换某数据为原数据来忽悠别人猜这是什么壳还是挺有意思的. 如原数据为74,SMC后还是替换为74 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
评分
-
查看全部评分
|