手脱Obsidium.V1.3.4.2加壳的程序
目标程序:des.exe程序名称:DES计算器
加壳程序:Obsidium.V1.3.4.2
加壳设置:默认(偷oep,iat加密)
用Ollyice载入程序运行,hideod,plantom插件隐藏od,hideod设置全部打勾
运行以后alt+m查看内存,发现msvcrt.dll和MFC42.dll,可以断定是一个VC程序
VC程序oep附近一般会调用2个函数GetVersion或者msvcrt.__set_app_type
在od中按ctrl+G输入GetVersion,定位以后在函数末尾retn处f2下断
按ctrl+G输入msvcrt.__set_app_type,定位以后在函数末尾retn处f2下断
ctrl+f2重载程序,shift+f9运行,每次断下来以后F8一下看是否回到程序领空
本程序在msvcrt.__set_app_type函数的retn处77C0538A断下
77C0537C > 8BFF mov edi, edi
77C0537E55 pushebp
77C0537F8BEC mov ebp, esp
77C053818B45 08 mov eax, dword ptr
77C05384A3 BC17C377 mov dword ptr , eax
77C053895D pop ebp
77C0538AC3 retn ;在这里断下来
F8返回以后回到程序领空
0040DADF59 pop ecx
0040DAE0830D 38F24000 F>or dword ptr , FFFFFFFF
0040DAE7830D 3CF24000 F>or dword ptr , FFFFFFFF
0040DAEEFF15 C0E14000calldword ptr
0040DAF48B0D 2CF24000mov ecx, dword ptr
0040DAFA8908 mov dword ptr , ecx
0040DAFCFF15 BCE14000calldword ptr
上下翻看一下,发现是一个典型的VC程序,只是oep部分被偷了一段代码
0040DAA6 - FF25 94E14000jmp dword ptr
0040DAAC8E82 976A18E9mov es, word ptr
0040DAB27B FF jpo short 0040DAB3
0040DAB4CF iretd
0040DAB5E4 9F in al, 9F
0040DAB77A B0 jpe short 0040DA69
0040DAB927 daa
0040DABA73 64 jnb short 0040DB20
0040DABCA1 00000000 mov eax, dword ptr
///////////////上面部分被偷了,下面正常
0040DAC150 pusheax
0040DAC264:8925 0000000>mov dword ptr fs:, esp
0040DAC983EC 68 sub esp, 68
0040DACC53 pushebx
0040DACD56 pushesi
0040DACE57 pushedi
0040DACF8965 E8 mov dword ptr , esp
0040DAD233DB xor ebx, ebx
0040DAD4895D FC mov dword ptr , ebx
0040DAD76A 02 push2
0040DAD9FF15 C4E14000calldword ptr
0040DADF59 pop ecx
0040DAE0830D 38F24000 F>or dword ptr , FFFFFFFF
0040DAE7830D 3CF24000 F>or dword ptr , FFFFFFFF
0040DAEEFF15 C0E14000calldword ptr
0040DAF48B0D 2CF24000mov ecx, dword ptr
0040DAFA8908 mov dword ptr , ecx
0040DAFCFF15 BCE14000calldword ptr
0040DB028B0D 28F24000mov ecx, dword ptr
0040DB088908 mov dword ptr , ecx
0040DB0AA1 B8E14000 mov eax, dword ptr
0040DB0F8B00 mov eax, dword ptr
0040DB11A3 34F24000 mov dword ptr , eax
0040DB16E8 16010000 call0040DC31
0040DB1B391D 70F04000cmp dword ptr , ebx
找一个vc6程序,比较一下,修复被偷掉的那部分,修复以后如下
0040DAAC55 pushebp
0040DAAD8BEC mov ebp, esp
0040DAAF6A FF push-1
0040DAB168 78E54000 push0040E578
0040DAB668 32DC4000 push0040DC32
0040DABB64:A1 00000000 mov eax, dword ptr fs:
0040DAC150 pusheax
0040DAC264:8925 0000000>mov dword ptr fs:, esp
0040DAC983EC 68 sub esp, 68
好了,OEP=40DAAC
ok,现在来看看输入表,刚才这一个语句调用了msvcrt.__set_app_type函数
0040DAD9FF15 C4E14000calldword ptr
我们在数据窗口中看一下40E1C4
0040E1C4 003F0596
0040E1C8 003F05A3
0040E1CC 003F05B0
0040E1D0 003F05BD
0040E1D4 003F05CA
上下翻动一下找到开始是004E000
结束是004E210,里面只有少数IAT正常,其他都加密了
0040E1A0 003F0521
0040E1A4 003F052E
0040E1A8 77C317AC offset msvcrt._acmdln //没有加密的iat
0040E1AC 003F0548 //加密的iat
0040E1B0 003F0555
0040E1B4 003F0562
0040E1B8 77C323D8 offset msvcrt._adjust_fdiv
0040E1BC 003F057C
现在我们要修复IAT表,用hideod插件申请一块内存,分配得到的地址是00C00000,长度1000
Ctrl+G,输入00C00000到达新分配的空间
patch以下代码来修复iat
00C0000060 pushad //设置这里为EIP
00C000019C pushfd
00C00002BE 00E04000 mov esi, 40E000 //IAT START
00C00007BF 10E24000 mov edi, 40E210 //IAT END
00C0000C8B06 mov eax, dword ptr
00C0000E3D 00004000 cmp eax, 400000 ; ASCII "MZP"
00C0001377 0F ja short 00C00024
00C0001583F8 00 cmp eax, 0
00C0001874 0A je short 00C00024
00C0001AFFE0 jmp eax
00C0001CA1 FCDF4000 mov eax, dword ptr //找一个临时地址存放
00C0002190 nop
00C000228906 mov dword ptr , eax
00C0002483C6 04 add esi, 4
00C000273BF7 cmp esi, edi
00C0002974 02 je short 00C0002D
00C0002B ^ EB DF jmp short 00C0000C
00C0002D9D popfd
00C0002E61 popad
00C0002FC705 FCDF4000 0>mov dword ptr , 0 //将临时地址复原清0
00C00039 - EB FE jmp short 00C00039
00C0003B90 nop
60 9C BE 00 E0 40 00 BF 10 E2 40 00 8B 06 3D 00 00 40 00 77 0F 83 F8 00 74 0A FF E0 A1 FC DF 40
00 90 89 06 83 C6 04 3B F7 74 02 EB DF 9D 61 C7 05 FC DF 40 00 00 00 00 00 EB FE 90
设置00C0000060 pushad为EIP
F8单步走
从这里进去就是壳解密iat的部分了
00C0001AFFE0 jmp eax
一路F8以后找到解密出IAT的地方,在那里patch代码用来和刚才那段代码互动解密
以下的地址每次运行都不同,贴出来是方便比较确认,我找到了一个特征码可以快速定位到需要修改的2处地方
iat特征码FF 37 FF 53 54 EB 03
00934440FF53 54 calldword ptr
00934443/EB 03 jmp short 00934448
现在搜索特征码FF 37 FF 53 54 EB 03
找到以后是下面这个样子(有2处)
009343CC6A 01 push1
009343CE50 pusheax
009343CF6A 00 push0
009343D1FF76 04 pushdword ptr
009343D4FF37 pushdword ptr
009343D6FF53 54 calldword ptr
我们从call语句后面一行开始patch,修改成如下样子
009343D9A3 FCDF4000 mov dword ptr , eax ; 40DFCC是我们用来临时存放iat的地方,原来的值是0
009343DE9D popfd
009343DF61 popad
009343E0 - E9 37BC2C00 jmp 00C0001C ; 返回我们写的代码处理解密出来的iat
同样修改另外一处(call后面开始patch)
下面是我修改前后2处贴出来的对比代码
第一处:
009343CC6A 01 push1
009343CE50 pusheax
009343CF6A 00 push0
009343D1FF76 04 pushdword ptr
009343D4FF37 pushdword ptr
009343D6FF53 54 calldword ptr
--------
009343D9EB 03 jmp short 009343DE ; 原代码
009343DB95 xchgeax, ebp
009343DC4E dec esi
009343DD8885 C0EB0316mov byte ptr , al
009343E3D4 FB aam 0FB
009343E575 72 jnz short 00934459
------------------------------------------------------------------------------
009343D9A3 FCDF4000 mov dword ptr , eax ; 修改代码
009343DE9D popfd
009343DF61 popad
009343E0 - E9 37BC2C00 jmp 00C0001C
二进制代码:6A 01 50 6A 00 FF 76 04 FF 37 FF 53 54 A3 FC DF 40 00 9D 61 E9 37 BC 2C 00
第二处:
009344356A 01 push1
009344376A 00 push0
00934439FF76 04 pushdword ptr
0093443C6A 00 push0
0093443EFF37 pushdword ptr
00934440FF53 54 calldword ptr
--------
00934443/EB 03 jmp short 00934448 ; 原代码
00934445|37 aaa
00934446|B8 1285C0EB mov eax, EBC08512
0093444B01A6 0F842D01add dword ptr , esp
-------------------------------------------------------------------------------
00934443A3 FCDF4000 mov dword ptr , eax ; 修改代码
009344489D popfd
0093444961 popad
0093444A - E9 CDBB2C00 jmp 00C0001C
二进制代码:6A 01 6A 00 FF 76 04 6A 00 FF 37 FF 53 54 A3 FC DF 40 00 9D 61 E9 CD BB 2C 00
现在代码patch好了,不着急f9运行 我们Ctrl+G输入00C00000回到新分配空间,最开始patched的那段代码
,在这里F2下断
00C00039 - EB FE jmp short 00C00039
然后shift+F9运行,断下来以后iat已经修复完毕了
现在alt+m,在401000区段上设置访问权限为所有,然后打开loadpe,dump程序,保存为dumped.exe
打开ImportREC,选择des.exe输入前面得到的oep:40daac-40000=daac,rva=40e000-400000=e000,长度210
点get import,指针全部有效,fix dump得到dumped_.exe
运行正常!到此脱壳完毕
此时程序140kb,我们来减减肥
loadpe打开dumped_.exe 清除长度为d000那个区段,然后重建,运行正常,大小61.6kb
一个小插曲:dump程序以后卡巴斯基报警,ImportREC fix dump以后就不报警了,呵呵
第一次写脱文,如有不妥之处请见谅,希望能加个精华啦:-)
附上程序包: 有兴趣可以玩玩这个壳 好....玩下了
好象我怎么下不了啊 怎么包 病毒 啊?????
!~!~!~!~!~!Re:手脱Obsidium.V1.3.4.2加壳的程序
!~!~!~!~!~!~~!~!~!~!~!~~!~!~!~!~!~!~!~ 引用第3楼gdyc于2008-04-02 10:50发表的 :怎么包 病毒 啊?????
自己去UNPACKCN的那个帖子把他附件下下来然后和我上传的对比 然后再说话
/// 支持这个呢~
/// 前不久遇到过这个壳。。。可是不会脱。。。
/// 嘻嘻 没想到在这里找到勒
这个壳对我小菜说很难搞呢 下载学习 patch 代码 修护 IAT 学习了 谢谢
页:
[1]
2