| 
注册时间2005-6-29
阅读权限255
最后登录1970-1-1UID2198 副坛主   
 
 该用户从未签到 | 
 
| 菜儿推荐了一个支持单层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本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?加入我们 
  评分
查看全部评分
 |