[原创]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 ] 习惯!自己先顶! 支持原创。顶 支持!顶一下吧
关于上传附件问题
可能有些兄弟传不了,不过多在PYG混混就有了~~~~~~~~~~~~ 支持原创。 谢谢兄弟门!~ 多谢大家分享!~!~!~!~ 好的,顶你一下。
页:
[1]