Windows逆向工程提升之异常处理机制
- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
Exception
Windows异常处理机制
异常类型
处理流程
标准C++异常处理机制
结构化异常处理(SEH)
结构化异常处理 (SEH)
SEH适用场景
SEH语法与流程
除零异常演示
内存异常演示
异常过滤器函数
Exception
Windows异常处理机制
异常类型
- 硬件异常:由CPU触发(如除零、访问违例、断点指令)
- 软件异常:由RaiseException()主动抛出
- 系统异常:如内存不足、堆栈溢出等
处理流程
- 分发阶段:系统寻找异常处理函数
- 处理阶段:处理函数决定继续执行或终止
- 栈展开(Unwinding):清理栈帧资源
- 终止处理(Termination Handlers):
__finally
块执行
标准C++异常处理机制
- 使用try-catch-throw语法。
- 处理运行时错误(如访问非法内存、逻辑错误)。
- 更推荐用于逻辑异常(非硬件异常)。
结构化异常处理(SEH)
- 操作系统级别的异常处理,用于处理访问违法页、算术溢出或硬件异常等低级错误。
- 提供底层的异常捕获能力,适合控制访问权限和硬件级错误处理。
结构化异常处理 (SEH)
- SEH(Structured Exception Handling,结构化异常处理)是 Windows 操作系统提供的一种错误处理机制,用于捕获和处理运行时异常。
- 允许开发者处理硬件异常(如内存访问违规、除以零、堆栈溢出)和软件异常,提供一种保护代码执行、分析异常并恢复功能的机制。
SEH适用场景
- 捕获 硬件异常(如访问违规、除零、堆栈溢出)。
- 实现低级的 容错机制,例如保护进程在运行中不崩溃。
- 配合 逆向工程,在分析程序运行逻辑时保护或记录异常。
SEH语法与流程
- __try:定义保护代码块。异常发生时,会跳出该代码块并转到异常处理块。
- __except:捕获异常并处理。通过过滤器表达式判断异常类型及处理方式。
- __finally:无论是否发生异常,都会执行。通常用于释放资源或清理逻辑。
__try { // 正常代码块,可能会引发异常的代码
}
__except (filter_expression) { // 异常处理代码块,根据过滤条件决定是否处理异常
}
__finally { // 清理代码块,无论是否发生异常,都会执行
}
除零异常演示
#include <windows.h>
#include <iostream> int main() { __try { int x = 10, y = 0; int z = x / y; // 引发 EXCEPTION_INT_DIVIDE_BY_ZERO 异常 } __except (GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { std::cout << "捕获到整数除零异常。" << std::endl; } std::cout << "程序继续执行!" << std::endl; return 0;
}
内存异常演示
#include <windows.h>
#include <iostream> int main() { __try { int* ptr = nullptr; // 空指针 *ptr = 42; // 引发 EXCEPTION_ACCESS_VIOLATION 异常 } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { std::cout << "捕获到非法内存访问异常。" << std::endl; } return 0;
}
异常过滤器函数
- 在 __except 块中,过滤器表达式可以用来根据异常代码进行判断,常用宏和函数包括:
- GetExceptionCode():返回引发异常的异常代码。
- 返回值:
- EXCEPTION_CONTINUE_EXECUTION:忽略异常,恢复继续执行(恢复执行)。
- EXCEPTION_CONTINUE_SEARCH:允许Windows继续查找接下来的异常处理程序(继续向上传递异常)。
- EXCEPTION_EXECUTE_HANDLER:执行异常处理程序(执行__except块)。
-
__try { int* p = nullptr; *p = 100; // 可能引发 EXCEPTION_ACCESS_VIOLATION } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { printf("捕获了一个访问违规异常!\n"); }