我正在使用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,但基本上我可以在任意位置恢复?
我清楚了吗?谢谢你的帮助!答案 0 :(得分:1)
文档清楚明了:
工具可以调用此API以放弃当前分析函数并在新的应用程序寄存器状态下继续执行调用线程。请注意,此API不会返回给调用者的分析函数。
可以从分析函数或替换例程调用此API,但不能从回调中调用。
信号处理程序被视为回调。您只能在分析函数或替换例程中使用PIN_ExecuteAt。
您可能尝试做的一件事是保存您感兴趣的上下文并允许应用程序恢复,确保下一条要执行的指令附加了分析回调。您可以使用if-then检测来提高性能。然后,您可以从该分析例程调用ExecuteAt。