-
-
[旧帖] 学习加密解密第十章SEH异常疑惑之SEH相关数据结构习题 0.00雪花
-
发表于: 2016-6-12 20:46 1960
-
原来我弄错了要在401017处按shift+F7进入系统领空才能对的到,研究了老半天眼花
错误理解:
1.例子seh.exe学习:
跳转到handler地址40102E后堆栈地址与书上不同
首先我们看EXCEPTION_POINTERS结构
typedef struct _EXCEPTION_POINTERS
{
+0 PEXCEPTION_RECORD ExceptionRecord; //指向一个EXCEPTION_RECORD结构
+4 PCONTEXT ContextRecord; //指向向一个CONTEXT结构
}
EXCEPTION_POINTERS,
*PEXCEPTION_POINTERS;
那么我们再看程序40102E堆栈数据
0012FA58 772A71D9 返回到 ntdll.772A71D9
疑问:为何堆栈停留在这里?
推理1:windows检测到了这个异常,就会向堆栈压入3个结构.压入顺序windows检测到了这个异常,就会将向堆栈压入3个结构分别是EXCEPTION_RECORD,EXCEPTION_CONTEXT,EXCEPTION_POINTERS,但是不对啊EXCEPTION_POINTERS只有2个参数
0012FA5C 0012FB40 假设这个是EXCEPTION_RECORD结构 +0
0012FA60 0012FF84 假设这个是CONTEXT +4
疑问: 为何这个不是CONTEXT结构,12FB5C才是
按道理说RECORD结构下一个就是CONTEXT结构为何差距那么大一个是FB40一个是FF84
0012FA64 0012FB5C 为何我算了下这个才是真正的CONTEXT结构
0012FA68 0012FB14
------------------------------------------------------------
我们先来到了EXCEPTION_RECORD:
0012FB40 C0000005 //异常事件码
0012FB44 00000000 //标志
0012FB48 00000000 //下一个EXCEPTION_RECORD结构地址
0012FB4C 00401017 Seh.00401017 //异常发生的地址
0012FB50 00000002 //ExceptionInformation的dword数目
0012FB54 00000000 //异常信息 ?
0012FB58 00000000 //疑问:难道结尾是全是0的DWORD大小?
---------------------------------------------------------
然后EXCEPTION_RECORD紧接的是CONTEXT结构
0012FB5C 0001007F DWORD ContextFlags
0012FB60 00000000
0012FB64 00000000
0012FB68 00000000
0012FB6C 00000000
0012FB70 00000000
0012FB74 00000000
疑惑:为何CONTEXT结构在堆栈中不是紧跟着EXCEPTION_RECORD
0012FA58 772A71D9 返回到 ntdll.772A71D9
0012FA5C 0012FB40 EXCEPTION_RECORD 为何跳转到40102E堆栈不是直接定位到这里然是上面那句
0012FA60 0012FF84 这个地址又是什么东西?
0012FA64 0012FB5C 为何这个才是真正的CONTEXT,那上面那个地址是什么来的?
希望大家别犯我这种低级错误
401017处按shift+F7进入系统领空才能对的到
错误理解:
1.例子seh.exe学习:
跳转到handler地址40102E后堆栈地址与书上不同
首先我们看EXCEPTION_POINTERS结构
typedef struct _EXCEPTION_POINTERS
{
+0 PEXCEPTION_RECORD ExceptionRecord; //指向一个EXCEPTION_RECORD结构
+4 PCONTEXT ContextRecord; //指向向一个CONTEXT结构
}
EXCEPTION_POINTERS,
*PEXCEPTION_POINTERS;
那么我们再看程序40102E堆栈数据
0012FA58 772A71D9 返回到 ntdll.772A71D9
疑问:为何堆栈停留在这里?
推理1:windows检测到了这个异常,就会向堆栈压入3个结构.压入顺序windows检测到了这个异常,就会将向堆栈压入3个结构分别是EXCEPTION_RECORD,EXCEPTION_CONTEXT,EXCEPTION_POINTERS,但是不对啊EXCEPTION_POINTERS只有2个参数
0012FA5C 0012FB40 假设这个是EXCEPTION_RECORD结构 +0
0012FA60 0012FF84 假设这个是CONTEXT +4
疑问: 为何这个不是CONTEXT结构,12FB5C才是
按道理说RECORD结构下一个就是CONTEXT结构为何差距那么大一个是FB40一个是FF84
0012FA64 0012FB5C 为何我算了下这个才是真正的CONTEXT结构
0012FA68 0012FB14
------------------------------------------------------------
我们先来到了EXCEPTION_RECORD:
0012FB40 C0000005 //异常事件码
0012FB44 00000000 //标志
0012FB48 00000000 //下一个EXCEPTION_RECORD结构地址
0012FB4C 00401017 Seh.00401017 //异常发生的地址
0012FB50 00000002 //ExceptionInformation的dword数目
0012FB54 00000000 //异常信息 ?
0012FB58 00000000 //疑问:难道结尾是全是0的DWORD大小?
---------------------------------------------------------
然后EXCEPTION_RECORD紧接的是CONTEXT结构
0012FB5C 0001007F DWORD ContextFlags
0012FB60 00000000
0012FB64 00000000
0012FB68 00000000
0012FB6C 00000000
0012FB70 00000000
0012FB74 00000000
疑惑:为何CONTEXT结构在堆栈中不是紧跟着EXCEPTION_RECORD
0012FA58 772A71D9 返回到 ntdll.772A71D9
0012FA5C 0012FB40 EXCEPTION_RECORD 为何跳转到40102E堆栈不是直接定位到这里然是上面那句
0012FA60 0012FF84 这个地址又是什么东西?
0012FA64 0012FB5C 为何这个才是真正的CONTEXT,那上面那个地址是什么来的?
希望大家别犯我这种低级错误
401017处按shift+F7进入系统领空才能对的到
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
- [分享]VMP学习笔记之万用门(七) 26778
- [分享]VMP学习笔记之壳的重定位修复(五) 12080
- [分享]VMP学习笔记之壳基础流程(一) 17261
- [分享]VMP学习笔记之Handle块优化与壳模板初始化(四) 10023
谁下载
看原图
赞赏
雪币:
留言: