阅读:2404回复:5
有没有汇编下写SEH的资料
R.T.
|
|
|
沙发#
发布于:2001-06-12 14:11
MSJ 1997 January有讲
|
|
|
板凳#
发布于:2001-06-12 14:50
MSJ 是什么东东,能贴就贴出来吗
|
|
|
地板#
发布于:2001-06-14 09:11
其二:每线程异常处理
FS中的值是一个十六位的选择子,它指向包含线程重要信息的数据结构TIB,线程信息块。其的首双字节指向我们称为ERR的结构: 1st dword +0 pointer to next err structure (下一个err结构的指针) 2nd dword +4 pointer to own exception handler (当前一级的异常处理函数的地址) 所以异常处理是呈练状的,如果你自己的处理函数捕捉并处理了这个异常,那么当你的程序发生了异常时,操作系统就不会调用它缺省的处理函数了,也就不会出现一个讨厌的执行了非法操作的红叉。 下面是cih的异常段: MyVirusStart: push ebp lea eax, [esp-04h*2] xor ebx, ebx xchg eax, fs:[ebx] ;交换现在的err结构和前一个结构的地址 ; eax=前一个结构的地址 ; fs:[0]=现在的err结构指针(在堆栈上) call @0 @0: pop ebx lea ecx, StopToRunVirusCode-@0[ebx] ;你的异常处理函数的偏移 push ecx ;你的异常处理函数的偏移压栈 push eax ;前一个err结构的地址压栈 ;构造err结构,记这时候的esp(err结构指针)为esp0 …… StopToRunVirusCode: @1 = StopToRunVirusCode xor ebx, ebx ;发生异常时系统在你的练前又加了一个err结构,所以要先找到原来的结构地址 mov eax, fs:[ebx] ; 取现在的err结构的地址eax mov esp, [eax] ; 取下个结构地址即eps0到esp RestoreSE: ;没有发生异常时顺利的回到这里,你这时的esp为本esp0 pop dword ptr fs:[ebx] ;弹出原来的前一个结构的地址到fs:0 pop eax ;弹出你的异常处理地址,平栈而已 |
|
地下室#
发布于:2001-06-14 21:26
谢谢
|
|
|
5楼#
发布于:2001-06-21 00:57
http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0197/exception/exception.htm&nav=/msj/0197/newnav.htm
A Crash Course on the Depths of Win32? Structured Exception Handling |
|