UPX脱壳破解的两种方法
我要破解一个壳叫UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & LaszloUPX 是一款先进的可执行程序文件压缩器。压缩过的可执行文件体积缩小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 编辑 ] 排版看得不太舒服,支持一下!
偶UPX都是直接用工具的,拖进去就出来了,:P 支持楼主
更支持手动
:lol :Q 谢谢楼主分享~~谢谢 继续努力啊。 谢谢楼主分享~~谢谢:handshake 学习学习不过 现在UPX脱壳工具好多了嘻嘻 讲的真好,楼主是把这个完全搞懂了,小生哥都夸奖了,厉害啊 楼主讲的很详细,谢谢分享
页:
[1]
2