首页
论坛
课程
招聘
Obsidium V1.1.1.4 脱壳――jingulong兄的UnPackIt.EXE
2004-4-28 22:13 13418

Obsidium V1.1.1.4 脱壳――jingulong兄的UnPackIt.EXE

fly 活跃值
85
2004-4-28 22:13
13418
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

                        

【公告】欢迎大家踊跃尝试高研班11月试题,挑战自己的极限!

收藏
点赞0
打赏
分享
最新回复 (30)
雪    币: 60
活跃值: 活跃值 (106)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 活跃值 85 2004-4-28 22:14
2
0
UnPacKit [Obsidium V1.1.1.4]

Try
雪    币: 210
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Nameless 活跃值 2004-4-28 22:24
3
0
刚逛到这,呵呵,看到了:D
雪    币: 206
活跃值: 活跃值 (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
damen 活跃值 2004-4-28 22:25
4
0
pf
学习 ing...
雪    币: 230
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunboy 活跃值 2004-4-28 22:32
5
0
分板块建立是有必要的,否则感觉有点杂乱。建议再增加一个工具使用讨论板块。
学习脱文。。。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sj1127 活跃值 2004-4-28 22:59
6
0
好啊.继续学习!:o
雪    币: 231
活跃值: 活跃值 (112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liuyilin 活跃值 2004-4-28 23:02
7
0
1 恭喜脱壳论坛建立
2 感谢FLY大虾的文章,FLY大虾的文章是最详细的说
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xuanqing 活跃值 2004-4-28 23:07
8
0
还请不吝赐教:
老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。忽略除了“整数被0除”之外的所有其他异常选项。

是否在开始试探的时候,需要不忽略所有异常。才会找到最后一次异常和比较重要的异常?
03A54D9     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

最后一次跳OEP可以理解,但怎么得知IAT处理的异常呢?
我个人一直是用过那个异常的时间会比较长,而且详细跟踪会在里面找到一些dll相关的API调用,不知是否想法正确?
结合上一个问题,怎么可以判断跳OEP和处理IAT使用的是同一种异常呢?
搜索命令:test word ptr ds:[esi],20   003A64F0 66:F706 2000 test word ptr ds:[esi],20//找到这里  003A64F5 74 59 je short 003A6550

这个结果应该是跟踪到的吧,怎么就知道在这里就是对IAT是否处理过的判断呢?
在手动脱一些简单壳的时候(如aspack早期版本),我也自己跟到了类似的地方。经诸位大虾脱文指点也确认地方正确。
可到底怎么判断是否正确呢?
是不是看在这个判断语句后面的对内存操作中,是否对类似IAT结构的内存进行了操作或擦除?
如果是这样的,那么在如此多的代码中又是怎么找到这个地方的呢?
(不会是一句一句跟,然后看关注对内存有操作的循环吧-__-)

还有个问题,就是如果去看Yoda's。。。的源码,是不是会对IAT加密的过程有更深入的了解,个人觉得现在自己蒙的成分比较大

洗耳恭听中。。。

                                  菜鸟:xuanqing
雪    币: 60
活跃值: 活跃值 (106)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 活跃值 85 2004-4-28 23:32
9
0
xuanqing 兄客气了。

其实很多脱壳笔记都是数十次脱壳过程的整理
每次脱壳寻找相对简单点的方法,积累起来,最后才汇总成笔记

因为比较烦人,所以常写脱壳笔记的兄弟不太多
雪    币: 60
活跃值: 活跃值 (106)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 活跃值 85 2004-4-29 01:05
10
0
TO xuanqing 兄:

是否在开始试探的时候,需要不忽略所有异常。才会找到最后一次异常和比较重要的异常?


碰到不熟悉的壳时基本上我是这样操作的。有脱壳笔记的壳参看其他兄弟的经验省许多事

最后一次跳OEP可以理解,但怎么得知IAT处理的异常呢?

呵呵,写笔记之前我跟踪过几次

结合上一个问题,怎么可以判断跳OEP和处理IAT使用的是同一种异常呢?

这个不确定。有些作者喜欢他常用的手法

是不是看在这个判断语句后面的对内存操作中,是否对类似IAT结构的内存进行了操作或擦除?

可以在IAT下内存断点,看看是哪里对IAT操作的

就是如果去看Yoda's。。。的源码,是不是会对IAT加密的过程有更深入的了解

的确如此,如果能够写猛壳或者脱壳机,肯定对于这些知识了解的比较通彻
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xuanqing 活跃值 2004-4-29 11:10
11
0
bow//
多谢fly大虾一一指点
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
lipton 活跃值 2 2004-4-29 17:04
12
0
请教fly
完成了下面的步骤,在修复iat时遇到问题。imr不承认,并异常退出。

“运行LordPE,先完全Dump这个进程,然后“区域脱壳”,地址=00A10000,大小=00008000,得到Region00A10000-00A18000.dmp文件。用LordPE打开dumped.exe,从磁盘载入Region00A10000-00A18000.dmp区段,改其VOffset=00610000。只保留LordPE的“验证PE”选项,对dumped.exe重建PE。OK,Dump完毕!”

我是用另外一个unpack.exe,结构也很相象,学完unpackit.exe,再请教。
雪    币: 60
活跃值: 活跃值 (106)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 活跃值 85 2004-4-29 18:05
13
0
lipton 兄客气了
试试Import REConstructor V1.42+版

另外:注册版Obsidium加壳程序有的使用了SDK,需要修复代码
雪    币: 71
活跃值: 活跃值 (43)
能力值: ( LV9,RANK:2130 )
在线值:
发帖
回帖
粉丝
loveboom 活跃值 53 2004-4-29 18:30
14
0
Oh MY GOD,笨呢。怎么一下没想到这个办法呢,我可是用了很多时间才把资源的问题基本解决,早学乖一点,就不用这么“忙”了。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
lipton 活跃值 2 2004-4-29 19:20
15
0
to fly
修复iat的问题解决了,原因是我把Roffset也改成了610000,笨啊。
不过还是不能运行,对比你脱壳的文件有许多不同之处,估计是修复Pe时的错误。
另外想问一下,这个壳你是用imr1.42+修复的?
雪    币: 202
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
辉仔Yock 活跃值 2004-4-29 20:18
16
0
这个壳其实可以添加一个新区段把OEP的数据放进去.主程序我找不到破解NOP的地方.:(
雪    币: 60
活跃值: 活跃值 (106)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 活跃值 85 2004-4-29 22:46
17
0
最初由 lipton 发布
to fly
修复iat的问题解决了,原因是我把Roffset也改成了610000,笨啊。
不过还是不能运行,对比你脱壳的文件有许多不同之处,估计是修复Pe时的错误。
另外想问一下,这个壳你是用imr1.42+修复的?


应该是用1.42+修复的。不过我觉得1.6也没什么问题的。

另外:OEP的地址是动态申请的,即:不一定就是00A110CC,补上的代码段也不一定是00A10000-00A18000,以在你机子上调试时看到的为准

也可以把加壳的程序增加一个足够大的新区段,然后改变程序重定位代码的地址,使其把重定位后的代码写入你增加的区段。
雪    币: 60
活跃值: 活跃值 (106)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 活跃值 85 2004-4-29 23:19
18
0
最初由 loveboom 发布
Oh MY GOD,笨呢。怎么一下没想到这个办法呢,我可是用了很多时间才把资源的问题基本解决,早学乖一点,就不用这么“忙”了。


我以前也是在这里绕了个弯子,后来看ZILOT大侠脱的Obsidium就仿效了一下 :D
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
lipton 活跃值 2 2004-4-30 09:27
19
0
to fly
上面的问题已经解决了,问题出在修复FE时的选项,可以运行了,现还有一个问题就是脱壳后是108k,7000区段的块已经去掉,但无法剪掉,如何优化,请指教,谢谢。
雪    币: 60
活跃值: 活跃值 (106)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 活跃值 85 2004-4-30 12:08
20
0
最初由 lipton 发布
to fly
上面的问题已经解决了,问题出在修复FE时的选项,可以运行了,现还有一个问题就是脱壳后是108k,7000区段的块已经去掉,但无法剪掉,如何优化,请指教,谢谢。


删除00007000区段,去掉LordPE的“脱壳修复”选项,保留“重新排列”、“验证PE”等选项,重建PE优化一下dumped_.exe即可

我就是这样简单优化的
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
lipton 活跃值 2 2004-4-30 12:59
21
0
"删除00007000区段,去掉LordPE的“脱壳修复”选项,保留“重新排列”、“验证PE”等选项,重建PE优化一下dumped_.exe即可"

搞好了,谢谢指教。
雪    币: 60
活跃值: 活跃值 (106)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 活跃值 85 2004-4-30 13:56
22
0
最初由 lipton 发布
"删除00007000区段,去掉LordPE的“脱壳修复”选项,保留“重新排列”、“验证PE”等选项,重建PE优化一下dumped_.exe即可"

搞好了,谢谢指教。


兄弟客气了。
给我发个mail:fly4099@sohu.com
雪    币: 358
活跃值: 活跃值 (164)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wangshy 活跃值 2 2004-5-21 12:46
23
0
因为这个东东的特殊函数不多,所以就不再改了。F9运行,程序达到第5次异常,IAT处理完毕。

运行ImportREC,填入RVA=006162E4,Size=00000240,点“Get Import”,得到输入表。
有1个特殊函数:006163E4 ? 0000 003A6D54//为:GetCommandLineA

其他是填充的垃圾数据,CUT掉就行了。改OEP=006110CC,FixDump!
删除00007000区段,去掉LordPE的“脱壳修复”选项,重建PE优化一下dumped_.exe即可

请问一下,这个IT的RVA是怎么得来的,我脱是脱了,在2000下脱的,就不知道IT是怎么得来的,谢谢了~~~
雪    币: 60
活跃值: 活跃值 (106)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 活跃值 85 2004-5-21 12:50
24
0
看看函数的地址从哪里开始的
雪    币: 358
活跃值: 活跃值 (164)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wangshy 活跃值 2 2004-5-21 13:01
25
0
好的,晕,回复真快~!
游客
登录 | 注册 方可回帖
返回