连续试了几次都是这样, 可能没有执行SEH处理? 分析反汇编代码没有发现什么特别的地方.
回想以前用VC 6.0 的时候,异常处理可以捕获这个异常并很好的处理.
思考了一会,我觉得可能和项目属性设置有关,
查看了 [配置属性]-->[C/C++]-->代码生成-->启用C++异常中的设置 这里的设置为"是", 更改为"是,但有SEH异常" 。
再次调试上面代码运行 OK.
实际加壳部分的 SEH 是用汇编写的:
分析 《脱壳艺术》中的代码
//----------设置异常处理----------
// 异常处理函数地址
push .exeception_handler
// 指向先前SEH结构体的地址, 现在它作为下一个异常处理函数
push dword [fs:0]
//使 fs:[0]指向刚添加SEH结构地址,当出现异常时 exeception_handler 首先得到处理
mov [fs:0],esp
;reset flag(EAX) invoke int 3
xor eax,eax // 设置初始标志
int 3 // 引发异常
;restore exception handler
pop dword [fs:0]
add esp,4
; check if the flag had been set
test eax,eax
je .debugger_found
:::
// 异常处理函数
.exeception_handler:
;EAX = ContextRecord
mov eax,[esp+0xc]
;set flag (ContextRecord.EAX)
mov dword [eax+0xb0],0xffffffff
;set ContextRecord.EIP
inc dword [eax+0xb8]
xor eax,eax
retn
push .exeception_handler
push dword [fs:0]
mov [fs:0],esp
这 3 条汇编语句可以用下面结构图表示.
简单的 SEH 链