0

我正在使用 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. 请注意,根据它的定义,我想访问类型应该是FAULTY_ACCESS_READ.

我在这里做错了吗?

4

1 回答 1

1

在你打电话之前PIN_GetFaultyAccessType,你可能想要:

(1) 调用PIN_GetExceptionCode获取EXCEPTION_CODE

(2) 调用PIN_GetExceptionClass获取EXCEPTION_CLASS

因为故障访问类型可能仅在该类是有效/有用的情况下EXCEPTCLASS_ACCESS_FAULT

猜测一下,由于您正在访问一个奇怪的位置 [使用 32 位字提取],PIN 库可能会设置 [可能设置] x86 的硬件“对齐检查”(#AC)位。

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

IMO,如果 PIN 库没有设置#AC,那么,EXCEPTCODE_ACCESS_MISALIGNED这是一种毫无意义的 NOP。

ebx您可以针对更改了内存保护的已知页面尝试各种值,例如 4(例如,生成一个您知道对齐的访问异常)。

于 2016-03-23T06:26:56.957 回答