WPE|52wpe|我爱WPE

 找回密码
 注册会员
搜索
  • 2105查看
  • 0回复

主题

好友

1936

积分

金牌会员

发表于 2010-1-23 11:51:45 |显示全部楼层
作者:tr0j4n  
注:文章首发《黑客防线》2008年第8期,后由原创作者友情提交到邪恶八进制信息安全团队,转载请注明出处。

这篇文章发表好一阵子了,一直捏在手里没发,是我当时初学脱壳的一点笔记,现在回头看去,仍有一些稚嫩,请勿见笑当时的我

前一阵子忙着泡坛子,发现一些坛子里面的朋友在不断地发求助帖,询问一些中强保护壳的手工脱法,工具有时版本较低,而且不如手工效果完美。于是我就把一些问题整合了下,写了这篇文章,希望对大家有点帮助,本文谈到了一些壳的手工脱法,以前的杂志里面提到的也比较少,像UPX还有Aspack这样的弱壳就不属本文的讨论范畴了。这里我用到的东西是OllyICE(带invisible.dll隐藏插件和OllyDump脱壳插件),PEID(查壳工具),ImportREC.exe(输入表修复)。
1、nSpack V2.x



图1

这是一个US-ASCII的解密工具,一般我都用它来进行网马的解密工作(如图1)。首先,OD载入,来到如下代码处:
复制内容到剪贴板
代码:
00492554 >  9C              pushfd
00492555    60              pushad
00492556    E8 00000000     call    0049255B
0049255B    5D              pop     ebp
0049255C    B8 07000000     mov     eax, 7
00492561    2BE8            sub     ebp, eax
00492563    8DB5 F8FBFFFF   lea     esi, dword ptr [ebp-408]
00492569    8A06            mov     al, byte ptr [esi]
0049256B    3C 00           cmp     al, 0
0049256D    74 12           je      short 00492581
在00492556这里有一个call,不怕它,它不像Aspack,一开头第二行就会遇到一个call,一定要飞过那个call才好继续往下走,这里没关系,一直F8向下,不必害怕,所有的跳转基本上都是向下或是未实现的跳转,来到这里,小心下:
复制内容到剪贴板
代码:
004925E7   /75 0A           jnz     short 004925F3
004925E9   |83C7 04         add     edi, 4
004925EC   |B9 00000000     mov     ecx, 0
004925F1   |EB 16           jmp     short 00492609
004925F3   \B9 01000000     mov     ecx, 1
004925F8    033B            add     edi, dword ptr [ebx]
004925E7这个jnz是死跳,没有必要害怕,还是往下走,但是到了004925F1就要注意了,这个无条件跳转不光是可以实现的,而且跨度挺大,我们让它跳下去,又来到了这里:
复制内容到剪贴板
代码:
00492609    57              push    edi                              ; Ascii.00492E88
0049260A    51              push    ecx
0049260B    52              push    edx
0049260C    53              push    ebx  //一连串入栈
0049260D    FFB5 60FCFFFF   push    dword ptr [ebp-3A0]
00492613    FFB5 5CFCFFFF   push    dword ptr [ebp-3A4]
00492619    8BD6            mov     edx, esi
0049261B    8BCF            mov     ecx, edi
0049261D    8B85 DCFBFFFF   mov     eax, dword ptr [ebp-424]
00492623    05 A9050000     add     eax, 5A9
00492628    FFD0            call    eax    //这里有明显停顿
0049262A    5B              pop     ebx
0049262B    5A              pop     edx
0049262C    59              pop     ecx     //一连串的出栈
0049262D    5F              pop     edi   
0049262E    83F9 00         cmp     ecx, 0
00492631    74 05           je      short 00492638
00492633    83C3 08         add     ebx, 8
00492636  ^ EB C5           jmp     short 004925FD   //这个跳转很厉害,可实现!
00492638    68 00800000     push    8000      //断点-条件运行到所选
0049263D    6A 00           push    0
0049263F    FFB5 DCFBFFFF   push    dword ptr [ebp-424]
00492645    FF95 60FCFFFF   call    dword ptr [ebp-3A0]
0049264B    8DB5 E4FBFFFF   lea     esi, dword ptr [ebp-41C]
00492651    8B4E 08         mov     ecx, dword ptr [esi+8]
00492654    8D56 10         lea     edx, dword ptr [esi+10]
00492657    8B36            mov     esi, dword ptr [esi]
00492659    8BFE            mov     edi, esi
0049265B    83F9 00         cmp     ecx, 0
0049265E    74 3F           je      short 0049269F
00492660    8A07            mov     al, byte ptr [edi]
00492662    47              inc     edi
00492663    2C E8           sub     al, 0E8
00492665    3C 01           cmp     al, 1
00492667  ^ 77 F7           ja short 00492660     //这个又是可以实现的,不能让它跳!
00492669    8B07            mov     eax, dword ptr [edi]   //断点-条件运行到所选
0049266B    807A 01 00      cmp     byte ptr [edx+1], 0
0049266F    74 14           je      short 00492685
00492671    8A1A            mov     bl, byte ptr [edx]
00492673    381F            cmp     byte ptr [edi], bl
00492675  ^ 75 E9           jnz     short 00492660         //死跳,不怕
00492677    8A5F 04         mov     bl, byte ptr [edi+4]
0049267A    66:C1E8 08      shr     ax, 8
0049267E    C1C0 10         rol     eax, 10
00492681    86C4            xchg    ah, al
00492683    EB 0A           jmp     short 0049268F     //直接跳到下面
00492685    8A5F 04         mov     bl, byte ptr [edi+4]
00492688    86C4            xchg    ah, al
0049268A    C1C0 10         rol     eax, 10
0049268D    86C4            xchg    ah, al
0049268F    2BC7            sub     eax, edi       //由上面跳过来
00492691    03C6            add     eax, esi
00492693    8907            mov     dword ptr [edi], eax
00492695    83C7 05         add     edi, 5
00492698    80EB E8         sub     bl, 0E8
0049269B    8BC3            mov     eax, ebx
0049269D  ^ E2 C6           loopd   short 00492665   //当心!循环!
0049269F    E8 3A010000     call    004927DE     //断点-条件运行到所选
004926A4    8D8D F8FBFFFF   lea     ecx, dword ptr [ebp-408]
004926AA    8B41 08         mov     eax, dword ptr [ecx+8]
004926AD    83F8 00         cmp     eax, 0
004926B0    0F84 81000000   je    00492737    //很厉害的大跳转,过了循环才能看到
004926B6    8BF2            mov     esi, edx
004926B8    2B71 10         sub     esi, dword ptr [ecx+10]
00492636这行跳转不能让它跳上去,要在下面那行00492638按下F4,同样,00492667也是可实现的上跳,在下面的00492669上按F4,到了0049269D当心下,有个loopd,直接在下面那个call上按F4,004926B0处的大跳转带我们来到下面:
复制内容到剪贴板
代码:
00492737    8DB5 B4FBFFFF   lea     esi, dword ptr [ebp-44C]
0049273D    8B16            mov     edx, dword ptr [esi]
0049273F    8DB5 10FCFFFF   lea     esi, dword ptr [ebp-3F0]
00492745    8A06            mov     al, byte ptr [esi]
00492747    3C 01           cmp     al, 1
00492749    75 3F           jnz     short 0049278A
0049274B    0356 04         add     edx, dword ptr [esi+4]
0049274E    56              push    esi
0049274F    52              push    edx
00492750    56              push    esi
00492751    6A 04           push    4
00492753    68 00010000     push    100
00492758    52              push    edx
00492759    FF95 58FCFFFF   call    dword ptr [ebp-3A8]
0049275F    5F              pop     edi
00492760    5E              pop     esi
00492761    83F8 01         cmp     eax, 1
00492764    0F85 BD010000   jnz     00492927
0049276A    83C6 08         add     esi, 8
0049276D    B9 08000000     mov     ecx, 8
00492772    F3:A4           rep     movs byte ptr es:[edi], byte ptr>
00492774    83EE 0C         sub     esi, 0C
00492777    83EF 08         sub     edi, 8
0049277A    56              push    esi
0049277B    FF76 FC         push    dword ptr [esi-4]
0049277E    68 00010000     push    100
00492783    57              push    edi
00492784    FF95 58FCFFFF   call    dword ptr [ebp-3A8]
0049278A    55              push    ebp
0049278B    5B              pop     ebx



图2

一路向下,非常爽,我看到了0049278A这一行,当时我就以为这个是真的ebp了(如图2),直接在这行上面dump,可是脱出来的东西Ascii2.exe大是变大了(231KVB到745KB),可peid却说什么也没有发现,很晕,于是我重新载入Ascii2.exe继续向下跑:
复制内容到剪贴板
代码:
004927BA    5A              pop     edx
004927BB    5B              pop     ebx
004927BC    59              pop     ecx
004927BD    5E              pop     esi
004927BE    83C3 0C         add     ebx, 0C
004927C1  ^ E2 E1           loopd   short 004927A4    //这个循环不会实现,没事
004927C3    B8 00000000     mov     eax, 0
004927C8    83F8 00         cmp     eax, 0
004927CB    74 0A           je      short 004927D7
004927CD    61              popad
004927CE    9D              popfd
004927CF    B8 01000000     mov     eax, 1
004927D4    C2 0C00         retn    0C
004927D7    61              popad   //曙光出现了!
004927D8    9D              popfd
004927D9  - E9 E225FCFF     jmp     00454DC0
004927DE    8BB5 ACFBFFFF   mov     esi, dword ptr [ebp-454]

快速发帖

您需要登录后才可以回帖 登录 | 注册会员

手机版|Archiver|WPE|52wpe|我爱WPE ( 闽ICP备15009081号 )

GMT+8, 2024-5-3 02:09 , Processed in 0.057118 second(s), 16 queries .

返回顶部