我正在尝试使用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并等待了几秒钟后得到它。
任何可能对我有帮助的针头?我理解我需要从例程中获取寄存器以获取寄存器,但我找不到任何将上下文作为对象返回的函数...
答案 0 :(得分:0)
在您的RTN_InsertCall中,您添加了线程ID,并且在您的SETRTN_CONTEXT函数声明中,您没有收到线程ID ...可能想要修复它。
此外,在您的分析例程SETRTN_CONTEXT中,您实际上并未保存应用程序外部的任何内容。如果m_ctxt是一个你在其他地方操纵的全局变量,我可能会错,除非你每次分析例程运行并以线程安全的方式执行此操作,否则这听起来怎么样?
显然,您希望将信息写入某个文件或输出。我建议使用某种xml工具;这样可以很容易地解析,如果你巧妙地编写pintools,你可以通过遵守一些接口契约来交换输出的格式。
为了澄清您的困惑,您尝试插入分析例程以在特定图像中的每个函数之前运行;每次在该图像中调用该函数时,SETRTN_CONTEXT都会运行。