英特尔 Pin:RECEIVED_ACCESS_FAULT异常后正确继续执行



在我的一个分析例程中,我收到了一个void*指针作为输入,它可能是也可能不是指向字符串的"好"指针。

为了检查坏指针的情况,我使用这里提出的IsBadPointer 变体 IsBadReadPtr 的最有效替代品?

但是,这并不完全可靠。因此,我想捕获在尝试尊重错误指针时引发RECEIVED_ACCESS_FAULT异常,将指针的值更改为正确值,然后继续执行。

因此,为了尝试此操作,我在分析例程中尊重全局 NULL 指针 (string_pointer(,并按如下方式设置异常处理程序:

EXCEPT_HANDLING_RESULT ExceptionHandler(THREADID tid, EXCEPTION_INFO *pExceptInfo, PHYSICAL_CONTEXT *pPhysCtxt, VOID *v)
{
EXCEPTION_CODE c = PIN_GetExceptionCode(pExceptInfo);
EXCEPTION_CLASS cl = PIN_GetExceptionClass(c);
std::cerr << "Exception class " << cl << endl;
std::cerr << PIN_ExceptionToString(pExceptInfo) << endl;
//Change string_pointer contents from NULL
string_pointer = "<Invalid Memory>";
return EHR_HANDLED;
}

不幸的是,这不起作用,因为引脚工具卡在异常处理程序中。有什么建议可以解决这个问题吗?

您应该始终使用 PIN_SafeCopy(( 从分析例程访问应用程序内存,其声明如下:

size_t LEVEL_PINCLIENT::PIN_SafeCopy(VOID* dst, const VOID* src, size_t size)

该函数返回从源缓冲区成功复制的字节数。因此,您可以将其与size进行比较,以确定它是否完全成功。PIN_SafeCopyEx()是一个类似的函数,可在发生故障时提供其他信息。

最新更新