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

Posted

技术标签:

【中文标题】如何使用 pin 工具跟踪二进制仪器中的特定循环?【英文标题】:How can i track a specific loop in binary instrumentation by using pin tool? 【发布时间】:2015-08-04 16:49:33 【问题描述】:

我刚开始使用 intel pin 工具,想在二进制文件中跟踪某个循环,但我在每次运行中发现每次运行中更改的指令地址,我如何找到特定指令或特定指令循环,即使它在每次运行中都会改变? 编辑 0: 我有以下地址,其中一个是 RVA:(地址的第一部分(小地址)对于每次运行都是恒定的,但最后一部分(大地址)每次运行都会改变)地址loop_repeation No._of_Instruction_In_Loop 4195942 1 8 4195972 1 3 .......    ...    ... 140513052566480 1 2 ......   ...   ...

【问题讨论】:

【参考方案1】:

每次运行时更改的指令地址,即使每次运行都更改,我如何找到特定指令或特定循环?

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

1) 禁用 ASLR:

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

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

对于您操作的每个地址,您需要使用 RVA (Relative Virtual Address) 而不是完整的 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])...

最后there's a good paper(现在很旧,但仍然适用)使用 pin 进行循环检测,如果可以帮助您的话。

【讨论】:

谢谢亲爱的,我有以下地址,其中一个是RVA:(地址的第一部分(小地址)每次运行都是不变的,但最后一部分(大地址)每次运行都更改)地址 loop_repeation No._of_Instruction_In_Loop 4195942 1 8 4195972 1 3 ....... ... ... 140513052566480 1 2 ...... ... ... @MosMoh 你能用你在这里粘贴的内容编辑和更新你的问题吗?如果格式不正确,就很难阅读......另外,你有没有尝试应用我的任何建议?什么不起作用? @Neitsa,谢谢亲爱的,我编辑了这个问题,我希望现在清楚了,我没有尝试过,我仍然有误解,如果在运行时执行的指令数发生了变化(可能是由于函数调用的 if 条件)这种方法仍然有效吗? 感谢我收到的论文。

以上是关于如何使用 pin 工具跟踪二进制仪器中的特定循环?的主要内容,如果未能解决你的问题,请参考以下文章

Intel Pin:测量空仪器开销

如何使用 Intel Pin 工具生成分支列表?

Ruby on Rails:Xcode:仪器:跟踪/BPT 陷阱?它是啥,我该如何解决?

带有注释(pragma)的仪器 C 代码用于性能跟踪

用于跟踪 CreateFile 调用的 Pin 工具

xcode 仪器“跟踪分配”在哪里