首页
社区
课程
招聘
手动脱壳进阶第六篇PE-SHiELD V0.25 中有一处不明,还望指教。
发表于: 2009-11-24 19:44 3997

手动脱壳进阶第六篇PE-SHiELD V0.25 中有一处不明,还望指教。

2009-11-24 19:44
3997
F9运行,

异常1,

0040D232 8DC0 LEA EAX,EAX ; 非法使用寄存器
0040D234 CD 20 INT 20

用Shift+F9忽略异常继续运行。

异常2.

0040D4D7 8DC0 LEA EAX,EAX ; 非法使用寄存器
0040D4D9 CD 20 INT 20
0040D4DB 64:8F03 POP DWORD PTR FS:[EBX]

再用Shift+F9程序运行。
Ctrl+F2重来,用插件隐藏Od.
通过前面的SEH经验看堆栈。

0012FF9C 0012FFE0 指针到下一个 SEH 记录
0012FFA0 0040D4AC SE 句柄

40D4AC是异常处理完毕出口。

我们Ctrl+G ,输入 40D4AC ,回车

0040D4AC 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C] 到这里下断点,F9运行断在这里后取消断点
0040D4B0 8380 B8000000 0>ADD DWORD PTR DS:[EAX+B8],4 注意这里的堆栈值40D4D7+4=40D4DB
学自jeffzhang的未知加密壳脱文。

0040D4B7 53 PUSH EBX
0040D4B8 33DB XOR EBX,EBX
0040D4BA 8958 04 MOV DWORD PTR DS:[EAX+4],EBX
0040D4BD 8958 08 MOV DWORD PTR DS:[EAX+8],EBX
0040D4C0 C740 18 5501000>MOV DWORD PTR DS:[EAX+18],155
0040D4C7 8958 0C MOV DWORD PTR DS:[EAX+C],EBX
0040D4CA 8958 10 MOV DWORD PTR DS:[EAX+10],EBX
0040D4CD 5B POP EBX
0040D4CE 33C0 XOR EAX,EAX //表示已修复,可以从异常处继续执行
0040D4D0 C3 RETN 如果你执行这里的返回语句,将迷失在系统领空。
0040D4D1 64:FF33 PUSH DWORD PTR FS:[EBX]
0040D4D4 64:8923 MOV DWORD PTR FS:[EBX],ESP
0040D4D7 8DC0 LEA EAX,EAX ; 非法使用寄存器
0040D4D9 CD 20 INT 20
0040D4DB 64:8F03 POP DWORD PTR FS:[EBX] 在这里下断点吧。顺利到达后取消断点。

问题:
1.主要的问题是“如果你执行这里的返回语句,将迷失在系统领空”。这一段没有跳转,如何不执行这条语句呢?
2.我在“0040D4D9”处下了断点,然后按Shift+F9,确实可以在0040D4D9处断下,可我不明白为什么可以,执行0040D4D0 C3 RETN不是会迷失在系统领空里吗?
3.0040D4D9这个地址是通过“注意这里的堆栈值40D4D7+4=40D4DB 学自jeffzhang的未知加密壳脱文。”计算而来,能给一个关于jeffzhang此文的链接吗?谢谢

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 2523
活跃值: (520)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
1 不可能,SEH必须走系统领空分发异常
2 我也不知道你为什么会在0040D4D9处断下,理论上说0040D4D9是永远也执行不到的
3 文章不知道,但关注下context结构,你就会找到答案
2009-11-25 13:58
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
"2 我也不知道你为什么会在0040D4D9处断下,理论上说0040D4D9是永远也执行不到的"
是可以执行到的。
2009-11-26 11:09
0
雪    币: 2523
活跃值: (520)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
实在不知道LZ是怎么跑到0040D4D9的,今天特定又验证了一遍,肯定是跑不到的
2009-11-26 11:35
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可能是我没说清,
我是在“0040D4DB”这里下断点的

由于是花指令,所以我笼统地说了“0040D4D9”
下面是过程录像。
过程.rar

=======================
而且我也有一点不明白原文作者的意图:
一边说:“如果你执行这里的返回语句,将迷失在系统领空。”
另一边说:“在这里下断点吧。顺利到达后取消断点。”,为什么要在这里下断呢?很疑惑
上传的附件:
2009-11-26 16:33
0
雪    币: 2523
活跃值: (520)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
⊙﹏⊙b汗
0040D4B0 8380 B8000000 0>ADD DWORD PTR DS:[EAX+B8],4
这一句话,就是把EIP+4
异常时EIP=40D4D7,EIP+4=40D4DB
所以40D4DB是“迷失在系统代码”后返回到用户代码的地方
2009-11-26 18:24
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
先感谢“风随雨行 ”


确实如“风随雨行”所说,上面是截图。

“异常时EIP=40D4D7,EIP+4=40D4DB
所以40D4DB是“迷失在系统代码”后返回到用户代码的地方 ”

1.我在40D4D7下断后,发现并没有被断下来,也没有异常发生,程序直接跑飞了。
2.如果40D4D7处发生异常,按我的理解,应该是找SEH处理,而我并没有看到“40D4DB”在SEH处理链表中。
上传的附件:
2009-11-27 16:35
0
雪    币: 2523
活跃值: (520)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
单步跟上述的2中情况均不可能出现,如果是下硬件断点直接跑,程序肯定飞了
2009-11-27 18:22
0
雪    币: 290
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
用原版OD调试
现在的OD都保护的太强了
2009-11-27 18:46
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢两位的回答。但我还是不清楚,为什么程序会停在“40D4DB”。
如果说“EIP=40D4D7,EIP+4=40D4DB”是一个线索,我承认。
但无法说明为什么程序是停在“40D4DB”,这与我之前所知的SEH不符合啊!
2009-11-28 07:46
0
雪    币: 2523
活跃值: (520)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
不好多说啥了,只能说明你对SEH理解不好,找点资料自己再深入研究一下吧
2009-11-28 09:10
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢 风随雨行。可能我对SEH了解不够,现在就去找答案,两天后必来结帖。
PS:
风随雨行:如果找不到答案,还请您多多帮忙。
2009-11-28 18:42
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
反复看了风雨的回复,其中一句话给我一点提示:
“3 文章不知道,但关注下context结构,你就会找到答案 ”

星期天就以“context结构”为关键字,开始了寻找。有点了眉目,不知道理解是否正确,还望指教。

当发生异常时,系统调用异常处理函数,它有四个参数。

EXCEPTION_DISPOSITION  __cdecl _except_handler(
     struct _EXCEPTION_RECORD *ExceptionRecord,
     void * EstablisherFrame,
     struct _CONTEXT *ContextRecord,
     void * DispatcherContext
     );

当程序停在0040D4AC 时,即已经进入了异常处理函数,观查这时的栈。


异常处理函数声明为:__cdecl ,即右侧的函数先入栈,
栈的结构应该是:
  0--------返回地址
  4--------参数1
  8--------参数2
  C--------参数3
  10--------参数4
  而Context是参数3,所以应该是+C



下面是关于Context结构的说明
=============================
typedef struct _CONTEXT
{
     DWORD ContextFlags;//0
     DWORD   Dr0;//1
     DWORD   Dr1;//2
     DWORD   Dr2;//3
     DWORD   Dr3;//4
     DWORD   Dr6;//5
     DWORD   Dr7;//6
     FLOATING_SAVE_AREA FloatSave;//7-34
     DWORD   SegGs;//35
     DWORD   SegFs;//36
     DWORD   SegEs;//37
     DWORD   SegDs;//38
     DWORD   Edi;//39
     DWORD   Esi;//40
     DWORD   Ebx;//41
     DWORD   Edx;//42
     DWORD   Ecx;//43
     DWORD   Eax;//44
     DWORD   Ebp;//45
     DWORD   Eip;//46
     DWORD   SegCs;//47
     DWORD   EFlags;//48
     DWORD   Esp;//49
     DWORD   SegSs;//50
} CONTEXT;

typedef struct _FLOATING_SAVE_AREA {   
    DWORD   ControlWord;   //1
    DWORD   StatusWord;   //2
    DWORD   TagWord;   //3
    DWORD   ErrorOffset;   //4
    DWORD   ErrorSelector;  //5
    DWORD   DataOffset;   //6
    DWORD   DataSelector;   //7
    BYTE     RegisterArea[SIZE_OF_80387_REGISTERS];   //8-27
    DWORD   Cr0NpxState;  //28
} FLOATING_SAVE_AREA;  

SIZE_OF_80387_REGISTERS equ 80
=============================
第46个Dword是Eip,程序通过修改Context中的EIP,改变了异常处理结束之后的返回地址,让程序转向0040D4DB。
上传的附件:
2009-11-30 20:28
0
游客
登录 | 注册 方可回帖
返回
//