在回调函数内的任意位置恢复执行



我使用Pin进行动态分析。

在我对64位x86二进制代码的动态分析任务中,我希望在修复信号处理回调中的某些内存访问错误后,在任意程序位置(例如,当前执行函数的第二条指令)恢复执行。

它应该是这样的:

BOOL catchSignalSEGV(THREADID tid, INT32 sig, CONTEXT *ctx, BOOL hasHandler, const EXCEPTION_INFO *pExceptInfo, VOID *v)
{
    //  I will first fix the memory access error according to certain rules.
    fix();
   // then I would like to resume the execution at an arbitrary position, say, at the beginning of current monitored function
   set_reg(rip, 0x123456);                          // set the rip register 
   PIN_ExecuteAt(ctx);                              // resume the execution
   return false;
}

然而,我得到了这个异常:E:PIN_ExecuteAt()不能从回调中调用

我知道我可以通过在信号处理功能结束时返回false来恢复在"当前指令"执行,但基本上我可以在任意位置恢复吗?

我明白了吗?谢谢你的帮助!

文档对此很清楚:

工具可以调用此API来放弃当前的分析函数,并在新的应用程序注册状态下恢复调用线程的执行。请注意,此API不会返回到调用方的分析函数。

此API可以从分析函数或替换例程调用,但不能从回调调用

信号处理程序被视为回调。您只能在分析函数或替换例程中使用PIN_ExecuteAt。

您可以尝试做的一件事是保存您感兴趣的上下文,并允许应用程序恢复,确保要执行的下一条指令附带一个分析回调。您可以使用if-then检测来提高性能。然后您可以从该分析例程调用ExecuteAt。

最新更新