我使用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。