您如何拦截正在写入一段内存的指令的地址?

how do you intercept the address of an instruction that is writing to a segment of memory?

假设我们有一个像这样的普通指令

mov [eax], ebx

并且 eax 包含一些我们想要写入的地址。

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

真题: 使用免费的索尼 pspsdk 编写一个 c 程序来完成同样的事情。

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

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

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

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

这是一些调试器提供的功能。调试器至少可以通过三种方式执行此操作:

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

我无法与您使用的索尼平台通话。您将不得不检查其文档或询问其他人有关此类功能的可用性。由于这是调试器最常使用的功能,因此调查有关调试的文档可能是查明系统是否支持此类功能的一种方式。