0

我想在执行给定地址的代码时引发异常,而不使其在代码中可见。

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

速度是一个问题,即:我不能做 PAGE_GUARD 单步;用户会滞后到死。

我在 Windows 上并使用带有 C++ 的 VC 2012。

4

1 回答 1

1

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

但是,有一些警告:

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

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

于 2013-02-03T05:57:18.360 回答