如何使用引脚工具跟踪二进制仪器中的特定环路

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

本文关键字:环路 仪器 二进制 何使用 引脚 工具 跟踪      更新时间:2023-10-16

我是使用英特尔引脚工具的新手,并希望在二进制文件中跟踪某个循环,但我发现每次运行中指令的地址都发生了变化,我如何才能找到特定的指令或特定的循环,即使它在每次运行中都发生了变化?

编辑0:

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

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

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

1)禁用ASLR:

  • 在系统范围内禁用它:sysctl -w kernel.randomize_va_space=0
  • 每个进程禁用:$> setarch $(uname -m) -R /bin/bash,如下所示。

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

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

的例子:

  • 让我们假设在你第一次运行时,你的程序在0x80000000加载(这是"Base Address"),并且循环从0x80000210
  • 开始
  • 第二次运行时,程序在0x90000000("Base Address")处加载,循环在0x90000210
  • 处开始

只计算Base Address的循环偏移量:

  • Base_Address - Program_Address = offset
  • 0x80000210 - 0x80000000 = 0x210
  • 0x90000210 - 0x90000000 = 0x210

由于两个结果的偏移量是相同的,因此你知道你得到的是完全相同的指令,与程序的基址无关。

如何使用您的pintool:

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

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

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

最后有一篇很好的论文(现在很老了,但仍然适用)关于用大头针做环路检测,如果它能帮助你。