在异常处理中引脚内存访问类型

时间:2016-03-23 04:27:30

标签: intel-pin

我正在使用Pin实现异常处理功能。在我的异常处理代码中,我特别搜索内存访问错误,比如内存读取错误和内存写入错误。我在下面写了一些代码:

BOOL catchSignalTest(THREADID tid, INT32 sig, CONTEXT *ctx, BOOL hasHandler, const EXCEPTION_INFO *pExceptInfo, VOID *v)
{
    ADDRINT exptAddr = PIN_GetExceptionAddress(pExceptInfo);
    ADDRINT exptAddr = PIN_GetExceptionAddress(pExceptInfo);
    FAULTY_ACCESS_TYPE ty = PIN_GetFaultyAccessType(pExceptInfo); <----- ty is unknown type!!!
}

.....
 PIN_InterceptSignal(SIGSEGV, catchSignalTest, 0);

真正令我困惑的是,即使对于下面的典型内存读取访问错误:

mov eax, [ebx] <--- ebx = 0x01, which makes the read operation failed

上面代码的FAULTY_ACCESS_TYPE仍为UNKNOWN。请注意,根据其definition,我认为访问类型应为FAULTY_ACCESS_READ

我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

在致电PIN_GetFaultyAccessType之前,您可能希望:

(1)致电PIN_GetExceptionCode获取EXCEPTION_CODE

(2)致电PIN_GetExceptionClass获取EXCEPTION_CLASS

因为如果类为EXCEPTCLASS_ACCESS_FAULT

,则故障访问类型可能仅有效/有用

猜测一下,由于您正在访问奇数位置[使用32位字段提取],因此PIN库可能会设置[可能设置] x86的硬件&#34;对齐检查&#34 ; (#AC)位。

然后,您将获得EXCEPTCODE_ACCESS_MISALIGNED,这将解释您为该类型获得的结果(例如,在访问之前首先检查对齐)。由于它是一个对齐例外,其他访问类型代码并不适合。

IMO,如果PIN库设置#AC,则EXCEPTCODE_ACCESS_MISALIGNED是一种毫无意义的NOP。

您可以针对已更改内存保护的已知页面尝试各种ebx值(例如4)(例如,生成您知道 的访问权限>也未对齐)。