[工具]:od
异常处理方式分两种:
第一种:筛选器处理方式,缺点:单一,无论什么出现异常都调用它,设置新的旧的覆盖
第二种:线程处理异常普遍使用这种,可以便于封装子程序
线程处理异常:
每个线程对应一个TEB(W9x系列称为TIB)结构,刚好异常处理EXCEPTION_REGISTRATION结构指针ExceptionList,正好是TEB结构第一个字段FS:[0]所指向的数据,即TEB总是由FS:[0]指向的
nt!_TEB
TEB at fs:7FFDF000
+0x000 NtTib // _NT_TIB ;就是这个其他别管
+0x01c EnvironmentPointer // Ptr32 Void
+0x020 ClientId // _CLIENT_ID
+0x028 ActiveRpcHandle // Ptr32 Void
+0x02c ThreadLocalStoragePointer // Ptr32 Void
+0x030 ProcessEnvironmentBlock // Ptr32 _PEB
随便用OD打开在命令栏输入dd 7FFDF000第一个就是跟随进去就看得到EXCEPTION_REGISTRATION结构
EXCEPTION_REGISTRATION struc
{
Prev dd ; //前一个_EXCEPTION_REGISTRATION结构
handler dd ; //异常处理过程地址,你可以在这里做文章,发生异常跳到你想跳到的程序入口
EXCEPTION_REGISTRATION ends
;----------------------------------------------------------------
7FFDF000 0012FFC4 (指向 SEH 链指针)跟随进去就看得见了
7FFDF004 00130000 (线程堆栈顶部)
7FFDF008 0012E000 (线程堆栈底部)
7FFDF00C 00000000
7FFDF010 00001E00
7FFDF014 00000000
;----------------------------------------------------------------
0012FFC4 FFFFFFFF SEH 链尾部 ; Prev dd ; //前一个_EXCEPTION_REGISTRATION结构
0012FFC8 775BE16D SE处理程序 ;handler dd ; //异常处理过程地址
0012FFCC 000AC333
0012FFD0 00000000
下面是一个例子:
;
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;学习:SEH处理异常代码
;编译:ml /c /coff seh.asm
;链接:link /subsystem:windows seh.ojb
;EXCEPTION_REGISTRATION=err结构简称
;大致思路:
;注册回调函数
;引发异常,从用户领空到系统领空
;跳转到handler
;恢复fs:[0]
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.386
.model flat,stdcall
option casemap:none
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;头文件
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
include windows.inc
include user32.inc
include kernel32.inc
includelib kernel32.lib
includelib user32.lib
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;数据段
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.const
szCapiton db 'SEH处理异常例子',0
szSEHText db '安全位置',0
sztText db '绝对不会执行',0
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;代码段
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.code
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;在堆栈中创建SEH链表
;传统的SEH的框架我想我就不多说了。
; 如下:
; push SEH_Handler
; push dword ptr fs:[0]
; mov [fs:0], esp
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
start:
assume fs:nothing ;masm默认将FS:[0]段寄存器定义为error,使用先用assume来启用
push offset _SafePlace ;handler //异常处理过程地址学习病毒经常用的,靠你发挥了
push fs:[0] ; Prev //原来的ERR结构保存
mov fs:[0],esp ;创建自己的err结构,esp=原来err结构,用完再pop fs:[0]回去就恢复就可以了
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;发生异常代码
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
xor eax,eax
mov word ptr [eax],0 ;访问内存异常用户领空调到系统领空
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;以下代码不会被执行
invoke MessageBox,NULL,offset sztText,offset szCapiton,MB_OK
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_SafePlace:
invoke MessageBox,0,offset szSEHText,offset szCapiton,MB_OK
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;恢复原来FS:[0]
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
pop fs:[0]
pop eax
invoke ExitProcess,NULL
end start
编辑链接OD打开记得设置异常非法内存访问勾掉(建议大家用老古董OD方便试

)
没写完明天接着写,怎么设置取消观看啊.

这就尴尬了
[培训]科锐逆向工程师培训第53期2025年7月8日开班!