如何使用 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做环路检测,如果这对你有帮助的话。
我刚开始使用 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做环路检测,如果这对你有帮助的话。