【问题标题】:Pin memory access type in exception handling异常处理中的引脚内存访问类型
【发布时间】:2016-07-10 06:04:59
【问题描述】:

我正在使用 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

我在这里做错了吗?

【问题讨论】:

    标签: intel-pin


    【解决方案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)(例如,生成一个您知道也是的访问异常未对齐)。

    【讨论】:

    • 您好,非常感谢您的回复!我尝试了PIN_GetExceptionClass API,得到了EXCEPTCLASS_ACCESS_FAULT 返回值。所以看起来 Pin 能够找出异常的正确原因......
    • 不客气!如您链接的 API 文档中所述,EXCEPTCODE_ACCESS_MISALIGNED 的一部分 EXCEPTCLASS_ACCESS_FAULT [但它没有指定访问类型代码是什么]。每当我遇到这样的“错误代码”-->“错误类”API 时,我通常会发现打印/处理两者都很有用。
    猜你喜欢
    • 2011-08-18
    • 2019-08-11
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多