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型に対して取得した結果を説明するものを取得します (たとえば、アクセスの前にアライメントが最初にチェックされます)。これはアラインメントの例外であるため、他のアクセス タイプ コードは実際には適合しません。

PINライブラリが#ACを設定していないEXCEPTCODE_ACCESS_MISALIGNED場合、IMOは無意味なNOPのようなものです。

ebxメモリ保護を変更した既知のページに対して 4 などのさまざまな値を試すことができます (たとえば、位置合わせがずれていないことがわかっているアクセス例外を生成します)。

于 2016-03-23T06:26:56.957 に答える