下载页面:http://www.superdown.com/soft/17405.htm
软件大小:4250KB
软件语言:英文
软件类别:国外软件 / 共享版 / 编程开发
运行环境:Win9x/WinNT/2000/ME/XP
加入时间:2004-4-16 20:08:04
软件评级:***
开 发 商:http://www.sicomponents.com/rbldr.html
软件介绍:自称是自Borland Resource WorkShop 4.5后的长久期待>可以直接打开资源文件,可以导入.exe文件并可选择指定的资源以便于修改,修改后只能存为资源格式,如果直接打开表但可以类似exescope一样修改,如果是导入的话,只能看到16进制码。
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg1.10B、PEiD、LordPE、AsprDbgr、ImportREC 1.42+
—————————————————————————————————
【脱壳过程】:
如今的猛壳们把Stolen Code越做越变态,虽然大部分Stolen Code都可以分析出来,但是有点费时间。这次以Resource Builder 2.1.0.3为例来演示一种ASProtect 1.23RC4壳的Stolen Code简便解决方案。这个方法我曾经见过飞速兄用过。在壳把所有的代码解压之后、处理Stolen Code之前,把进程Dump出来,补上那段壳代码,模仿构造当时的堆栈和寄存器值环境,这样就由壳自己来解决Stolen Code的问题啦。推而广之,这个Stolen Code简便解决方案也适用于某些其他壳。
—————————————————————————————————
一、Pre-Dip:用自己的名字注册
老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。
因为程序的rbcore.dll和sicmplr.dll也是用了ASProtect加壳,所以我们先忽略所有的异常选项,当Ollydbg弹出“是压缩代码——要继续进行分析吗?”,点“否”。接着设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。
代码:
00401000 68 01A06E00 push Resbldr2.006EA001//进入OD后停在这 00401005 E8 01000000 call Resbldr2.0040100B 0040100A C3 retn
Shift+F9运行,注意看堆栈,当第2次在堆栈中看见“8wh3JAAQjOI=”硬盘指纹时,可以处理了。
代码:
0012FF3C 0012FF44 指针到下一个 SEH 记录 0012FF40 012B465C SE 句柄 0012FF44 0012FFE0 指针到下一个 SEH 记录 0012FF48 012B4C49 SE 句柄 0012FF4C 0012FF90 0012FF50 012A0000 0012FF54 00D00000 0012FF58 012B4138 0012FF5C 012D33BC ASCII "8wh3JAAQjOI="//硬盘指纹
代码:
012B46A5 3100 xor dword ptr ds:[eax],eax//异常,第2次看见硬盘指纹 012B46A7 EB 01 jmp short 012B46AA
Alt+M打开内存查看窗口,在00401000段下 内存访问断点,Shift+F9通过异常,断下
代码:
00578654 55 push ebp 00578655 8BEC mov ebp,esp 00578657 8B45 08 mov eax,dword ptr ss:[ebp+8] 0057865A 85C0 test eax,eax 0057865C 74 0C je short Resbldr2.0057866A 0057865E 8038 00 cmp byte ptr ds:[eax],0 00578661 74 07 je short Resbldr2.0057866A 00578663 C605 90046200 01 mov byte ptr ds:[620490],1 0057866A 8B15 84046200 mov edx,dword ptr ds:[620484] 00578670 8915 80046200 mov dword ptr ds:[620480],edx 00578676 A3 84046200 mov dword ptr ds:[620484],eax//注册名 0057867B 5D pop ebp 0057867C C2 0400 retn 4
过了00578676之后,[620484]处应该是保存的注册用户名,找一段空地,在613B00处写入:fly [OCN][FCG][NUKE][DCM],然后把[620484]处的值改为613B00。OK,这个Pre-Dip处理完毕。感谢lipton兄的指教。这个程序有几个功能的代码需要真正的Key才能解开,所以这只是伪注册罢了。
—————————————————————————————————
二、Dump以及区域脱壳
取消内存断点,继续Shift+F9运行。来到ASProtect最后1次典型异常处。
代码:
012B39EC 3100 xor dword ptr ds:[eax],eax//ASProtect最后1次典型异常处 012B39EE 64:8F05 00000000 pop dword ptr fs:[0] 012B39F5 58 pop eax 012B39F6 833D B07E2B01 00 cmp dword ptr ds:[12B7EB0],0 012B39FD 74 14 je short 012B3A13 012B39FF 6A 0C push 0C 012B3A01 B9 B07E2B01 mov ecx,12B7EB0 012B3A06 8D45 F8 lea eax,dword ptr ss:[ebp-8] 012B3A09 BA 04000000 mov edx,4 012B3A0E E8 2DD1FFFF call 012B0B40 012B3A13 FF75 FC push dword ptr ss:[ebp-4] 012B3A16 FF75 F8 push dword ptr ss:[ebp-8] 012B3A19 8B45 F4 mov eax,dword ptr ss:[ebp-C] 012B3A1C 8338 00 cmp dword ptr ds:[eax],0 012B3A1F 74 02 je short 012B3A23 012B3A21 FF30 push dword ptr ds:[eax] 012B3A23 FF75 F0 push dword ptr ss:[ebp-10] 012B3A26 FF75 EC push dword ptr ss:[ebp-14] 012B3A29 C3 retn//此处下断,Shift+F9断下
此时ESP=0012FF5C,看看堆栈,使用ESP定律
代码:
0012FF5C 012CE9DC 0012FF60 00400000 ASCII "MZP" 0012FF64 C244FCB6 0012FF68 0012FFA4//注意这里 ★
0012FF68=0012FFA4,选中0012FF68转存处的4个字节,下“硬件访问->Word”断点。F9运行,中断下来
代码:
012C6A41 EB 44 jmp short 012C6A87//断在这里 012C6A43 EB 01 jmp short 012C6A46 012C6A46 51 push ecx 012C6A47 57 push edi 012C6A48 9C pushfd 012C6A49 FC cld 012C6A4A BF 00000000 mov edi,0 012C6A4F B9 00000000 mov ecx,0 012C6A54 F3:AA rep stos byte ptr es:[edi]//这里下断 012C6A56 9D popfd 012C6A57 5F pop edi 012C6A58 59 pop ecx 012C6A59 C3 retn
代码:
012C6A87 03C3 add eax,ebx 012C6A89 BB 8B070000 mov ebx,78B//注意这个值 ★ 012C6A8E 0BDB or ebx,ebx 012C6A90 75 07 jnz short 012C6A99
代码:
012C6A99 E8 00000000 call 012C6A9E 012C6A9E 5D pop ebp 012C6A9F 81ED 4DE14B00 sub ebp,4BE14D 012C6AA5 8D85 F2E04B00 lea eax,dword ptr ss:[ebp+4BE0F2] 012C6AAB 8D8D 94E14B00 lea ecx,dword ptr ss:[ebp+4BE194] 012C6AB1 03CB add ecx,ebx 012C6AB3 8941 01 mov dword ptr ds:[ecx+1],eax 012C6AB6 8D85 36E14B00 lea eax,dword ptr ss:[ebp+4BE136] 012C6ABC 8D8D FAE04B00 lea ecx,dword ptr ss:[ebp+4BE0FA] 012C6AC2 8901 mov dword ptr ds:[ecx],eax 012C6AC4 B8 5E140000 mov eax,145E 012C6AC9 8D8D FFE04B00 lea ecx,dword ptr ss:[ebp+4BE0FF] 012C6ACF 8901 mov dword ptr ds:[ecx],eax 012C6AD1 8D8D 94E14B00 lea ecx,dword ptr ss:[ebp+4BE194] 012C6AD7 8D85 94F34B00 lea eax,dword ptr ss:[ebp+4BF394] 012C6ADD 51 push ecx 012C6ADE 50 push eax 012C6ADF E8 76FFFFFF call 012C6A5A 012C6AE4 61 popad//下面开始处理Stolen Code ★ 012C6AE5 EB 02 jmp short 012C6AE9
OK,现在我们不去分析这个东东的Stolen Code,程序代码已经解开,可以用LordPE纠正ImageSize后完全DUMP这个进程了!
接着 区域脱壳:012C0000,大小=00008000,也就是脱出上面的部分壳处理代码段。
下面走至伪OEP:在012C6A54处下断,F9运行,断下。
代码:
012C6A54 F3:AA rep stos byte ptr es:[edi]//断下 012C6A56 9D popfd 012C6A57 5F pop edi 012C6A58 59 pop ecx 012C6A59 C3 retn//飞向光明之巅!返回程序004072DC
代码:
004072DC FF25 1CA36200 jmp dword ptr ds:[62A31C]//第1个函数啦
F7走下去,来到伪OEP处。当然这个东东的Stolen Code也不难分析出来,这里只是作为一个例子来演示罢了。
代码:
00613652 61 popad 00613653 0000 add byte ptr ds:[eax],al 00613655 0000 add byte ptr ds:[eax],al 00613657 0000 add byte ptr ds:[eax],al 00613659 0000 add byte ptr ds:[eax],al 0061365B 0000 add byte ptr ds:[eax],al 0061365D 0000 add byte ptr ds:[eax],al 0061365F E8 3C3DDFFF call Resbldr2.004073A0//伪OEP ★ 00613664 33C0 xor eax,eax 00613666 55 push ebp 00613667 68 B6366100 push Resbldr2.006136B6 0061366C 64:FF30 push dword ptr fs:[eax] 0061366F 64:8920 mov dword ptr fs:[eax],esp 00613672 A1 EC4E6200 mov eax,dword ptr ds:[624EEC] 00613677 8B00 mov eax,dword ptr ds:[eax] 00613679 E8 86C2E8FF call Resbldr2.0049F904 0061367E A1 EC4E6200 mov eax,dword ptr ds:[624EEC] 00613683 8B00 mov eax,dword ptr ds:[eax] 00613685 BA CC366100 mov edx,Resbldr2.006136CC; ASCII "Resource Builder 2.0" 0061368A E8 6DBEE8FF call Resbldr2.0049F4FC
现在我们来“组装”一下dumped.exe。呵呵,用LordPE打开dumped.exe,从磁盘载入刚才区域脱壳的Region012C0000-012C8000.dmp区段,修改其Voffset=00EC0000,只保留LordPE的“验证PE”选项,重建PE。Dump完成!
—————————————————————————————————
三、用AsprDbgr搞定输入表
代码:
AsprDbgr v1.0beta (:P) Made by me... Manko. iEP=401000 (E:\试炼场\脱壳学习\ASProtect\Resource Builder 2.0\Resbldr2.exe GST returns to: 12A2667 Trick aspr GST... (EAX=12121212h) GV returns to: 12B1A61 IAT Start: 62A21C End: 62ABAC Length: 990 IATentry 62A23C = 12B1C8C resolved as GetVersion IATentry 62A270 = 12B17A4 resolved as GetProcAddress IATentry 62A274 = 12B1C64 resolved as GetModuleHandleA IATentry 62A288 = 12B1CD8 resolved as GetCommandLineA IATentry 62A31C = 12B1C64 resolved as GetModuleHandleA IATentry 62A3CC = 12B1CC8 resolved as LockResource IATentry 62A410 = 12B1C8C resolved as GetVersion IATentry 62A434 = 12B17A4 resolved as GetProcAddress IATentry 62A43C = 12B1C64 resolved as GetModuleHandleA IATentry 62A474 = 12B1CC0 resolved as GetCurrentProcessId IATentry 62A480 = 12B1CF0 resolved as FreeResource SymbolInitialize seems to have frozen. Any invalid IAT entries was NOT erased... Dip-Table at adress: 12B7AB4 0 578654 0 578694 5786C4 578728 0 6122C0 612CF8 5785DC 578610 578644 578 0 Last SEH passed. Searching for signatures. Singlestepping to OEP! Call + OEP-jump-setup at: 12C6A99 ( Code: E8000000 5D81ED ) Mutated, stolen bytes at: 12C6AE4 ( Code: 61EB02CD 20EB01F0 ) Erase of stolen bytes at: 12C6A48 ( Code: 9CFCBF87 6A2C01B9 ) Repz ... found. Skipping erase of stolen bytes. ;) Dip from pre-OEP: 4072DC (Reached from: 12C6A59) Sugested tempOEP at: 61365F GST returns to: 76171AC0
运行ImportREC 1.42+,选择这个进程。填入:RVA=0022A21C,Size=00000990,点IT AutoSearch,点“Get Import”,剪切掉几个无效的函数,把OEP改为00EC0000,FixDump!
—————————————————————————————————
四、以壳解壳:Stolen Code简便解决方案
现在的OEP是012C0000,修改其入口代码为:
代码:
012C0000 BB 8B070000 mov ebx,78B 012C0005 E9 8F6A0000 jmp dumped_.012C6A99
这样就利用了原壳的代码来处理Stolen Code了。保存之后就可以运行了。
—————————————————————————————————
五、2个暗桩的修复
1、另外当点击“Option”时会自动退出,跟踪程序找到异常出错的地方
代码:
0057AF65 E8 A2D9FFFF call dumped_.0057890C//把这里NOP掉就行了 0057AF6A 33C0 xor eax,eax
代码:
0057890C 55 push ebp 0057890D 8BEC mov ebp,esp 0057890F 51 push ecx 00578910 53 push ebx 00578911 8B05 1E784000 mov eax,dword ptr ds:[40781E] 00578917 8B18 mov ebx,dword ptr ds:[eax] 00578919 FF33 push dword ptr ds:[ebx] 0057891B 895D FC mov dword ptr ss:[ebp-4],ebx 0057891E 8F03 pop dword ptr ds:[ebx]//异常 00578920 8B45 FC mov eax,dword ptr ss:[ebp-4] 00578923 5B pop ebx 00578924 59 pop ecx 00578925 5D pop ebp 00578926 C3 retn
————————————————————————
2、点击“Link To EXE”时会自动退出
代码:
005788C4 55 push ebp 005788C5 8BEC mov ebp,esp 005788C7 51 push ecx 005788C8 C645 FF 00 mov byte ptr ss:[ebp-1],0 005788CC A1 48486200 mov eax,dword ptr ds:[624848] 005788D1 8038 00 cmp byte ptr ds:[eax],0 005788D4 75 19 jnz short 005788EF 005788D6 56 push esi 005788D7 8B35 68666200 mov esi,dword ptr ds:[626668] 005788DD 8B46 3C mov eax,dword ptr ds:[esi+3C] 005788E0 8B4430 28 mov eax,dword ptr ds:[eax+esi+28];00ECC000//取入口地址 005788E4 66:3D 0010 cmp ax,1000//比较后面是否是1000 005788E8 74 04 je short UnPacked.005788EE//改为JMP 005788EA 804D FF 01 or byte ptr ss:[ebp-1],1 005788EE 5E pop esi 005788EF 807D FF 00 cmp byte ptr ss:[ebp-1],0 005788F3 74 13 je short 00578908
原来005788E4这里还检测了原程序的入口地址,改为JMP就行了。
“Edit as Text”和“Link To EXE”的功能代码是需要真正的Key才能解压的,没办法啦。
—————————————————————————————————
代码:
, _/ /| _.-~/ \_ , 青春都一晌 ( /~ / \~-._ |\ `\\ _/ \ ~\ ) 忍把浮名 _-~~~-.) )__/;;,. \_ //' /'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了破解轻狂 `~ _( ,_..--\ ( ,;'' / ~-- /._`\ /~~//' /' `~\ ) /--.._, )_ `~ " `~" " `" /~'`\ `\\~~\ " " "~' ""
Cracked By 巢水工作坊——fly [OCN][FCG][NUKE][DCM]
2004-05-13 17:00