我正在使用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
。
我在这里做错了吗?
答案 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)(例如,生成您知道 的访问权限>也未对齐)。