飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6586|回复: 14

[原创] SMC补丁工具加壳后的程序脱壳

[复制链接]

该用户从未签到

发表于 2007-6-10 09:28:49 | 显示全部楼层 |阅读模式
菜儿推荐了一个支持单层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

评分

参与人数 1威望 +40 飘云币 +40 收起 理由
glts + 40 + 40 感谢您发布的原创作品!

查看全部评分

PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2018-6-6 15:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2007-6-10 11:03:54 | 显示全部楼层
    分析得很细
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-10 12:33:40 | 显示全部楼层
    学习了...分析得很好......./:09
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-10 16:26:31 | 显示全部楼层
    超详细的分析,感谢老大!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-10 22:18:28 | 显示全部楼层
    支持老大的分析  又学到了好多 呵呵
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2020-4-10 17:02
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2007-6-11 00:45:54 | 显示全部楼层
    学习,超详细!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-11 07:18:00 | 显示全部楼层
    仔细研究一下~
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-12-27 19:00
  • 签到天数: 118 天

    [LV.6]常住居民II

    发表于 2007-6-11 11:01:17 | 显示全部楼层
    好详细,学习一下.
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-11 11:12:26 | 显示全部楼层
    太详细了 ,一定要认真学习。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-12-6 09:28
  • 签到天数: 121 天

    [LV.7]常住居民III

    发表于 2007-6-14 09:47:17 | 显示全部楼层
    学习第三次了
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表