我想限制对内存中特定区域的访问(读,写),我试图弄清楚哪些是可以访问通过gcc程序集生成的内存的指令(gcc -S)。由于x86-64中的大多数指令都可以访问内存,因此在我目前的方法中,我正在检查指令中的括号。如果括号出现,我将检查所访问的地址。
addq (rdi),rsi
movq (eax),ebx
movq ecx, eax
在上面的例子中,我将假设第一和第二个访问内存和第三个指令没有。我的方法是否正确,如果没有检查括号是否覆盖所有内存访问,是否有其他内存访问指令的列表。
答案 0 :(得分:2)
除了@ Jester的comment提到的案例之外,还有一些指令可以有条件地访问内存,例如CMOVcc。也不要忘记自我修改代码。
检查生成的汇编列表可能是错误的方法。一种合适的方法是在指令级动态地执行二进制检测。只有在执行指令之前,您才能知道该指令是否将访问(读/写/两者)内存并相应地执行操作。你应该拦截每一条指令。还有其他依赖于平台的方法,它们并不容易。例如,您可以实现在另一个进程中运行的简单调试器,并在指令读取和/或写入内存时中断。发生这种情况时,您可以检查指令和正在访问的地址并采取相应措施。 Linux上的另一种方法是使用mprotect在访问属于指定地址范围的内存位置时收到通知,并使用sigaction捕获信号。在信号处理程序中,您可以采取适当的操作。