C - 如何拦截写入内存段的指令的地址?



想象一下,我们有一个像这样的常用指令

mov [eax], ebx

EAX包含一些我们想写的地址。

这个想法是编写一个 c 程序,告诉你哪个地址包含指令,如果我们已经知道它将写入的地址。

真正的问题: 使用免费的索尼PSPSDK编写一个C程序,可以完成同样的事情。

PSP使用MIPS III/IV,指令看起来像

sw a0 $00(t0)
##which literally spells out store register a0 at offset t0 + 0 bytes. where t0 would
## contain something like 0x08800000

免责声明:知道如何在Windows上执行此操作仍然很有用,因此,如果有人只知道如何在Windows甚至OSX上执行此操作,那仍然将不胜感激,因为它可以提供有关类似编程实践的相关信息来完成此特定任务。

拦截写入特定地址的指令不是程序中的正常活动。

这是某些调试器提供的功能。调试器至少有三种方法可以做到这一点:

  • 调试器可以检查程序代码并查找特定指令写入特定地址的位置。这实际上是一项非常复杂的活动,需要解释说明。通常,调试器无法完全做到这一点;因为这样做通常等同于完全解释和执行程序,就像计算机处理器一样,并且在软件中执行非常慢。相反,调试器可能会计划程序执行的一部分,并在无法轻松继续的位置(例如依赖于调试器不准备计算的值的分支指令(放置断点。断点是一种特殊指令,它中断程序执行,在这种情况下,会导致操作系统将控制权转移到调试器。此时,调试器删除断点,请求单步执行指令(处理器执行单步执行,然后立即中断程序执行(,检查结果并继续。
  • 调试器可以将包含所需地址的内存页标记为无访问权限。然后,每当程序访问该内存时,硬件将中断程序执行,操作系统将控制权转移给调试器。调试器检查导致中断的指令。如果指令正在访问目标地址,则调试器将对此执行操作。如果不是,调试器将更改内存保护以允许访问,请求单步执行指令,更改内存保护以禁止访问,并恢复程序以等待下一次中断。(调试器可能只是模拟指令,而不是单步执行指令,因为这可能会避免两次更改内存保护,这可能很昂贵。
  • 某些计算机处理器型号具有支持此类调试功能的功能。调试器可以请求监视内存的一部分,以便硬件在访问特定地址时中断程序执行,而不是在访问整个内存页的任何部分时中断程序执行。

我无法与您正在使用的索尼平台交谈。您必须检查其文档或向其他人询问此类功能的可用性。由于这是调试器最常使用的功能,因此调查有关调试的文档可能是确定系统是否支持此类功能的一种方式。

相关内容

  • 没有找到相关文章

最新更新