Obsidium V1.1.1.4 脱壳――jingulong兄的UnPackIt.EXE
Obsidium:
http://www.obsidium.de/show.php?download
软件大小: 1 MB
【软件简介】:The Obsidium software protection and licensing system allows you to protect your program from unauthorized modifications (i.e. "cracking") and provides you with a reliable yet easy to implement licensing system. 看雪工具栏介绍:“一款优秀的壳,它可以分块加密等。
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg、PEiD、LordPE、ImportREC
―――――――――――――――――――――――――――――――――
【脱壳过程】:
因为Obsidium对程序代码重定位,使得脱壳有点烦人。壳把原程序的资源放在00002000,为了省点事不移动资源段,我学习了ZILOT大侠脱Obsidium V1.0.0.61主程序的方法,最后补上了重定位后的代码段。当然,这样脱壳不算完美,只是能运行罢了。
jingulong兄可能是为了降低脱壳的难度,所以拿Win98的记事本做了这个UnPackIt,使得脱壳稍微轻松点。Obsidium V1.1.1.4主程序的脱壳比较麻烦,需要修复加密代码或者补上解密代码段。
―――――――――――――――――――――――――――――――――
一、寻找OEP、Dump进程
老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。忽略除了“整数被0除”之外的所有其他异常选项。
00407000 EB 02 jmp short unpackit.00407004//进入OD后停在这
003A161B F7F0 div eax//第1次异常
003A4FA9 F7F0 div eax//第2次异常
003A5363 F7F0 div eax//第3次异常
003A54D9 F7F0 div eax//第4次异常 输入表处理
003A381D F7F0 div eax//第5次异常
003A3BD1 F7F0 div eax//第6次异常
003A381D F7F0 div eax//第7次异常
003A3BD1 F7F0 div eax//第8次异常
00408818 F7F0 div eax//第9次异常 跳OEP
OK,当第5次003A381D异常时,Ctrl+G:003A54D9 (第4次异常地址)
到达 003A3BD1 时 Ctrl+F 搜索命令:test word ptr ds:[esi],20
003A64F0 66:F706 2000 test word ptr ds:[esi],20//找到这里
003A64F5 74 59 je short 003A6550
呵呵,记下这个:003A64F0 ◆ 这一步为下面的修复输入表提供点方便啦
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
看看00408818处第9次异常的堆栈:
0012FF4C 0012FFE0 指针到下一个 SEH 记录
0012FF50 0040884C SE 句柄//此处下断
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
0040884C C8 000000 enter 0,0//此处下断,Shift+F9断在这
00408850 EB 02 jmp short unpackit.00408854
Ctrl+F 在当前位置下搜索命令:mov dword ptr ds:[eax+0B8],edx 在004088D9处
004088D9 8990 B8000000 mov dword ptr ds:[eax+B8],edx//此处下断,F9断在这 EDX=00408B78
004088DF EB 03 jmp short unpackit.004088E4
Ctrl+G:00408B78 下断,F9运行,断下
00408B78 E8 B7000000 call unpackit.00408C34//F7进入
00408C34 F8 clc
00408C35 73 06 jnb short unpackit.00408C3D
00408C3D 60 pushad
00408C3E 836C24 20 05 sub dword ptr ss:[esp+20],5
00408C43 8B4C24 20 mov ecx,dword ptr ss:[esp+20]
00408C47 F9 stc
00408C48 72 02 jb short unpackit.00408C4C
00408C4C C601 FA mov byte ptr ds:[ecx],0FA
00408C4F EB 04 jmp short unpackit.00408C55
00408C55 C741 01 80BAF580 mov dword ptr ds:[ecx+1],80F5BA80
00408C5C F8 clc
00408C5D 73 05 jnb short unpackit.00408C64
00408C64 BB BC000000 mov ebx,0BC
00408C69 F8 clc
00408C6A 73 01 jnb short unpackit.00408C6D
00408C6D B8 E8ED7C07 mov eax,77CEDE8
00408C72 C009 0F ror byte ptr ds:[ecx],0F
00408C75 C109 5F ror dword ptr ds:[ecx],5F
00408C78 F9 stc
00408C79 72 06 jb short unpackit.00408C81
00408C81 F8 clc
00408C82 73 03 jnb short unpackit.00408C87
00408C87 83C1 04 add ecx,4
00408C8A F8 clc
00408C8B 73 01 jnb short unpackit.00408C8E
00408C8E 81E8 8CB4A71A sub eax,1AA7B48C
00408C94 83EB 04 sub ebx,4
00408C97 0F85 D5FFFFFF jnz unpackit.00408C72
00408C9E 73 05 jnb short unpackit.00408CA5
00408CA5 61 popad
00408CA6 F9 stc
00408CA7 72 04 jb short unpackit.00408CAD
00408CAD C3 retn//返回00408B78 这段代码其实就是再次解码00408B78
00408B78 EB 01 jmp short unpackit.00408B7B
再次来到00408B78处时,Ctrl+F 在 当前位置下 搜索命令: jmp edi 在00408C12处,当然是F2再下断了,F9会断在那里的
00408C12 FFE7 jmp edi//跳至 003AAC06
003AAC06 E8 00000000 call 003AAC0B
003AAC0B EB 03 jmp short 003AAC10
F7向下走几步就行了
003AAC48 0356 10 add edx,dword ptr ds:[esi+10]
//EDX=000010D3+00A10000=00A110D3 由壳中返回程序的地址 伪OEP值 ★
003AAC4B EB 03 jmp short 003AAC50
003AAC6B 61 popad
003AAC6C EB 01 jmp short 003AAC6F
003AAC6F 9D popfd
003AAC70 EB 02 jmp short 003AAC74
003AAC74 EB 02 jmp short 003AAC78
003AAC78 E9 56646600 jmp 00A110D3//飞向光明之巅!
根据原记事本程序补上Stolen Code,呵呵,偷巧了。
脱其他Obsidium壳程序可以根据程序运行代码、伪OEP处的堆栈和寄存器等情况,还原OEP处代码。
00A110CC 55 push ebp//OEP ★
00A110CD 8BEC mov ebp,esp
00A110CF 83EC 44 sub esp,44
00A110D2 56 push esi//上面是补上的Stolen Code
00A110D3 FF15 E463A100 call dword ptr ds:[A163E4]//返回这里
00A110D9 8BF0 mov esi,eax
00A110DB 8A00 mov al,byte ptr ds:[eax]
00A110DD 3C 22 cmp al,22
00A110DF 75 1B jnz short 00A110FC
00A110E1 56 push esi
00A110E2 FF15 F464A100 call dword ptr ds:[A164F4]
运行LordPE,先完全Dump这个进程,然后“区域脱壳”,地址=00A10000,大小=00008000,得到Region00A10000-00A18000.dmp文件。用LordPE打开dumped.exe,从磁盘载入Region00A10000-00A18000.dmp区段,改其VOffset=00610000。只保留LordPE的“验证PE”选项,对dumped.exe重建PE。OK,Dump完毕!
―――――――――――――――――――――――――――――――――
二、避开IAT加密,得到正确的输入表
重新载入unpackit.EXE,还记得刚开始在第5次003A381D异常时偶搜索的地址吗?003A64F0
003A54D9 F7F0 div eax//第4次异常 输入表处理
在第4次异常时偶们在 003A64F0 处下 内存访问 断点
然后Shift+F9运行,中断数十次就会来到003A64F0处,取消内存断点
003A64F0 66:F706 2000 test word ptr ds:[esi],20
//①、改为 test word ptr ds:[esi],8 ◆
003A64F5 74 59 je short 003A6550
//②、改为 jnz 003A6550 ◆
003A6517 FF75 18 push dword ptr ss:[ebp+18]
003A651A FF50 4C call dword ptr ds:[eax+4C]
003A651D 85C0 test eax,eax
003A651F 74 44 je short 003A6565
//③、改为 je 003A6550 ◆
003A653D FF76 04 push dword ptr ds:[esi+4]
003A6540 FF75 18 push dword ptr ss:[ebp+18]
003A6543 FF50 4C call dword ptr ds:[eax+4C]
003A6546 85C0 test eax,eax
003A6548 74 1B je short 003A6565
//④、改为 je 003A6550 ◆
003A654E 8907 mov dword ptr ds:[edi],eax
//正确的函数进入正确的地址
003A6550 83C6 08 add esi,8
003A6553 83C7 04 add edi,4
003A6556 FF4D 08 dec dword ptr ss:[ebp+8]
003A6559 75 95 jnz short 003A64F0//循环
因为这个东东的特殊函数不多,所以就不再改了。F9运行,程序达到第5次异常,IAT处理完毕。
运行ImportREC,填入RVA=006162E4,Size=00000240,点“Get Import”,得到输入表。
有1个特殊函数:006163E4 ? 0000 003A6D54//为:GetCommandLineA
其他是填充的垃圾数据,CUT掉就行了。改OEP=006110CC,FixDump!
删除00007000区段,去掉LordPE的“脱壳修复”选项,重建PE优化一下dumped_.exe即可。
―――――――――――――――――――――――――――――――――
, _/
/| _.-~/ \_ , 青春都一晌
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了破解轻狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
Cracked By 巢水工作坊――fly [OCN][FCG][NUKE][DCM]
2004-04-18 20:16
阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开
发者可享99元/年,续费同价!