吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 38244|回复: 16
收起左侧

[分享] UPX脱壳破解的两种方法

  [复制链接]
best1650 发表于 2009-1-2 00:05
我要破解一个壳叫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 [esi+FFFF5FEB]
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 [esi]
0040E8DA    46              inc     esi
0040E8DB    8807            mov     byte ptr [edi], al
0040E8DD    47              inc     edi
0040E8DE    01DB            add     ebx, ebx
0040E8E0    75 07           jnz     short 0040E8E9
0040E8E2    8B1E            mov     ebx, dword ptr [esi]
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 [esi]
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 [esi]
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 [edi+ebp]
0040E968    83FD FC         cmp     ebp, -4
0040E96B    76 0F           jbe     short 0040E97C
0040E96D    8A02            mov     al, byte ptr [edx]
0040E96F    42              inc     edx
0040E970    8807            mov     byte ptr [edi], 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 [edx] 按F4跳到
0040E97E    83C2 04         add     edx, 4
0040E981    8907            mov     dword ptr [edi], 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 [edi]

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 [edi], 0 按F4
0040E9A6  ^ 75 F2           jnz     short 0040E99A这里有个回跳,按下一条指令F4跳过
0040E9A8    8B07            mov     eax, dword ptr [edi] 按F4
0040E9AA    8A5F 04         mov     bl, byte ptr [edi+4]
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 [edi], 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 [esi+C000] 按F4跳过
0040E9CC    8B07            mov     eax, dword ptr [edi]
0040E9CE    09C0            or      eax, eax
0040E9D0    74 3C           je      short 0040EA0E
0040E9D2    8B5F 04         mov     ebx, dword ptr [edi+4]
0040E9D5    8D8430 14EC0000 lea     eax, dword ptr [eax+esi+EC14]
0040E9DC    01F3            add     ebx, esi
0040E9DE    50              push    eax
按F8一直走。。。。。这路还真长。。
0040E9F6    55              push    ebp
0040E9F7    FF96 A4EC0000   call    dword ptr [esi+ECA4]
0040E9FD    09C0            or      eax, eax
0040E9FF    74 07           je      short 0040EA08
0040EA01    8903            mov     dword ptr [ebx], eax
0040EA03    83C3 04         add     ebx, 4
0040EA06  ^ EB E1           jmp     short 0040E9E9这里看见一回跳指令。下面一条是call指令,我前面说过,在这个单步F8的例子中,尽量跳过Call否值会出现程序运行的情况。。。所以我们在0040EA0E按F4跳过
0040EA08    FF96 A8EC0000   call    dword ptr [esi+ECA8]
0040EA0E    61              popad 按F4跳到。。
0040EA0F  - E9 B826FFFF     jmp     004010CC
0040EA14    0000            add     byte ptr [eax], al
0040EA16    0000            add     byte ptr [eax], al
0040EA18    0000            add     byte ptr [eax], 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 [4063E4]               ; kernel32.GetCommandLineA
004010D9    8BF0            mov     esi, eax
004010DB    8A00            mov     al, byte ptr [eax]
然后就可以脱壳和修复。。
第2种方法。。也是小弟经常用的脱壳手段。。
Esp定律。。。
用OD载入
0040E8C0 >  60              pushad 按F8下
0040E8C1    BE 15B04000     mov     esi, 0040B015 到这里你会看到右边数据寄存器窗口esp的值是跟第一个不一样并且是发光的状态。。我们右键那个值去按到“数据窗口跟随。。”
会看到一大堆难懂的数据。。。(本人觉得堆栈区在破解。。相当有作用)
你会看看到
0012FFA4  38 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 [eax], al
0040EA16    0000            add     byte ptr [eax], al
0040EA18    0000            add     byte ptr [eax], 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 [4063E4]               ; kernel32.GetCommandLineA
又可以脱壳啦。。并且比第一种有效率。。
记得破解后记得清楚断点。。不然会出错ERROR - -ll
因为篇幅关系。。我(太懒。。)再发新帖跟大家讨论一下UPX和Aspack跟种不同方法破解。
我上传那个我破解的例子-》源文件给大家。。让大家好好脱壳练习。。点击进入下载-UPX.rar

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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
銘鈊 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

iawen 发表于 2009-1-2 00:11
排版看得不太舒服,支持一下!

偶UPX都是直接用工具的,拖进去就出来了,:P
wgz001 发表于 2009-1-2 01:16
oucegen 发表于 2009-1-2 09:57
萧萧黄叶 发表于 2009-1-2 12:20
继续努力啊。
lukysex 发表于 2009-1-2 14:08
谢谢楼主分享~~谢谢
尘然枉逝 发表于 2011-5-19 17:59
学习学习  不过 现在UPX脱壳工具好多了嘻嘻
topcookie 发表于 2011-5-19 21:02
讲的真好,楼主是把这个完全搞懂了,小生哥都夸奖了,厉害啊
头像被屏蔽
仅有的温柔 发表于 2011-5-19 21:20
提示: 作者被禁止或删除 内容自动屏蔽
huitian200 发表于 2011-5-19 23:51
楼主讲的很详细,谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-11 02:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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