Nisy 发表于 2007-6-10 09:28:49

SMC补丁工具加壳后的程序脱壳

菜儿推荐了一个支持单层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
00410E5C    57            push    edi
00410E5D    83CD FF         or      ebp, FFFFFFFF
00410E60    EB 10         jmp   short 00410E72

ESP定律后来到这里:

00410FD7    8D4424 80       lea   eax, dword ptr
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
0041501A    2D 0B000000   sub   eax, 0B
0041501F    8985 803F4000   mov   dword ptr , eax
00415025    8B4424 18       mov   eax, dword ptr
00415029    8985 4A404000   mov   dword ptr , eax
0041502F    8B85 883F4000   mov   eax, dword ptr
00415035    0385 803F4000   add   eax, dword ptr
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

----------------------------------------
我们跟进这个地址看一下:call0041504C

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 , 1
00415060    75 02         jnz   short 00415064
00415062    61            popad
00415063    C3            retn
00415064    8D85 4A404000   lea   eax, dword ptr
0041506A    8B00            mov   eax, dword ptr
0041506C    83BD 8C3F4000 0>cmp   dword ptr , 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 , eax
00415088    8BC8            mov   ecx, eax
0041508A    8DBD 2A404000   lea   edi, dword ptr
00415090    8D95 983F4000   lea   edx, dword ptr
00415096    8D9D 7C3B4000   lea   ebx, dword ptr
0041509C    EB 0F         jmp   short 004150AD
0041509E    8B32            mov   esi, dword ptr
004150A0    03F3            add   esi, ebx
004150A2    56            push    esi
004150A3    51            push    ecx
004150A4    E8 77010000   call    00415220
004150A9    AB            stos    dword ptr es:
004150AA    83C2 04         add   edx, 4
004150AD    66:833A 00      cmp   word ptr , 0
004150B1^ 75 EB         jnz   short 0041509E
004150B3    C785 903F4000 0>mov   dword ptr , 1
004150BD    61            popad                                    ; 出栈 返回
004150BE    C3            retn
--------------------------------------------

执行00415048- FFE0jmp   eax ( EAX=原程序的入口处 410E50)来到这里

00410E50 >60            pushad
00410E51    BE 00D04000   mov   esi, 0040D000                  ; 这里ESP定律
00410E56    8DBE 0040FFFF   lea   edi, dword ptr
00410E5C    57            push    edi
00410E5D    83CD FF         or      ebp, FFFFFFFF
00410E60    EB 10         jmp   short 00410E72

ESP定律后来到这里:

00410FD7    8D4424 80       lea   eax, dword ptr
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
004152EA    83E8 0A         sub   eax, 0A
004152ED    8945 04         mov   dword ptr , eax         ; 这里的EAX中就是原程序返回OEP的地址:410FE4
004152F0    8945 F8         mov   dword ptr , 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
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 , eax
00415315    83C0 04         add   eax, 4
00415318    8B10            mov   edx, dword ptr
0041531A    83C0 08         add   eax, 8
0041531D    0FB708          movzx   ecx, word ptr
00415320    8B75 FC         mov   esi, dword ptr
00415323    83C6 0C         add   esi, 0C
00415326    0FB70E          movzx   ecx, word ptr
00415329    83C6 02         add   esi, 2
0041532C    03F1            add   esi, ecx
0041532E    0FB70E          movzx   ecx, word ptr
00415331    83C6 02         add   esi, 2
00415334    8B7D FC         mov   edi, dword ptr
00415337    8B3F            mov   edi, dword ptr
00415339    60            pushad
0041533A    8D83 58404000   lea   eax, dword ptr
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 , eax
00415350    61            popad
00415351    FC            cld
00415352    FF75 F0         push    dword ptr
00415355    57            push    edi
00415356    6A 01         push    1
00415358    E8 7B010000   call    004154D8
0041535D    AC            lods    byte ptr
0041535E    AA            stos    byte ptr es:
0041535F    4F            dec   edi
00415360    FF75 F0         push    dword ptr
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
00415371    8B75 FC         mov   esi, dword ptr
00415374    83C6 0C         add   esi, 0C
00415377    0FB70E          movzx   ecx, word ptr
0041537A    83C6 02         add   esi, 2
0041537D    57            push    edi
0041537E    51            push    ecx
0041537F    FC            cld
00415380    FF75 F0         push    dword ptr
00415383    57            push    edi
00415384    6A 01         push    1
00415386    E8 4D010000   call    004154D8
0041538B    AC            lods    byte ptr
0041538C    AA            stos    byte ptr es:
0041538D    4F            dec   edi
0041538E    FF75 F0         push    dword ptr
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
004153B0    0BF6            or      esi, esi
004153B2    75 02         jnz   short 004153B6
004153B4    EB 5E         jmp   short 00415414
004153B6    03B3 803F4000   add   esi, dword ptr
004153BC    8BC7            mov   eax, edi
004153BE    2B83 803F4000   sub   eax, dword ptr
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
004153D2    2B93 843F4000   sub   edx, dword ptr
004153D8    0393 803F4000   add   edx, dword ptr
004153DE    60            pushad
004153DF    B9 04000000   mov   ecx, 4
004153E4    FF75 F0         push    dword ptr
004153E7    57            push    edi
004153E8    6A 01         push    1
004153EA    E8 E9000000   call    004154D8
004153EF    8817            mov   byte ptr , dl
004153F1    C1CA 08         ror   edx, 8
004153F4    FF75 F0         push    dword ptr
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 , 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
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

glts 发表于 2007-6-10 11:03:54

分析得很细

菜儿 发表于 2007-6-10 12:33:40

学习了...分析得很好......./:09

haiyun 发表于 2007-6-10 16:26:31

超详细的分析,感谢老大!

千里之外 发表于 2007-6-10 22:18:28

支持老大的分析又学到了好多 呵呵

冷血书生 发表于 2007-6-11 00:45:54

学习,超详细!

dhwch 发表于 2007-6-11 07:18:00

仔细研究一下~

yang15363 发表于 2007-6-11 11:01:17

好详细,学习一下.

bxmp 发表于 2007-6-11 11:12:26

太详细了 ,一定要认真学习。

bhcjl 发表于 2007-6-14 09:47:17

学习第三次了
页: [1] 2
查看完整版本: SMC补丁工具加壳后的程序脱壳