【问题标题】:checking memory access x86-64 assembly检查内存访问 x86-64 程序集
【发布时间】: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,它是一个用于进行此类验证的框架。

标签: assembly x86-64


【解决方案1】:

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

检查生成的程序集列表可能是错误的方法。一种合适的方法是在指令级动态执行二进制检测。只有在指令执行之前,您才能知道该指令是否将访问(读/写/两者)内存并采取相应的行动。您应该拦截每条指令。还有其他依赖于平台的方法,它们并不容易。例如,您可以实现一个在另一个进程中运行的简单调试器,并在指令读取和/或写入内存时中断。发生这种情况时,您可以检查正在访问的指令和地址并采取相应措施。 Linux 上的另一种方法是使用mprotect 在访问属于指定地址范围的内存位置时获得通知,并使用sigaction 捕获信号。在信号处理程序中,您可以采取适当的行动。

【讨论】:

  • 感谢 hadi,我正在使用 intel pin 进行检测
猜你喜欢
  • 2012-03-11
  • 2014-08-07
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多