在执行地址而不直接修改地址时引发异常

时间:2013-02-03 05:32:28

标签: c++ windows exception breakpoints

我想在执行给定地址的代码时引发异常,而不会在代码中显示它。

我知道使用硬件断点是可能的,但是如果有人要附加使用它们的调试器,这些就会被删除,而我无法检测它们是否缺失并替换它们。还有哪些其他选择?

速度是一个问题,即:我不能做PAGE_GUARD单步执行;用户会迟到。

我在Windows上并使用VC 2012 w / C ++。

1 个答案:

答案 0 :(得分:1)

如果异常处理成本太高,唯一的其他解决方案就是像CPU那样模拟代码。

但有几点需要注意:

  • 有很多指令和解码并正确模拟它们是一项艰巨的任务。在仿真和执行之间切换会花费额外的CPU周期。
  • 您无法模仿所有内容,并且必须在" playground / sandbox"中执行大量指令(例如FPU / MMX / SSE指令)。因为那个。
  • 要正确处理系统调用,您实际上必须准备CPU状态并执行它们然后返回模拟器。您可能必须在这里动态生成代码。
  • 如果模拟代码导致CPU异常并使用SEH来处理它们(或者再次通过SEH抛出并捕获C ++异常作为CPU异常),则很可能会破坏代码,因为堆栈展开不会起作用外国人(模仿者)堆栈。
  • 多线程代码会变得棘手,特别是在多处理器系统上。您必须捕获线程创建/销毁并创建/销毁模拟器的各个实例,并处理线程之间的内存共享并处理模拟/执行指令的原子性。
  • 无论我忘记想什么。
  • 事情可能仍然工作太慢或根本不工作。

另一个,也许更实际的选择是在可感兴趣的地址修补可执行文件,将执行转移到你的代码(使用jmp指令),在那里做你需要的任何事情然后再回去。您必须处理所有上下文保留/恢复,并模拟由写在其上的jmp指令损坏的指令。这里也有一些警告。那些被覆盖的指令可以从代码中的其他地方跳转到。您必须选择地址,以便不会跳到jmp的中间,或者您必须以某种方式处理它们(不确定如何) )。