-
-
[求助]关于SEH的问题
-
发表于: 2008-10-16 13:59 3726
-
因为某些原因,我想通过自定义seh链的办法来略过程序里的异常。
下面是有关代码
DWORD seh[3];//seh链
seh[1]=&&myseh;
asm("movl %%esp,%0":"=r"(seh[2]));//把esp保存到seh[2]
asm("movl %fs:0,%eax");//调试用
asm("movl %%fs:0,%0":"=r"(seh[0])::"memory");//把fs:0的内容放入seh[0]地址
asm("movl %0, %%fs:0": : "r" ((DWORD)&seh));//把seh的首地址放入fs:0
asm("movl %fs:0,%eax");
asm("movl $0,%ecx");
asm("div %ecx");//引发异常,异常后应该来到myseh
myseh:
asm("movl %fs:0,%eax");
asm("movl 8(%esp),%esp");//取得我构造的seh数组地址,也就是err块
asm("movl (%esp),%eax");
asm("movl %eax,%fs:0");//复原fs:0
asm("movl 8(%esp),%esp");//复原堆栈
上面的代码执行完毕以后,堆栈,fs:0和eflag都是正常的,但是在退出程序的时候就出了地址访问异常
我还有什么没做么?
顺便提一下,如果有人想说我的做法是多此一举,那么请指教一下,用MingW做DDK开发的时候,如何捕捉异常?我将不胜感激!
下面是有关代码
DWORD seh[3];//seh链
seh[1]=&&myseh;
asm("movl %%esp,%0":"=r"(seh[2]));//把esp保存到seh[2]
asm("movl %fs:0,%eax");//调试用
asm("movl %%fs:0,%0":"=r"(seh[0])::"memory");//把fs:0的内容放入seh[0]地址
asm("movl %0, %%fs:0": : "r" ((DWORD)&seh));//把seh的首地址放入fs:0
asm("movl %fs:0,%eax");
asm("movl $0,%ecx");
asm("div %ecx");//引发异常,异常后应该来到myseh
myseh:
asm("movl %fs:0,%eax");
asm("movl 8(%esp),%esp");//取得我构造的seh数组地址,也就是err块
asm("movl (%esp),%eax");
asm("movl %eax,%fs:0");//复原fs:0
asm("movl 8(%esp),%esp");//复原堆栈
上面的代码执行完毕以后,堆栈,fs:0和eflag都是正常的,但是在退出程序的时候就出了地址访问异常
我还有什么没做么?
顺便提一下,如果有人想说我的做法是多此一举,那么请指教一下,用MingW做DDK开发的时候,如何捕捉异常?我将不胜感激!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: