首页
社区
课程
招聘
obsidium v1.1.1.4 的试脱壳练习,请行家指点
2004-5-27 18:10 6952

obsidium v1.1.1.4 的试脱壳练习,请行家指点

2004-5-27 18:10
6952
obsidium v1.1.1.4 的试脱壳练习,请行家指点

Obsidium V1.1.1.4 脱壳――PYCQ.EXE
下载地址:点击下载

【作者声明】:只是感兴趣,没有其他目的。看了FLY大侠的一篇文章,所以找来这个程序试试,后面还有未完成部分,请大家继续指正。

【调试环境】:Win2000、Ollydbg、PEiD、LordPE、ImportREC1.4.2

【脱壳过程】:
一、寻找OEP、Dump进程

老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。忽略除了“整数被0除”之外的所有其他异常选项。

代码:--------------------------------------------------------------------------------
0084D000 > /EB 02           JMP SHORT PYCQ.0084D004  **进入OD后停在这
0084D002   |49              DEC ECX
0084D003   |9F              LAHF
0084D004   \E8 3F1D0000     CALL PYCQ.0084ED48
按F9运行

9次异常----------------------------------------------------
00CC0B0B    F7F0            DIV EAX **第1次异常
00CC4D19    F7F0            DIV EAX **第2次异常
00CC509B    F7F0            DIV EAX **第3次异常
00CC5211    F7F0            DIV EAX **第4次异常   输入表处理
00CC3575    F7F0            DIV EAX **第5次异常
00CC3929    F7F0            DIV EAX **第6次异常
00CC3575    F7F0            DIV EAX **第7次异常
00CC3929    F7F0            DIV EAX **第8次异常
0084E818    F7F0            DIV EAX **第9次异常
--------------------------------------------------------------------------------
OK,当第5次00CC3575异常时,Ctrl+G:00CC5211 (第4次异常地址)
到达后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 ◆ 这一步为下面的修复输入表提供点方便。

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
看看0084E818处第9次异常的堆栈:

0012FF88   0012FFE0  指针到下一个 SEH 记录
0012FF8C   0084E84C  SE 句柄     **此处下断
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

代码:--------------------------------------------------------------------------------
0084E84C    C8 000000       ENTER 0,0  //断在此处
0084E850    EB 02           JMP SHORT PYCQ.0084E854
0084E852    1A7A 8B         SBB BH,BYTE PTR DS:[EDX-75]
--------------------------------------------------------------------------------

Ctrl+F 在当前位置下搜索命令:mov dword ptr ds:[eax+0B8],edx 在008488D9处

代码:--------------------------------------------------------------------------------
0084E8D9    8990 B8000000   MOV DWORD PTR DS:[EAX+B8],EDX  **记下此处EDX=0084eb78
0084E8DF    EB 03           JMP SHORT PYCQ.0084E8E4
0084E8E1    B7 C4           MOV BH,0C4
0084E8E3    12EB            ADC CH,BL
--------------------------------------------------------------------------------
Ctrl+G:0084eb78 下断,F9运行,断下

代码:--------------------------------------------------------------------------------
0084EB78    E8 B7000000     CALL PYCQ.0084EC34    //F7跟进
0084EB7D    2863 2E         SUB BYTE PTR DS:[EBX+2E],AH
--------------------------------------------------------------------------------

代码:--------------------------------------------------------------------------------
0084EC34    60              PUSHAD
0084EC35    836C24 20 05    SUB DWORD PTR SS:[ESP+20],5
0084EC3A    8B7424 20       MOV ESI,DWORD PTR SS:[ESP+20]
0084EC3E    EB 04           JMP SHORT PYCQ.0084EC44
0084EC44    C606 D7         MOV BYTE PTR DS:[ESI],0D7
0084EC47    C746 01 07D4AD0>MOV DWORD PTR DS:[ESI+1],5ADD407
0084EC4E    EB 05           JMP SHORT PYCQ.0084EC55
0084EC55    B9 BC000000     MOV ECX,0BC
0084EC5A    F9              STC
0084EC5B    72 03           JB SHORT PYCQ.0084EC60
0084EC60    BB D8A0CF07     MOV EBX,7CFA0D8
0084EC65    C00E 17         ROR BYTE PTR DS:[ESI],17
0084EC68    F8              CLC
0084EC69    73 06           JNB SHORT PYCQ.0084EC71
0084EC71    C106 3E         ROL DWORD PTR DS:[ESI],3E     ; 移动常数超出 1..31 的范围
0084EC74    83C6 04         ADD ESI,4
0084EC77    F8              CLC
0084EC78    73 03           JNB SHORT PYCQ.0084EC7D
0084EC7D    C1C3 11         ROL EBX,11
0084EC80    83E9 04         SUB ECX,4
0084EC83  ^ 0F85 DCFFFFFF   JNZ PYCQ.0084EC65
0084EC89    F9              STC
0084EC8A    72 03           JB SHORT PYCQ.0084EC8F
0084EC8F    61              POPAD
0084EC90    F9              STC
0084EC91    72 05           JB SHORT PYCQ.0084EC98
0084EC98    C3              RETN    **返回0084EB78 这段代码其实就是再次解码0084EB78

0084EB78    E8 0175EB02     CALL 0370607E
--------------------------------------------------------------------------------

再次来到00408B78处时,Ctrl+F 在 当前位置下 搜索命令: jmp edi 在0084EC12处,F2再下断了,F9运行

代码:--------------------------------------------------------------------------------
0084EC12  - FFE7            JMP EDI      **edi=00CCB4CA

00CCB4CA    E8 00000000     CALL 00CCB4CF
00CCB4CF    EB 03           JMP SHORT 00CCB4D4
--------------------------------------------------------------------------------

F7向下走几步就行了

代码:--------------------------------------------------------------------------------
00CCB500    8B95 B2EFAF00   MOV EDX,DWORD PTR SS:[EBP+AFEFB2]    **edx=DFB3
00CCB506   /EB 04           JMP SHORT 00CCB50C
00CCB50C    0356 10         ADD EDX,DWORD PTR DS:[ESI+10]            ; PYCQ.00400000
**EDX=0000DFB3+00400000=0040DFB3 由壳中返回程序的地址    伪OEP值  ★
再按几次F8:
00CCB53C  - E9 722A74FF     JMP PYCQ.0040DFB3   **跳向OEP!

0040DFB3      64            DB 64                                    ;  CHAR 'd'
0040DFB4      A1            DB A1
0040DFB5      00            DB 00
0040DFB6      00            DB 00
0040DFB7      00            DB 00
0040DFB8      00            DB 00
0040DFB9      50            DB 50                                    ;  CHAR 'P'
0040DFBA      64            DB 64                                    ;  CHAR 'd'
0040DFBB      89            DB 89
0040DFBC      25            DB 25                                    ;  CHAR '%'

这里将代码进行分析一下。:)
--------------------------------------------------------------------------------

下面分析一下程序并补上Stolen Code。
这是一个C++程序,根据特点以及查看堆栈,修补代码如下

代码:--------------------------------------------------------------------------------
0040DFA4      55            PUSH EBP
0040DFA5      8BEC          MOV EBP,ESP
0040DFA7      6A FF         PUSH -1
0040DFA9      68 98CF4200   PUSH PYCQ.0042CF98
0040DFAE      68 AC0F4100   PUSH PYCQ.00410FAC                       ;  入口地址
**以上是修补的代码
0040DFB3   .  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
0040DFB9   .  50            PUSH EAX
0040DFBA   .  64:8925 00000>MOV DWORD PTR FS:[0],ESP
0040DFC1   .  83EC 58       SUB ESP,58
0040DFC4   .  53            PUSH EBX
0040DFC5   .  56            PUSH ESI
0040DFC6   .  57            PUSH EDI
--------------------------------------------------------------------------------

运行LordPE,先完全Dump这个进程,修改其OEP。OK,Dump完毕!

―――――――――――――――――――――――――――――――――
第二步我未能正确进行,不过写下以下步骤,请高手完成后指点一下。

二、避开IAT加密,得到正确的输入表

重新载入PYCQ.EXE,在第4次00CC5211异常时偶搜索地址00CC6230,下内存访问断点
然后Shift+F9运行,中断数十次就会来到00CC6230处,取消内存断点

代码:--------------------------------------------------------------------------------
00CC6230    66:F706 2000    TEST WORD PTR DS:[ESI],20
**改为:TEST WORD PTR DS:[ESI],8
00CC6235    74 59           JE SHORT 00CC6290
**改为:JNZ SHORT 00CC6290
00CC6237    90              NOP
00CC6238    90              NOP
00CC6239    90              NOP
00CC623A    90              NOP
00CC623B    66:F706 0200    TEST WORD PTR DS:[ESI],2
00CC6240    75 2A           JNZ SHORT 00CC626C
00CC6242    90              NOP
00CC6243    90              NOP
00CC6244    90              NOP
00CC6245    90              NOP
00CC6246    66:C706 0400    MOV WORD PTR DS:[ESI],4
00CC624B    8B45 14         MOV EAX,DWORD PTR SS:[EBP+14]
00CC624E    6A 01           PUSH 1
00CC6250    6A 00           PUSH 0
00CC6252    FF76 04         PUSH DWORD PTR DS:[ESI+4]
00CC6255    6A 00           PUSH 0
00CC6257    FF75 18         PUSH DWORD PTR SS:[EBP+18]
00CC625A    FF50 4C         CALL DWORD PTR DS:[EAX+4C]
00CC625D    85C0            TEST EAX,EAX
00CC625F    74 44           JE SHORT 00CC62A5
**改为 JE SHORT 00CC6290
00CC6261    90              NOP
00CC6262    90              NOP
00CC6263    90              NOP
00CC6264    90              NOP
00CC6265    8907            MOV DWORD PTR DS:[EDI],EAX
00CC6267    EB 27           JMP SHORT 00CC6290
00CC6269    90              NOP
00CC626A    90              NOP
00CC626B    90              NOP
00CC626C    66:C706 0400    MOV WORD PTR DS:[ESI],4
00CC6271    8B45 14         MOV EAX,DWORD PTR SS:[EBP+14]
00CC6274    0FB756 02       MOVZX EDX,WORD PTR DS:[ESI+2]
00CC6278    6A 01           PUSH 1
00CC627A    52              PUSH EDX
00CC627B    6A 00           PUSH 0
00CC627D    FF76 04         PUSH DWORD PTR DS:[ESI+4]
00CC6280    FF75 18         PUSH DWORD PTR SS:[EBP+18]
00CC6283    FF50 4C         CALL DWORD PTR DS:[EAX+4C]
00CC6286    85C0            TEST EAX,EAX
00CC6288    74 1B           JE SHORT 00CC62A5
**改为 JE SHORT 00CC6290
00CC628A    90              NOP
00CC628B    90              NOP
00CC628C    90              NOP
00CC628D    90              NOP
00CC628E    8907            MOV DWORD PTR DS:[EDI],EAX   **//正确的函数进入正确的地址
00CC6290    83C6 08         ADD ESI,8
00CC6293    83C7 04         ADD EDI,4
00CC6296    FF4D 08         DEC DWORD PTR SS:[EBP+8]
00CC6299  ^ 75 95           JNZ SHORT 00CC6230        **循环  
00CC629B    33C0            XOR EAX,EAX
00CC629D    40              INC EAX
00CC629E    5F              POP EDI
00CC629F    5E              POP ESI
00CC62A0    5B              POP EBX
00CC62A1    C9              LEAVE
00CC62A2    C2 1400         RETN 14

--------------------------------------------------------------------------------
F9运行,程序达到第5次异常,IAT处理完毕,在程序未破坏IAT前进行修复。

运行ImportREC,修复,ok。

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞10
打赏
分享
最新回复 (13)
雪    币: 442
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wangshy 2 2004-5-27 18:33
2
0
不用区域脱壳,直接Dump full后,修正输入表就行了,然后重建PE就OK
从PYCQ3.77开始我就一直跟,没有什么新花样
雪    币: 442
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wangshy 2 2004-5-27 18:43
3
0
先避开IT加密后,到伪OEP,加上Stolen CodE,Dump full,修正IAT再就可以用了~!不要死学哦
雪    币: 442
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wangshy 2 2004-5-27 18:44
4
0
那篇教程是特殊处理过的~!所以要Dump区域
雪    币: 221
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
tjiao 1 2004-5-27 21:40
5
0
OK。我试试,如果这样就简单多了,我仅是学壳,脱完了就没有用了
雪    币: 221
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
tjiao 1 2004-5-27 22:41
6
0
谢谢2位的提醒,本人真是过于笨,10分钟已经搞定。
雪    币: 227
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iceplus 2004-5-29 01:53
7
0
10分钟?真快
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shahuo 2004-6-23 22:48
8
0
问一下各位
异常时偶搜索地址00CC6230
地址00CC6230是怎么得出来的`
雪    币: 255
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
kimmal 1 2004-6-24 08:11
9
0
看看Fly的教程,跟一次你就知道了
雪    币: 12
活跃值: (180)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
slan 1 2004-6-25 09:01
10
0
tjiao兄,既然都搞定了,就写一篇完整的脱文撒,我等菜鸟还不明白是怎么回事呢!
雪    币: 255
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
kimmal 1 2004-6-25 09:37
11
0
把FLy的教程脱掉后,
这个就没什么了~!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
free 2004-8-17 17:54
12
0
最初由 wangshy 发布
不用区域脱壳,直接Dump full后,修正输入表就行了,然后重建PE就OK
从PYCQ3.77开始我就一直跟,没有什么新花样


能说的详细点吗?
Dump full完之后,
1.OEP要不要改??
2.IAT表我用ImportREC工具时函数都显示NO?
要怎么解决呀,能提示一下吗?
3.还有Stolen Code这段代码是怎么出来的?
雪    币: 233
活跃值: (160)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
shaitan 1 2004-8-26 20:47
13
0
最初由 wangshy 发布
先避开IT加密后,到伪OEP,加上Stolen CodE,Dump full,修正IAT再就可以用了~!不要死学哦


修正IAT再就可以用了~!
这里怎么做呀!请教一下?
雪    币: 317
活跃值: (866)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
aqtata 2 2004-8-27 11:40
14
0
故弄玄虚,有什么好看的
游客
登录 | 注册 方可回帖
返回