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。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!