|
发表于 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] |
|