4

我刚开始使用 intel pin 工具,想跟踪二进制文件中的某个循环,但我在每次运行中发现每次运行中更改的指令地址,我如何才能找到特定指令或特定循环每次运行都有变化?

编辑0:

我有以下地址,其中一个是RVA:(地址的第一部分(小地址)每次运行都是不变的,但最后一部分(大地址)每次运行都会改变)
地址loop_repeation编号。 _of_Instruction_In_Loop
4195942 1 8
4195972 1 3
.... ... ... ...
140513052566480 1 2
... ... ... ...

4

1 回答 1

3

指令的地址在每次运行中都发生了变化,我如何才能找到特定指令或特定循环,即使它在每次运行中都发生了变化?

这可能是因为您启用了ASLR (在 Ubuntu 上默认启用)。如果您希望分析的程序在每次运行时加载到相同的地址,您可能需要:

1) 禁用 ASLR:

  • 在系统范围内禁用它:sysctl -w kernel.randomize_va_space=0如此处所述
  • 按进程禁用它:$> setarch $(uname -m) -R /bin/bash如此处所述

2)在您的 pintool 中计算 delta(偏移量):

对于您操作的每个地址,您需要使用 RVA(相对虚拟地址)而不是完整的 VA(虚拟地址)。

例子:

  • 假设在您第一次运行时,您的程序加载在 0x80000000(这是“基地址”),并且循环从 0x80000210 开始
  • 在第二次运行时,程序在 0x90000000(“基地址”)加载,循环从 0x90000210 开始

只需从基地址计算循环的偏移量:

  • Base_Address - Program_Address = 偏移量
  • 0x80000210 - 0x80000000 = 0x210
  • 0x90000210 - 0x90000000 = 0x210

由于两个结果偏移量相同,因此您知道您拥有完全相同的指令,而与程序的基地址无关。

如何在您的 pintool 中执行此操作:

  • 给定一个(指令)地址,用于IMG_FindByAddress查找对应的图像(模块)。
  • 从图像中,用于IMG_LowAddress获取模块的基地址。
  • 从指令中减去模块库:你有 RVA。

现在您可以比较它们之间的 RVA 并查看它们是否相同(它们也必须在同一个模块中)。

显然,这不适用于 JITed 代码,因为 JITed 代码没有可执行模块(想想 mmap() [linux] 或 VirtualAlloc() [windows])......

最后有一篇关于使用 pin 进行循环检测的好论文(现在很旧,但仍然适用),如果可以帮助你的话。

于 2015-05-27T15:25:22.217 回答