之前的笔记搬运
0x1 什么是异常展开
在多层嵌套try catch时, SEH异常处理链也会出现多层;
如函数A 调用 函数B , 并且每个函数内都有自己的try catch,这时候如果在B函数内产生了异常, 并且没有被B函数的SEH处理的话,那么就会向A抛出该异常, 这时候如果A处理了该异常,这时候的函数流程应该是执行到函数A了, 那么有2个问题:
1 | - B函数的堆栈空间没有释放, EBP和ESP还是B函数的 |
而异常展开就是为了解决这两个问题, 会把当前节点之上的所有SEH节点摘除
0x2 异常展开的方法
关键API : RtlUnwind (lpLastStackFrame, lpCodeLabel, lpExceptionRecord, dwRet)
一共有4个参数
1 | lpLastStackFrame: 一直展开到指定节点为止, 填NULL表示全部展开 |
这个API的作用就是会把指定节点之上的所有SEH节点摘除, 在没摘除一个节点之前,会对该节点抛出一个C0000027异常码的异常, 表示要删除该节点了, 被称为异常通告
栈空间可以通过异常记录结构的附加数据来记录每个函数的EBP和ESP, 来还原堆栈环境