检查内存访问 x86-64 程序集

checking memory access x86-64 assembly

我想限制对内存中特定区域的访问(读、写),我试图找出哪些指令可以访问通过 gcc 程序集 (gcc -S) 生成的内存。由于 x86-64 中的大多数指令都可以访问内存,在我目前的方法中,我正在检查指令中的括号。如果存在括号,我将检查访问的地址。

addq (rdi),rsi
movq (eax),ebx
movq  ecx, eax

在上面的示例中,我假设第 1 条和第 2 条访问内存以及第 3 条指令没有。我的方法是否正确,是否检查括号是否涵盖所有内存访问,如果没有,是否有其他内存访问指令的列表。

除了@Jester的提到的情况外,还有CMOVcc等条件访问内存的指令。也不要忘记自修改代码。

检查生成的程序集列表可能是错误的方法。一种合适的方法是在指令级别动态执行二进制检测。只有在一条指令被执行之前,您才能知道该指令是否要访问 (read/write/both) 内存并采取相应的行动。您应该拦截每条指令。还有其他依赖于平台的方法,它们并不容易。例如,您可以在另一个进程中实现一个简单的调试器 运行,并在指令读取 and/or 写入内存时中断。发生这种情况时,您可以检查指令和正在访问的地址并采取相应措施。 Linux 的另一种方法是使用 mprotect to get notified when a memory location that is part of the specified address range is being accessed and catch the signal using sigaction。在信号处理程序中,您可以采取适当的操作。