我刚开始使用 intel pin 工具,想跟踪二进制文件中的某个循环,但我在每次运行中发现每次运行中更改的指令地址,我如何才能找到特定指令或特定循环每次运行都有变化?
编辑0:
我有以下地址,其中一个是RVA:(地址的第一部分(小地址)每次运行都是不变的,但最后一部分(大地址)每次运行都会改变)
地址loop_repeation编号。 _of_Instruction_In_Loop
4195942 1 8
4195972 1 3
.... ... ... ...
140513052566480 1 2
... ... ... ...
问问题
904 次
1 回答
3
指令的地址在每次运行中都发生了变化,我如何才能找到特定指令或特定循环,即使它在每次运行中都发生了变化?
这可能是因为您启用了ASLR (在 Ubuntu 上默认启用)。如果您希望分析的程序在每次运行时加载到相同的地址,您可能需要:
1) 禁用 ASLR:
- 在系统范围内禁用它:
sysctl -w kernel.randomize_va_space=0
如此处所述。 - 按进程禁用它:
$> setarch $(uname -m) -R /bin/bash
如此处所述。
2)在您的 pintool 中计算 delta(偏移量):
对于您操作的每个地址,您需要使用 RVA(相对虚拟地址)而不是完整的 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])......
最后有一篇关于使用 pin 进行循环检测的好论文(现在很旧,但仍然适用),如果可以帮助你的话。
于 2015-05-27T15:25:22.217 回答