Obsidium V1.3.0.0-V1.3.0.4 UnPacK Script 演示
还是写个简单的脚本演示吧。
―――――――――――――――――――――――――――――――――
一、PEiD Sign
[Obsidium V1.3.0.0 -> Obsidium Software]
signature = EB 04 ?? ?? ?? ?? E8 ?? 00 00 00
ep_only = true
[Obsidium V1.3.0.4 -> Obsidium Software]
signature = EB 02 ?? ?? E8 ?? 00 00 00
ep_only = true
―――――――――――――――――――――――――――――――――
二、脚本说明
1、此脚本仅仅支持Obsidium V1.3.0.0和V1.3.0.4加壳程序,不支持其他版本
2、可以在Win2K.SP4/WinXP.SP2上使用,其他NT系统平台需要修改相关函数地址,不支持Win98
3、Get.eXe.PE.Information.osc为包含脚本,和Obsidium V1.3.0.0.osc必须放在相同目录下
4、heXer & fly 合作完成。由于要修复部分特殊函数的分支处理,所以写得很乱,各位见笑了。
5、SDK和某分支处理的特殊函数需要手动修复。Obsidium V1.3增强了输入表函数的加密,下次要换个思路来修复。
6、最后用Obsidium V1.3.0.4加壳Win98记事本来简单演示一下如何使用此脚本。
7、如果Obsidium重定位后的地址低于原eXe的基址,则需要手动处理Obsidium的重定位过程,不过这种情况很少见。
8、脚本已经处理了反跟踪,可以使用OllyDBG原版来运行此脚本。
―――――――――――――――――――――――――――――――――
三、运行脚本
清除掉以前的所有断点,设置OllyDBG忽略所有异常选项,虽然脚本已经对异常进行了处理,但还是要求忽略所有异常,免得麻烦。载入Test.Obsidium V1.3.0.4.exe
00407000 EB 02 jmp short Test_Obs.00407004
//暂停在壳入口 如果不是暂停在EP,请设置OllyDBG事件选项
00407002 94 xchg eax,esp
运行脚本。Plugins->OllyScript->Run Script->Obsidium V1.3.0.0.osc
选择“是”,脚本开始运行。弹出第2个对话框,提示某些api需要手动修复
第3个对话框弹出后我们要准备修复StolenOEPCode
确定后脚本结束。F7
0090D444 61 popad ; Fixed ImportTable.
//此时我们暂停在这里
0090D445 EB 04 jmp short 0090D44B ; There is some Special API need Handed Repaired.
0090D44B 9D popfd
0090D44C EB 03 jmp short 0090D451
0090D451 E9 7D3C0500 jmp 009610D3 ; Jump StolenOEP ! Found by heXer & fly
//飞向光明之颠
看看堆栈:
0012FF78 FFFFFFFF
0012FF7C 00908BC4
0012FF80 00908BC8
寄存器:
ESP=0012FF78
EBP=0012FFC0
ESI=FFFFFFFF
找个Visual C++ 6.0的程序参考一下,Win98的WRITE.EXE
0040100C 55 push ebp
0040100D 8BEC mov ebp,esp
0040100F 83EC 44 sub esp,44
00401012 56 push esi
00401013 FF15 58204000 call dword ptr ds:[402058] ; kernel32.GetCommandLineA
Alt+M设置00960000区段为完整权限,否则会提示:
Unable to read memory of debugged process (00960000..00968FFF).
修复StolenOEPCode如下:
009610CC 55 push ebp
009610CD 8BEC mov ebp,esp
009610CF 83EC 44 sub esp,44
009610D2 56 push esi
009610D3 FF15 E0639600 call dword ptr ds:[9663E0] ; kernel32.GetCommandLineA
009610D9 8BF0 mov esi,eax
009610DB 8A00 mov al,byte ptr ds:[eax]
009610DD 3C 22 cmp al,22
009610DF 75 13 jnz short 009610F4
用LoadPE完全dump出Test.Obsidium V1.3.0.4.exe进程,区域dump出00960000-00969000段,Load入dump.exe,修改新区段VirtualAddress=00560000。只保留Rebuilder的Validate PE选项Rebuild dump.exe
―――――――――――――――――――――――――――――――――
四、输入表
在转存中察看输入表函数的开始和结束地址。
运行ImportRec,OEP=005610CC、RVA=005662E0、Size=0000023C
会发现有几个无效指针,注意了,某些是填充在DLL之间的垃圾数据,而某些是待修复函数
如005662F4处明显是填充在DLL之间的垃圾数据,直接Cut掉
1 005662F0 advapi32.dll 01CE RegCreateKeyA
0 005662F4 ? 0000 0097070A
1 005662F8 gdi32.dll 01A6 GetStockObject
而下面这些则是需要修复的函数:
1 00566368 kernel32.dll 0252 LocalUnlock
0 0056636C ? 0000 00970090
1 00566370 kernel32.dll 024C LocalFree
1 00566374 kernel32.dll 0248 LocalAlloc
0 00566378 ? 0000 009700B4
1 0056637C kernel32.dll 01EB GlobalAlloc
下面再说说如何修复这些函数吧。
现在我们用UEStudio打开Obsidium V1.3.0.0.osc,找到下面这行
log FixCode1
//jmp Final
把//jmp Final前的//去掉,这样脚本就不处理输入表,直接去OEP了
新开一个OllyDBG,载入Test.Obsidium V1.3.0.4.exe,运行修改后的脚本,走至StolenOEP
设置目前代码所在区段为完整权限,找到那些调用待修复函数的地方。如搜索常数:96636C
009634C6 FF15 6C639600 call dword ptr ds:[96636C]
找到这里,Ctrl+* 在009634C6处新建EIP,跟进去看看处理
00970090 60 pushad
00970091 66:BF A665 mov di,65A6
00970095 B2 3A mov dl,3A
00970097 E9 4370F9FF jmp 009070DF
009070DF EB 03 jmp short 009070E4
一直F7走就能看见正确的API了,当然,不是每个处理都一样的
0090166A FFB6 A5050000 push dword ptr ds:[esi+5A5] ; kernel32._llseek
00901670 FF93 84000000 call dword ptr ds:[ebx+84]
所以0056636C应该修复成kernel32.dll _llseek
看到API后就不必再F7了,搜索其他常数:00966378
009632EA FF15 78639600 call dword ptr ds:[966378]
F7跟踪会看到这里
00901514 FFB6 FB060000 push dword ptr ds:[esi+6FB] ; kernel32._lclose
找齐函数后就可以FixDump
Game Over
―――――――――――――――――――――――――――――――――
, _/
/| _.-~/ \_ , 青春都一晌
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了脱壳轻狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
UnPacKed By : heXer & fly
2005-11-01 16:00