2016-03-23 7 views
0

ピンを使用した例外処理機能を実装しています。私の例外処理コードでは、特にメモリアクセスエラー、たとえばメモリ読み出しエラーとメモリ書き込みエラーを検索します。上記UNKNOWNはまだ私のコードの例外処理におけるメモリアクセスタイプのピン番号

mov eax, [ebx] <--- ebx = 0x01, which makes the read operation failed 

FAULTY_ACCESS_TYPE:本当に私を混乱させる何

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); 

は、典型的なメモリは、以下のアクセスエラーを読んでもために、ということである:私は以下のいくつかのコードを書きました。 definitionによれば、私はアクセスタイプがFAULTY_ACCESS_READであるべきだとします。

ここに何か間違っていますか?

答えて

1

あなたがPIN_GetFaultyAccessTypeを呼び出す前に、あなたはおそらくしたい:

(1)EXCEPTION_CODE

を取得するためにPIN_GetExceptionCodeを呼び出すと、(2)障害のアクセスタイプとしてEXCEPTION_CLASS

を取得するためにPIN_GetExceptionClassを呼び出すことができますクラスがEXCEPTCLASS_ACCESS_FAULT

の場合にのみ有効/便利です。奇妙な場所[32ビットの単語fetch]を実行すると、PINライブラリはx86のハードウェアの "alignment check"(#AC)ビットを設定します。

次に、型の結果を説明するEXCEPTCODE_ACCESS_MISALIGNEDが表示されます(たとえば、アクセスの前に整列が最初にチェックされます)。アラインメント例外なので、他のアクセスタイプコードは実際には適合しません。

IMO、PINライブラリがでない場合、が#ACに設定されている場合、EXCEPTCODE_ACCESS_MISALIGNEDは無意味なNOPです。

あなたが(例えば、あなたがの位置がずれてもではありません知っているアクセス例外を発生させる)でメモリ保護を変更知られているページに対して4のような様々なebx値を試みることができます。

+0

こんにちは、お返事ありがとうございました!私は 'PIN_GetExceptionClass' APIを試して、' EXCEPTCLASS_ACCESS_FAULT'戻り値を得ました。だから、ピンは例外の正しい理由を理解することができるようです... – computereasy

+0

あなたはようこそ!あなたのリンクされたAPIドキュメントに書かれているように、 'EXCEPTCODE_ACCESS_MISALIGNED'は' EXCEPTCLASS_ACCESS_FAULT'の一部ですが、アクセスタイプコードは何であるかは指定していません。私がこのような "エラーコード" - > "エラークラス" APIに直面したときはいつも、両方を印刷/処理することが有用であることがわかっています。 –