【发布时间】:2013-05-10 11:18:03
【问题描述】:
我想挂钩(本地)最终调用异常处理程序的函数,以便在处理程序实际执行之前获取处理程序的地址。
这甚至可能吗(在用户模式下)?
我必须挂钩哪个函数?
我必须分析哪个参数才能获得实际处理异常的异常处理程序的地址?
谢谢!
【问题讨论】:
-
问题不在于 C 和 C++ 异常之间的差异。我想知道哪个函数最终将控制流分派到异常处理程序中。
-
没有“函数”,__except 过滤器决定了哪些代码处理异常。如果没有,则程序崩溃。
-
我在谈论处理异常的内部函数。当抛出异常时,会调用一系列内部函数,以某种方式将控制流分派给异常处理程序。作为程序员,您只会看到 try/catch/... 但我想挂钩这些关键字背后的函数。无论如何,挂钩我自己的代码并没有多大意义:D。希望这能让它更清楚。
-
编译器不这样做,操作系统会搜索异常处理程序。以 RtlVirtualUnwind 为例。
-
只需修改函数并重新编译它,而不是挂钩它。上钩是一个疯狂的世界。不要去那里。只需遵循正常的工程实践即可。干扰异常调度会让你被标记为恶意软件,因为这是恶意软件为避免检测所做的事情。每个后续版本的 Windows 都进一步强化了异常调度,以应对越来越复杂的恶意软件攻击。
标签: c++ windows exception hook