linux - 如何从 Linux 上的 Intel Pin 获取地址空间布局?

标签 linux intel-pin

我想从 Linux 上的 Intel Pin 获取地址空间布局。

首先,我尝试读取文件 - /proc/PID/maps 并获取地址空间布局。但是你什么时候执行这部分代码呢?

如果你把它放在PIN_StartProgram之前, map 文件将不会包含一些区域,比如heap;

如果你把它放在Fini中,并用PIN_AddFiniFunction(Fini, 0); hook它,应该就可以了。但是,当您仅跟踪一次 ls 执行时,您看不到任何与输出相关的地址空间布局。那是有线的。

最佳答案

也许不是最好的解决方案,但它对我有用。主要问题是当工具启动时,地址空间还没有准备好。您可以等到所有图像都加载完毕,然后再读取 procfs 的内容。

所以你应该为每个图像添加一个检测函数。例如在main函数中添加如下语句:

IMG_AddInstrumentFunction(Image, 0);

那么你应该在每次加载图像时读取 procfs。这是因为你不知道最后加载的是哪张图片(当然,如果你知道最后一张是哪张图片,你可以在加载该图片后只读取一次文件):

VOID Image(IMG img, VOID *v)
{
    ...
    /* open /proc/PID/maps and read its contents */
    ...
}

在程序执行期间,您始终拥有地址空间的最新映射,一切都会好起来的。尽管如此,您应该始终小心处理运行时布局修改,以及使用 brk() 系统调用增加堆大小等情况。

关于linux - 如何从 Linux 上的 Intel Pin 获取地址空间布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46282615/

相关文章:

linux - 如何在 digital ocean 上部署此 Docker 应用程序?

php - 无法通过 php 脚本发送邮件

c - 如何将 2 个部分放入 1 个部分(使用 ld 脚本)

php - 如何使用at命令在特定时间运行PHP脚本?

c++ - 在 Intel Pin 中使用 IARG_MEMORYWRITE_SIZE 和 IARG_MEMORYREAD_SIZE 参数

c++ - 使用依赖项编译 PIN 工具

xml - 通过 bash 脚本重新格式化文件 linux 中的文本

c++ - Intel Pin 获取函数参数号

c - Pin 工具 - 通过地址拦截指令以转储寄存器值

linux - 为什么有些回调函数不能在Pin中调用?