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

C 如何截取写入内存段的指令地址?,c,gcc,portability,playstation,C,Gcc,Portability,Playstation,假设我们有一个像这样的常规指令 mov [eax], ebx eax包含一些我们想要写入的地址 这个想法是写一个c程序,告诉你哪个地址包含指令,如果我们已经知道它要写入的地址 真正的问题是: 使用免费的sony pspsdk编写一个c程序,可以完成同样的任务 psp使用MIPS III/IV,指令看起来像 sw a0 $00(t0) ##which literally spells out store register a0 at offset t0 + 0 bytes. where t0 w

假设我们有一个像这样的常规指令

mov [eax], ebx
eax包含一些我们想要写入的地址

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

真正的问题是: 使用免费的sony 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上执行此操作,这仍然值得赞赏,因为它可以提供类似编程实践的相关信息,以完成此特定任务。

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

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

调试器可以检查程序代码并找到特定指令写入特定地址的位置。这实际上是一项非常复杂的活动,需要解释说明。通常,调试器不能完全完成这项工作;一般来说,这样做相当于完全按照计算机处理器的方式解释和执行程序,在软件中执行起来非常慢。相反,调试器可能会计划部分程序执行,并在无法轻松继续的位置设置断点,例如在依赖于调试器不准备计算的值的分支指令处。断点是中断程序执行的特殊指令,在这种情况下,会导致操作系统将控制转移到调试器。此时,调试器删除断点,请求指令单步执行,处理器执行单步指令,然后立即中断程序执行,检查结果,然后继续。 调试器可以将包含所需地址的内存页标记为不可访问。然后,每当程序访问该内存时,硬件将中断程序执行,操作系统将控制权转移给调试器。调试器检查导致中断的指令。如果指令正在访问目标地址,调试器将对此进行操作。如果不是,调试器将更改内存保护以允许访问,请求指令单步执行,将内存保护更改为不允许访问,并恢复程序以等待下一次中断。调试器可能只是模拟指令,而不是单步执行指令,因为这样可以避免两次更改内存保护,这可能会很昂贵。 某些计算机处理器型号具有支持此类调试功能的功能。调试器可以请求监视部分内存,以便在访问特定地址时,而不是在访问整个内存页的任何部分时,硬件中断程序执行。
我无法与您使用的索尼平台通话。您必须查看其文档,或询问其他人有关此类功能的可用性。由于这是调试器最常使用的功能,因此调查有关调试的文档可能是确定系统是否支持此类功能的一种方法。

我认为在一般的C代码中无法做到这一点。它需要来自处理器的一些专用硬件支持,即处理器中的一些硬件可以编程以生成写入特定地址的异常。许多调试器可以使用专用硬件设置写断点。如果可以的话,也许你可以研究一下调试器的源代码。对于MIPS,我似乎记得它被称为EJTAG。