wynney 发表于 2005-4-18 06:03:47

[原创]UPX-Scrambler RC1.x - ㎡nT畂L简单脱壳有3法

[目的]:完全技术交流,引起大家多破解的兴趣!高手不要见笑,我是一只菜菜鸟!
[目标]:在这张帖子里面http://www.chinadfcg.com/viewthread.php?tid=143796


今天在DFCG论坛上看到有位朋友请求脱这个壳,就拿来研究了下,方法有3种很多~我就说说用ESP脱的方法吧

首先有PEID查壳为UPX-Scrambler RC1.x - ㎡nT畂L的壳,UPX的壳都很简单!建议新手学习下,我也是新手。
用OD载入程序,提示“是压缩代码吗?是否继续分析?”我们选择“否”!

0051E7DF A>90            nop            /程序入口
0051E7E0   61            popad          /F8单步到这里
0051E7E1   BE 00905000   mov esi,AboutUS.00509000   /F8单步到这里
0051E7E6   8DBE 0080EFFF lea edi,dword ptr ds:   /F8单步到这里
0051E7EC   57            push edi         /F8单步到这里
0051E7ED   83CD FF       or ebp,FFFFFFFF/F8单步到这里,看看右边寄存器窗口内容,ESP突现!
0051E7F0   EB 10         jmp short AboutUS.0051E802
0051E7F2   EB 00         jmp short AboutUS.0051E7F4
0051E7F4   ^ EB EA         jmp short AboutUS.0051E7E0
0051E7F6   ^ EB E8         jmp short AboutUS.0051E7E0
我们就先停在这里,在OD下边命令框框里面输入“hr 0012ffe0”,回车。F9运行

来到这里
0051E8C7   89F7          mov edi,esi; AboutUS.00401000   /停在这里了,在这里我们先取消断点。“调试”-->"硬件断点"删除我们设置的断点
0051E8C9   B9 1F000000   mov ecx,1F       /F8单步下去
0051E8CE   8A07          mov al,byte ptr ds:
0051E8D0   47            inc edi
0051E8D1   2C E8         sub al,0E8
0051E8D3   3C 01         cmp al,1
0051E8D5   ^ 77 F7         ja short AboutUS.0051E8CE   /要往回跳了
0051E8D7   803F 05       cmp byte ptr ds:,5       /在这里F4
0051E8DA   ^ 75 F2         jnz short AboutUS.0051E8CE    /继续F8下去
0051E8DC   8B07          mov eax,dword ptr ds:
0051E8DE   8A5F 04       mov bl,byte ptr ds:
0051E8E1   66:C1E8 08    shr ax,8
0051E8E5   C1C0 10       rol eax,10
0051E8E8   86C4          xchg ah,al
0051E8EA   29F8          sub eax,edi
0051E8EC   80EB E8       sub bl,0E8
0051E8EF   01F0          add eax,esi
0051E8F1   8907          mov dword ptr ds:,eax
0051E8F3   83C7 05       add edi,5
0051E8F6   89D8          mov eax,ebx
0051E8F8   ^ E2 D9         loopd short AboutUS.0051E8D3      /要往回跳了
0051E8FA   8DBE 00C01100 lea edi,dword ptr ds: /在这里F4
0051E900   8B07          mov eax,dword ptr ds:      /继续F8下去
0051E902   09C0          or eax,eax
0051E904   74 45         je short AboutUS.0051E94B
0051E906   8B5F 04       mov ebx,dword ptr ds:
0051E909   8D8430 38E611>lea eax,dword ptr ds:
0051E910   01F3          add ebx,esi
0051E912   50            push eax
0051E913   83C7 08       add edi,8
0051E916   FF96 74E61100 call dword ptr ds:   /在这里进入了一个循环,进入了系统的领空,到这里来了

77E5D966   53            push ebx   ; AboutUS.00401000   /来到这里,我们不管,继续F8单步跟踪
77E5D967   56            push esi
77E5D968   74 19         je short kernel32.77E5D983
77E5D96A   68 443EE677   push kernel32.77E63E44      ; ASCII "twain_32.dll"
77E5D96F   FF7424 10   push dword ptr ss:
77E5D973   FF15 9813E477 call dword ptr ds:[<&ntdll._strcmpi>]   ; ntdll._stricmp
77E5D979   85C0          test eax,eax
77E5D97B   59            pop ecx
77E5D97C   59            pop ecx
77E5D97D   0F84 2F880100 je kernel32.77E761B2
77E5D983   6A 00         push 0
77E5D985   6A 00         push 0
77E5D987   FF7424 14   push dword ptr ss:
77E5D98B   E8 B1FFFFFF   call kernel32.LoadLibraryExA
77E5D990   5E            pop esi
77E5D991   5B            pop ebx
77E5D992   C2 0400       retn 4      /跟踪到这里,回到程序领空,来到下面


0051E91C   95            xchg eax,ebp      /来到这里
0051E91D   8A07          mov al,byte ptr ds:/继续F8单步
0051E91F   47            inc edi
0051E920   08C0          or al,al
0051E922   ^ 74 DC         je short AboutUS.0051E900
0051E924   89F9          mov ecx,edi
0051E926   79 07         jns short AboutUS.0051E92F      /跳,跳到了这里

0051E92F   57            push edi    ; AboutUS.0051D009   /停到这里了
0051E930   48            dec eax                        /继续F8单步
0051E931   F2:AE         repne scas byte ptr es:
0051E933   55            push ebp
0051E934   FF96 78E61100 call dword ptr ds:   /又一次进入系统领空了,不管,继续,来到下面了

77E5B33C   BB FFFF0000   mov ebx,0FFFF       /来到这里
77E5B341   3BFB          cmp edi,ebx         /继续F8单步
77E5B343   ^ 0F86 894BFFFF jbe kernel32.77E4FED2
77E5B349   57            push edi
77E5B34A   8D45 F8       lea eax,dword ptr ss:
77E5B34D   50            push eax
77E5B34E   FF15 8012E477 call dword ptr ds:[<&ntdll.RtlInitString>]   ; ntdll.RtlInitString
77E5B354   8D45 0C       lea eax,dword ptr ss:
77E5B357   50            push eax
77E5B358   6A 00         push 0
77E5B35A   8D45 F8       lea eax,dword ptr ss:
77E5B35D   50            push eax
77E5B35E   6A 00         push 0
77E5B360   FF75 08       push dword ptr ss:
77E5B363   E8 24F9FFFF   call kernel32.77E5AC8C
77E5B368   50            push eax
77E5B369   E8 BEFFFFFF   call <jmp.&ntdll.LdrGetProcedureAddress>/有个跳转,仍然没跳出系统领空,来到下面这里

77F5F892   A1 5046FC77   mov eax,dword ptr ds:   /来到这里
77F5F897   85C0          test eax,eax               /F8继续
77F5F899   74 03         je short ntdll.77F5F89E      /跳
77F5F89B   51            push ecx
77F5F89C   FFD0          call eax
77F5F89E   834D FC FF    or dword ptr ss:,FFFFFFFF
77F5F8A2   E8 0B000000   call ntdll.77F5F8B2
77F5F8A7   8B45 98       mov eax,dword ptr ss:
77F5F8AA   ^ E9 5BFEFFFF   jmp ntdll.77F5F70A            /要往回跳了
77F5F8AF   8B5D E4       mov ebx,dword ptr ss:/在这里F4下来,发现来到了上一个系统领空
77F5F8B2   85DB          test ebx,ebx
77F5F8B4   74 21         je short ntdll.77F5F8D7


77E5B36E   85C0          test eax,eax/来到了这里
77E5B370   ^ 0F8C 9316FFFF jl kernel32.77E4CA09          /F8继续
77E5B376   6A 00         push 0
77E5B378   FF75 08       push dword ptr ss:
77E5B37B   E8 0CF9FFFF   call kernel32.77E5AC8C
77E5B380   3945 0C       cmp dword ptr ss:,eax
77E5B383   0F84 D02A0200 je kernel32.77E7DE59
77E5B389   8B45 0C       mov eax,dword ptr ss:
77E5B38C   5F            pop edi
77E5B38D   5B            pop ebx
77E5B38E   C9            leave
77E5B38F   C2 0800       retn 8            /继续单步到了这里,跳回到了程序的领空,来到下面

0051E93A   09C0          or eax,eax       /来到了这里
0051E93C   74 07         je short AboutUS.0051E945      /F8继续
0051E93E   8903          mov dword ptr ds:,eax
0051E940   83C3 04       add ebx,4
0051E943   ^\EB D8         jmp short AboutUS.0051E91D      /要往回跳了
0051E945   FF96 7CE61100 call dword ptr ds:
0051E94B   60            pushad          /PUSHAD关键提示,记着在这里F4下来
0051E94C   - E9 FF28EEFF   jmp AboutUS.00401250         /F8到了这里,看看它是要从0051E94C跳到00401250,大的跳转跨段,应该到的OEP了!跳到了下面
0051E951   0000          add byte ptr ds:,al
0051E953   0000          add byte ptr ds:,al


00401250   68 24895100   push AboutUS.00518924       /我们在这里DUMP
00401255   E8 F0FFFFFF   call AboutUS.0040124A                        ; jmp to MSVBVM60.ThunRTMain
0040125A   0000          add byte ptr ds:,al
0040125C   0000          add byte ptr ds:,al
0040125E   0000          add byte ptr ds:,al
00401260   3000          xor byte ptr ds:,al

OD自带的DUMP插件提供了两种脱法,我们就用呵责两种都分别脱一个,随便保存一个名字,我保存的是1.exe和2.exe。运行一下,发现都不能够运行!这时请出ImportREC 1.6
选择OD调试的进程,在OEP处添上1250点“IAT自动搜索”,点“获取输入信息”哈哈~发现没有发现假指针,真是爽啊!点“修理抓取文件”选择刚才保存的1.exe和2.exe,这时ImportREC 1.6会自动给保存1_.exe和2_.exe,这个就是修复后的文件了,打开他们试试~OK都可以运行了(题外话:我使用ImportREC 1.4修复的话只有2_.exe可以运行,这就要求我们在做脱壳破解的时候要有耐心,多试!)

再用PEID查壳是Microsoft Visual Basic 5.0 / 6.0写的程序,没壳了!~这个壳很简单,大家兴趣的拿来试试吧~
最后还是要优化程序的~请出LordPE重建PE,完了OK了!




还是附上另一种简单方法吧:

载入程序之后~看看入口处是不是有这样一段代码
0051E7E0   61            popad
那么我们就Ctrl+F输入pushad就来到了
0051E943   ^\EB D8         jmp short AboutUS.0051E91D   
0051E945   FF96 7CE61100 call dword ptr ds:
0051E94B   60            pushad          /直接就来到了这里!PUSHAD关键提示,在这里F4下来!
0051E94C   - E9 FF28EEFF   jmp AboutUS.00401250
其他就是一样的了!~


还有一个方法是打开内存镜像下内存断点,很简单!就作为大家的课后作业去试试了!~~先睡一会~~哈哈~



PS:让各位大虾见笑!小弟如有错误之处请指出!

再PS:上传附件要求这么严格啊~?

[ Last edited by wynney on 2005-4-18 at 06:08 AM ]

wynney 发表于 2005-4-18 06:04:32

习惯!自己先顶!

yygx 发表于 2005-4-18 10:22:23

支持原创。顶

hrbx 发表于 2005-4-18 16:51:47

支持!顶一下吧

yijun 发表于 2005-4-18 17:18:03

关于上传附件问题

可能有些兄弟传不了,不过多在PYG混混就有了~~~~~~~~~~~~

xbb[DFCG] 发表于 2005-4-18 19:53:30

支持原创。

wynney 发表于 2005-4-19 21:10:13

谢谢兄弟门!~

gameness 发表于 2005-4-20 01:14:07

多谢大家分享!~!~!~!~

cd37ycs 发表于 2005-5-9 18:10:28

好的,顶你一下。
页: [1]
查看完整版本: [原创]UPX-Scrambler RC1.x - ㎡nT畂L简单脱壳有3法