1

我正在尝试使用 pin 工具在不同的例程中打印出堆栈。我能够获得所有的例程,但我对如何获取存储在该例程堆栈中的寄存器中的地址有点困惑。

我所拥有的是:

VOID SETRTN_CONTEXT(CONTEXT * ctxt)
{
   ADDRINT reg_address;

   PIN_SaveContext(ctxt, &m_ctxt);
   reg_address = PIN_GetContextReg(&m_ctxt, REG_STACK_PTR);
}

在另一个函数中,我有这段代码调用该函数:

for(rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn) )
{
   RTN_Open(rtn);
   RTN_InsertCall(rtn, IPOINT_BEFORE, (AFUNPTR)SETRTN_CONTEXT,
      IARG_CONST_CONTEXT, IARG_THREAD_ID, IARG_END);
   RTN_Close(rtn);
}

当例程调用该函数时,我有点困惑,因为我只得到一个结果,并且在附加 Pin 并等待几秒钟后得到它。

有什么针头可以帮助我解决这个问题吗?我知道我需要例程中的上下文才能获取寄存器,但我找不到任何将上下文作为对象返回的函数......

4

1 回答 1

0

在您的 RTN_InsertCall 中,您添加了线程 id,而在您的 SETRTN_CONTEXT 函数声明中,您没有收到线程 id...可能想要解决这个问题。

此外,在您的分析例程 SETRTN_CONTEXT 中,您实际上并没有保存应用程序外部的任何内容。如果 m_ctxt 是您在其他地方操作的全局变量,我可能是错的,除非您每次运行分析例程并以线程安全的方式都这样做,否则这怎么可能是正确的?

显然,您希望将信息写入某个文件或输出。我建议使用某种 xml 工具;这使得解析变得容易,如果你巧妙地编写你的 pintools,你可以通过遵守一些接口契约来交换输出的格式。

另外为了澄清您的困惑,您尝试在特定图像中的每个函数之前插入分析例程以运行;每次在该图像中调用该函数时,您的 SETRTN_CONTEXT 都会运行。

于 2014-06-10T21:38:39.847 回答