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

Resume execution at arbitrary positions inside a callback function

我正在使用 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() 无法从回调中调用。

我知道我可以在信号处理函数结束时通过 return false 在“当前指令”恢复执行,但基本上我可以在 任意个位置?

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

文档对此很清楚:

A tool can call this API to abandon the current analysis function and resume execution of the calling thread at a new application register state. Note that this API does not return back to the caller's analysis function.

This API can be called from an analysis function or a replacement routine, but not from a callback.

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

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