如何使用 pin 工具跟踪二进制检测中的特定循环?

How can i track a specific loop in binary instrumentation by using pin tool?

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

编辑 0:

我有以下地址,其中一个是 RVA:( 地址的第一部分(小地址)对于每个 运行,但每个 运行)
地址 loop_repeation No._of_Instruction_In_Loop
的最后一部分(大地址)发生了变化 4195942 1 8
4195972 1 3
......... ... ...
140513052566480 1 2
...... ... ...

the address of the instructions changed in each run, how can i find a specific instruction or a specific loop even it change in each run ?

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

1) 禁用 ASLR:

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

2) 在你的 pintool 中计算增量(偏移量):

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

示例:

  • 假设您的第一个 运行 程序在 0x80000000(这是 "Base Address")处加载,循环从 0x80000210
  • 开始
  • 在第二个 运行,程序加载到 0x90000000 ("Base Address"),循环从 0x90000210
  • 开始

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

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

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

如何在你的 pintool 中做到这一点:

  • 给定一个(指令)地址,使用IMG_FindByAddress找到对应的图像(模块)。
  • 从图中,使用IMG_LowAddress得到模块的基地址
  • 从指令中减去模块基数:你有 RVA。

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

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

最后there's a good paper(现在很老了,但仍然适用)关于用pin做环路检测,如果这对你有帮助的话。