best1650 发表于 2009-1-2 00:05

UPX脱壳破解的两种方法

我要破解一个壳叫UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
UPX 是一款先进的可执行程序文件压缩器。压缩过的可执行文件体积缩小50%-70% ,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。
好了我们了解了这个壳是有什么作用后。。我就开始说例子啦。。。
首先用od载入。。
跟随下来。。我们先用直接f8单步进入这个方法。。
有的时候我们要看清楚jmp是否实现。。还有一些调用call的指令我们要尽量跳过或者F7跟进。。这个单步进入的例子,我跳过部分call
0040E8C0 >60            pushad   按F8下
0040E8C1    BE 15B04000   mov   esi, 0040B015
0040E8C6    8DBE EB5FFFFF   lea   edi, dword ptr
0040E8CC    57            push    edi
0040E8CD    83CD FF         or      ebp, FFFFFFFF
0040E8D0    EB 10         jmp   short 0040E8E2这个jmp是往前跳所以我们让它继续F8下
0040E8D2    90            nop这是一个nop指令通常我们也要跳过。。
0040E8D3    90            nop
0040E8D4    90            nop
0040E8D5    90            nop
0040E8D6    90            nop
0040E8D7    90            nop
0040E8D8    8A06            mov   al, byte ptr
0040E8DA    46            inc   esi
0040E8DB    8807            mov   byte ptr , al
0040E8DD    47            inc   edi
0040E8DE    01DB            add   ebx, ebx
0040E8E0    75 07         jnz   short 0040E8E9
0040E8E2    8B1E            mov   ebx, dword ptr
0040E8E4    83EE FC         sub   esi, -4
0040E8E7    11DB            adc   ebx, ebx
0040E8E9^\72 ED         jb      short 0040E8D8 它要往回跳啦 按下一步 F4跳过
0040E8EB    B8 01000000   mov   eax, 1 按F4到
0040E8F0    01DB            add   ebx, ebx
0040E8F2    75 07         jnz   short 0040E8FB
0040E8F4    8B1E            mov   ebx, dword ptr
0040E8F6    83EE FC         sub   esi, -4
按F8一直下。。。。

0040E948    11C9            adc   ecx, ecx
0040E94A    01DB            add   ebx, ebx
0040E94C^ 73 EF         jnb   short 0040E93D
0040E94E    75 09         jnz   short 0040E959
0040E950    8B1E            mov   ebx, dword ptr
0040E952    83EE FC         sub   esi, -4
0040E955    11DB            adc   ebx, ebx
0040E957^ 73 E4         jnb   short 0040E93D
0040E959    83C1 02         add   ecx, 2
0040E95C    81FD 00F3FFFF   cmp   ebp, -0D00
0040E962    83D1 01         adc   ecx, 1
0040E965    8D142F          lea   edx, dword ptr
0040E968    83FD FC         cmp   ebp, -4
0040E96B    76 0F         jbe   short 0040E97C
0040E96D    8A02            mov   al, byte ptr
0040E96F    42            inc   edx
0040E970    8807            mov   byte ptr , al
0040E972    47            inc   edi
0040E973    49            dec   ecx
0040E974^ 75 F7         jnz   short 0040E96D //这里是一个陷阱。。下一个指令也是往回转跳。。。而且再下面有nop填充指令会让我们进入程序的运行范围。。让我们无法继续破解下去。。所以我们要在0040E97C按F4跳过//
0040E976^ E9 63FFFFFF   jmp   0040E8DE
0040E97B    90            nop
0040E97C    8B02            mov   eax, dword ptr 按F4跳到
0040E97E    83C2 04         add   edx, 4
0040E981    8907            mov   dword ptr , eax
0040E983    83C7 04         add   edi, 4
0040E986    83E9 04         sub   ecx, 4
0040E989^ 77 F1         ja      short 0040E97C
0040E98B    01CF            add   edi, ecx
0040E98D^ E9 4CFFFFFF   jmp   0040E8DE 这里有一个回跳,下一指令按F4
0040E992    5E            pop   esi 按F4跳到
0040E993    89F7            mov   edi, esi
0040E995    B9 DD000000   mov   ecx, 0DD
0040E99A    8A07            mov   al, byte ptr

0040E99C    47            inc   edi
0040E99D    2C E8         sub   al, 0E8
0040E99F    3C 01         cmp   al, 1
0040E9A1^ 77 F7         ja      short 0040E99A这里有个回跳,按下一条指令F4跳过
0040E9A3    803F 00         cmp   byte ptr , 0 按F4
0040E9A6^ 75 F2         jnz   short 0040E99A这里有个回跳,按下一条指令F4跳过
0040E9A8    8B07            mov   eax, dword ptr 按F4
0040E9AA    8A5F 04         mov   bl, byte ptr
0040E9AD    66:C1E8 08      shr   ax, 8
0040E9B1    C1C0 10         rol   eax, 10
0040E9B4    86C4            xchg    ah, al
0040E9B6    29F8            sub   eax, edi
0040E9B8    80EB E8         sub   bl, 0E8
0040E9BB    01F0            add   eax, esi
0040E9BD    8907            mov   dword ptr , eax
0040E9BF    83C7 05         add   edi, 5
0040E9C2    89D8            mov   eax, ebx
0040E9C4^ E2 D9         loopd   short 0040E99F这里看见到loop。。也是一个循环的的指令,并要循环回去,下一指令按F4跳过
0040E9C6    8DBE 00C00000   lea   edi, dword ptr 按F4跳过
0040E9CC    8B07            mov   eax, dword ptr
0040E9CE    09C0            or      eax, eax
0040E9D0    74 3C         je      short 0040EA0E
0040E9D2    8B5F 04         mov   ebx, dword ptr
0040E9D5    8D8430 14EC0000 lea   eax, dword ptr
0040E9DC    01F3            add   ebx, esi
0040E9DE    50            push    eax
按F8一直走。。。。。这路还真长。。
0040E9F6    55            push    ebp
0040E9F7    FF96 A4EC0000   call    dword ptr
0040E9FD    09C0            or      eax, eax
0040E9FF    74 07         je      short 0040EA08
0040EA01    8903            mov   dword ptr , eax
0040EA03    83C3 04         add   ebx, 4
0040EA06^ EB E1         jmp   short 0040E9E9这里看见一回跳指令。下面一条是call指令,我前面说过,在这个单步F8的例子中,尽量跳过Call否值会出现程序运行的情况。。。所以我们在0040EA0E按F4跳过
0040EA08    FF96 A8EC0000   call    dword ptr
0040EA0E    61            popad 按F4跳到。。
0040EA0F- E9 B826FFFF   jmp   004010CC
0040EA14    0000            add   byte ptr , al
0040EA16    0000            add   byte ptr , al
0040EA18    0000            add   byte ptr , al
然后跳到
004010CC    55            push    ebp这里就是oep头啦。。。
004010CD    8BEC            mov   ebp, esp
004010CF    83EC 44         sub   esp, 44
004010D2    56            push    esi
004010D3    FF15 E4634000   call    dword ptr                ; kernel32.GetCommandLineA
004010D9    8BF0            mov   esi, eax
004010DB    8A00            mov   al, byte ptr
然后就可以脱壳和修复。。
第2种方法。。也是小弟经常用的脱壳手段。。
Esp定律。。。
用OD载入
0040E8C0 >60            pushad 按F8下
0040E8C1    BE 15B04000   mov   esi, 0040B015 到这里你会看到右边数据寄存器窗口esp的值是跟第一个不一样并且是发光的状态。。我们右键那个值去按到“数据窗口跟随。。”
会看到一大堆难懂的数据。。。(本人觉得堆栈区在破解。。相当有作用)
你会看看到
0012FFA438 07 91 7C FF FF FF FF F0 FF 12 00 C4 FF 12 00
在第一行的前4个数值,over这个4个数值右键-》断点-》硬件访问-》-》word
按F9直接运行到
0040EA0F- E9 B826FFFF   jmp   004010CC //直接按F8跳。。。
0040EA14    0000            add   byte ptr , al
0040EA16    0000            add   byte ptr , al
0040EA18    0000            add   byte ptr , al
跳到OEP。。
004010CC    55            push    ebp
004010CD    8BEC            mov   ebp, esp
004010CF    83EC 44         sub   esp, 44
004010D2    56            push    esi
004010D3    FF15 E4634000   call    dword ptr                ; kernel32.GetCommandLineA
又可以脱壳啦。。并且比第一种有效率。。
记得破解后记得清楚断点。。不然会出错ERROR - -ll
因为篇幅关系。。我(太懒。。)再发新帖跟大家讨论一下UPX和Aspack跟种不同方法破解。
我上传那个我破解的例子-》源文件给大家。。让大家好好脱壳练习。。点击进入下载-UPX.rar

[ 本帖最后由 best1650 于 2009-1-2 00:08 编辑 ]

iawen 发表于 2009-1-2 00:11

排版看得不太舒服,支持一下!

偶UPX都是直接用工具的,拖进去就出来了,:P

wgz001 发表于 2009-1-2 01:16

支持楼主
更支持手动
:lol

oucegen 发表于 2009-1-2 09:57

:Q 谢谢楼主分享~~谢谢

萧萧黄叶 发表于 2009-1-2 12:20

继续努力啊。

lukysex 发表于 2009-1-2 14:08

谢谢楼主分享~~谢谢:handshake

尘然枉逝 发表于 2011-5-19 17:59

学习学习不过 现在UPX脱壳工具好多了嘻嘻

topcookie 发表于 2011-5-19 21:02

讲的真好,楼主是把这个完全搞懂了,小生哥都夸奖了,厉害啊

仅有的温柔 发表于 2011-5-19 21:20

huitian200 发表于 2011-5-19 23:51

楼主讲的很详细,谢谢分享
页: [1] 2
查看完整版本: UPX脱壳破解的两种方法