kissy 发表于 2008-4-2 10:09

手脱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以后就不报警了,呵呵

第一次写脱文,如有不妥之处请见谅,希望能加个精华啦:-)

附上程序包:

kissy 发表于 2008-4-2 10:09

有兴趣可以玩玩这个壳

gdyc 发表于 2008-4-2 10:49

好....玩下了
好象我怎么下不了啊

gdyc 发表于 2008-4-2 10:50

怎么包 病毒 啊?????

a393269192 发表于 2008-4-2 10:59

!~!~!~!~!~!Re:手脱Obsidium.V1.3.4.2加壳的程序

!~!~!~!~!~!~~!~!~!~!~!~~!~!~!~!~!~!~!~

kissy 发表于 2008-4-2 12:57

引用第3楼gdyc于2008-04-02 10:50发表的 :
怎么包 病毒 啊?????
自己去UNPACKCN的那个帖子把他附件下下来然后和我上传的对比 然后再说话

Squn 发表于 2008-4-2 13:24


/// 支持这个呢~
/// 前不久遇到过这个壳。。。可是不会脱。。。
/// 嘻嘻 没想到在这里找到勒

xie83544109 发表于 2010-1-18 11:26


这个壳对我小菜说很难搞呢

open5858 发表于 2010-2-8 21:42

下载学习 patch 代码 修护 IAT

ck13 发表于 2010-3-10 12:53

学习了 谢谢
页: [1] 2
查看完整版本: 手脱Obsidium.V1.3.4.2加壳的程序