如何使用 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 工具跟踪二进制仪器中的特定循环?的主要内容,如果未能解决你的问题,请参考以下文章