SEH 结构化异常处理(1)
2007-01-14 20:14:43 来源:WEB开发网核心提示: 77F79B7E55pushebp77F79B7F8BECmovebp,esp77F79B81FF750Cpushdwordptrss:[ebp+C]77F79B8452pushedx77F79B8564:FF350000000>pushdwordptrfs:[0]77F79B8C6
77F79B7E 55 pushebp
77F79B7F 8BEC movebp,esp
77F79B81 FF750C pushdwordptrss:[ebp+C]
77F79B84 52 pushedx
77F79B85 64:FF350000000>pushdwordptrfs:[0]
77F79B8C 64:89250000000>movdwordptrfs:[0],esp
{
//堆栈建立了1个err结构
0012FC04 0012FFBC 指针到下一个SEH记录//enter键看看
0012FC08 77F79BB8 SE句柄
0012FFBC 0012FFE0 指针到下一个SEH记录
0012FFC0 0040102E SE句柄//熟悉这个地址吧
0012FFE0 FFFFFFFF SEH链尾部
0012FFE4 77E74809 SE句柄
}
77F79B93 FF7514 pushdwordptrss:[ebp+14]
77F79B96 FF7510 pushdwordptrss:[ebp+10]
77F79B99 FF750C pushdwordptrss:[ebp+C]
77F79B9C FF7508 pushdwordptrss:[ebp+8]
77F79B9F 8B4D18 movecx,dwordptrss:[ebp+18]
{
//此时我们马上看看堆栈:
0012FBF4 0012FCD4//指针,指向EXCEPTION_RECORD结构,即EXCEPTION_RECORD的首地址 -----回调函数的参数1
0012FBF8 0012FFBC//指向err结构.可以看看上面我们截取的SEH链表 -----回调函数的参数2
0012FBFC 0012FCF0//指针,指向EXCEPTION_CONTEXT结构,即EXCEPTION_CONTEXT的首地址-----回调函数的参数3
0012FC00 0012FCAC//参数4 _lpDispatchrContext?最先被压入堆栈.
0012FC04 0012FFBC 指针到下一个SEH记录
0012FC08 77F79BB8 SE句柄
0012FC0C 0012FFBC
}
77F79BA2 FFD1 callecx //Seh.0040102E到这里执行,就是程序的自己的异常处理代码,f7
//这就是异常处理回调函数,其参数含义请往下看.
{
0040102C ./EB13 jmpshortSeh.00401041
0040102E .|6A00 push0 ;/Style=MB_OK|MB_APPLMODAL
00401030 .|6800304000 pushSeh.00403000 ;|Title="OK"
00401035 .|6803304000 pushSeh.00403003 ;|Text="SEHSucceed"
0040103A .|6A00 push0 ;|hOwner=NULL
0040103C .|E807000000 call<jmp.&USER32.MessageBoxA> ;MessageBoxA
00401041 >6A00 push0 ;/ExitCode=0
00401043 . E806000000 call<jmp.&KERNEL32.ExitProcess> ;ExitProcess
00401048 $-FF2508204000jmpdwordptrds:[<&USER32.MessageBoxA>]; USER32.MessageBoxA
0040104E .-FF2500204000jmpdwordptrds:[<&KERNEL32.ExitProcess>; kernel32.ExitProcess
}
77F79BA4 64:8B250000000>movesp,dwordptrfs:[0]
77F79BAB 64:8F050000000>popdwordptrfs:[0]
77F79BB2 8BE5 movesp,ebp
77F79BB4 5D popebp
77F79BB5 C21400 retn14
[总结]
更多精彩
赞助商链接