2016-04-08 12 views
1

動的解析にPinを使用しています。コールバック関数内の任意の位置で実行を再開する

私の64ビットx86バイナリコードの動的解析タスクでは、シグナル処理の中で特定のメモリアクセスエラーを修正した後、任意のプログラム位置(たとえば、現在実行されている関数の2番目の命令)で実行を再開したいと思いますコールバック。

BOOL catchSignalSEGV(THREADID tid, INT32 sig, CONTEXT *ctx, BOOL hasHandler, const EXCEPTION_INFO *pExceptInfo, VOID *v) 
{ 
    // I will first fix the memory access error according to certain rules. 
    fix(); 

    // then I would like to resume the execution at an arbitrary position, say, at the beginning of current monitored function 
    set_reg(rip, 0x123456);       // set the rip register 
    PIN_ExecuteAt(ctx);        // resume the execution 

    return false; 
} 

しかし、私はこの例外を得た:E:PIN_ExecuteAt()コールバックから呼び出すことはできません

それはこのようなものになるだろう。

は、私は、信号処理関数の最後に戻り偽で「現在の命令」で実行を再開することができます知っているが、基本的に私は任意の位置で再開することができますか?

私はクリアですか?ご協力ありがとうございました!

答えて

1

ドキュメントはこの上明確である:

ツールは、現在の解析機能を放棄し、新しいアプリケーション・レジスタの状態で呼び出し元のスレッドの実行を再開するために、このAPIを呼び出すことができます。このAPIは、呼び出し元の分析関数には戻っていないことに注意してください。

このAPIは、分析関数または置換ルーチンからコールできますが、コールバックからはコールできません。

シグナルハンドラはコールバックとみなされます。分析関数または置換ルーチンでのみ、PIN_ExecuteAtを使用できます。あなたがしようとするかもしれ

ことの一つは、あなたが興味を持っているコンテキストを保存し、アプリケーションを再開することができ、次に実行すべき命令は付属の解析コールバックを持っていることを確実にすることです。パフォーマンスを向上させるためにif-then instrumentationを使用することができます。次に、その分析ルーチンからExecuteAtを呼び出すことができます。

+0

ご協力いただきありがとうございます。私はあなたのアドバイスに従って作成しました。しかし、私はまだ 'パフォーマンスを向上させるために' if-then instrumentation'と混同しています...もっと詳しく説明できますか?ありがとう – computereasy

+0

信号が性能に大きな影響を与える可能性があり引き起こす可能性があるすべての命令のための解析ルーチンを持つので、私はそれについて話していました。 if-then instrumentationがコメントセクションよりも多くのスペースを必要とすることを説明します。私はピンのウェブサイトに行き、チュートリアルセクションを見てみることをお勧めします。 – nitzanms

関連する問題