2016-03-23 1 views
0

Я реализую функцию обработки исключений, используя 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 

The FAULTY_ACCESS_TYPE моего кода выше еще UNKNOWN. Обратите внимание, что согласно его definition, тип доступа должен быть FAULTY_ACCESS_READ.

Неужели я ничего не нахожу здесь?

ответ

1

Перед тем, как позвонить PIN_GetFaultyAccessType, вы, вероятно, хотите:

(1) называют PIN_GetExceptionCode, чтобы получить EXCEPTION_CODE

(2) называют PIN_GetExceptionClass, чтобы получить EXCEPTION_CLASS

как тип доступа вина может только действительны/полезны, если класс EXCEPTCLASS_ACCESS_FAULT

Угадайте, так как вы получаете доступ к нечетному местоположению [с 32-битным словом fetch], библиотека ПИН-кода может установить [вероятно, устанавливает] бит x86 «проверка выравнивания» (#AC).

Затем вы получите EXCEPTCODE_ACCESS_MISALIGNED, который объяснит результаты, которые вы получите для типа (например, выравнивание сначала проверяется перед доступом). Поскольку это исключение выравнивания, другие коды типа доступа не подходят.

IMO, если PIN-код не комплект #AC, то, EXCEPTCODE_ACCESS_MISALIGNED - вид бессмысленного NOP.

Вы можете попробовать различные ebx значения, как 4 против известной страницы, что вы изменили защиту памяти на (например, генерировать исключение доступа, что вы знаете является не также перекос).

+0

Здравствуйте, большое вам спасибо за ваш ответ! Я попробовал API-интерфейс «PIN_GetExceptionClass» и получил возвращаемое значение «EXCEPTCLASS_ACCESS_FAULT». Таким образом, кажется, что Pin способен выяснить правильную причину исключения ... – computereasy

+0

Добро пожаловать! Как указано в ваших связанных документах API, 'EXCEPTCODE_ACCESS_MISALIGNED' _is_ часть' EXCEPTCLASS_ACCESS_FAULT' [но не указала, какой код типа доступа будет]. Всякий раз, когда мне приходилось сталкиваться с таким «кодом ошибки» -> «API-класс с ошибкой», мне обычно было полезно печатать/обрабатывать оба. –

Смежные вопросы