如何通过pin和libelf.h获取可执行程序的全局变量地址

时间:2019-05-21 02:05:15

标签: global-variables elf intel-pin

我想开发一个pintool来查找我的C程序的全局变量的地址。假设我有一个C程序,其中有一些Global指针变量。当我使用pintool运行相同的程序时,我希望通过pintool查找这些全局变量的地址。

我正在尝试通过引脚获取全局变量的地址,但是我们 所有人都知道Pin似乎没有提供这种功能。根据文档:“符号对象仅提供有关应用程序中功能符号的信息。有关其他类型符号(例如,数据符号)的信息,必须由工具独立获取,libelf.h似乎可以获取全局变量的地址,请帮助我并建议我如何才能做到这一点?

1 个答案:

答案 0 :(得分:0)

我只想发表评论,但这太长了...

每个定义的全局变量都驻留在可执行文件中(更确切地说,在.data或.bss节中,具体取决于它们是否已初始化)。分配了其他变量(在堆栈或堆上)。

您甚至不需要符号来检查变量(给定其地址)是否在可执行节之一中:使用图像检测功能(IMG_xxx),在各节({{ 1}})获取各节的基础和结尾,检查它是哪一个(.data或.bss)。您可以使用SEC_xxx通过PIN来获取该部分的类型;一旦有了地址,如果它位于.bss或.data中,那么您就有一个全局变量。

现在,如果您想要位于给定地址的变量名称,则它会更加复杂,并且如PIN文档所述,您将需要符号信息。我不知道libelf是否可以轻松做到这一点,但libdwarf可以做到。您还可以查看llvm-dwarfdump代码,该代码是开源的,并且也可以做到这一点。