1

我正在使用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来恢复“当前指令”的执行,但基本上我可以在任意位置恢复吗?

我清楚了吗?感谢您的帮助!

4

1 回答 1

1

文档对此很清楚:

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

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

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

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

于 2016-04-09T17:04:16.933 回答