【发布时间】:2015-07-07 00:27:03
【问题描述】:
我想限制对内存中特定区域的访问(读、写),我试图找出哪些指令可以访问通过 gcc 程序集(gcc -S)生成的内存。由于 x86-64 中的大多数指令都可以访问内存,因此在我目前的方法中,我正在检查指令中的括号。如果括号存在,我将检查访问的地址。
addq (rdi),rsi
movq (eax),ebx
movq ecx, eax
在上面的例子中,我假设第 1 次和第 2 次访问内存和第 3 条指令没有。我的方法是否正确,是否检查括号是否涵盖所有内存访问,是否有其他内存访问指令的列表。
【问题讨论】:
-
不,它没有,你可以直接访问内存(例如
mov foo, eax)还有一些指令隐式使用内存(例如movsb甚至push)。相反,lea (rdi), rax不访问内存。 -
@Jester 好的,有没有比检查每条指令更好的方法
-
即使您知道哪条指令可以访问内存,您也无法在不运行程序的情况下预测它们将访问哪些内存位置。
-
@RossRidge 是的,我只会在运行时检查。如果我知道哪些指令正在访问内存,我将在该指令之前添加额外的代码以验证有效性。
-
您可能想看看 valgrind,它是一个用于进行此类验证的框架。