如何使用引脚工具跟踪二进制仪器中的特定环路
How can i track a specific loop in binary instrumentation by using pin tool?
我是使用英特尔引脚工具的新手,并希望在二进制文件中跟踪某个循环,但我发现每次运行中指令的地址都发生了变化,我如何才能找到特定的指令或特定的循环,即使它在每次运行中都发生了变化?
编辑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])…
最后有一篇很好的论文(现在很老了,但仍然适用)关于用大头针做环路检测,如果它能帮助你。
- 普通环路未使用gcc 4.8.5自动矢量化
- C++ - 标准输入环路
- 如何在arduino或Raspberrypi上制作600MHz环路?
- 为什么在环路条件中使用'<='而不是'<'会产生分段错误 [SIGSEGV]?
- 使用 std::mutex 保护环路
- 在信号槽机制与传统环路之间做出决定
- 在环路中使用 UDP 套接字时连接被拒绝
- GCC 仪器 - 是否可以自动输出函数的参数?
- DebugDiag - 仪器堆栈,如windbg 'kp' 命令
- 临时参考 C++11 上的环路的远程基座
- OpenMP 环路阵列访问中的错误共享
- 环路内开关的性能
- QT中的无限环路
- 用Android上的仪器分析
- 超过8个字符的字符串导致无限环路C
- 如何使Valgrind不仪器特定的共享对象
- 对于(继承类)C ,不存在默认的仪器
- 用指针清理队列时,无尽的环路
- 无盖插座的紧密RECV环路
- 如何使用引脚工具跟踪二进制仪器中的特定环路