ピン ツールを使用して、さまざまなルーチンでスタックを出力しようとしています。すべてのルーチンを取得できましたが、そのルーチンのスタック内のレジスタに格納されているアドレスを取得する方法について少し混乱しています。
私が持っているのはこれです:
VOID SETRTN_CONTEXT(CONTEXT * ctxt)
{
ADDRINT reg_address;
PIN_SaveContext(ctxt, &m_ctxt);
reg_address = PIN_GetContextReg(&m_ctxt, REG_STACK_PTR);
}
別の関数には、その関数を呼び出す次のコードがあります。
for(rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn) )
{
RTN_Open(rtn);
RTN_InsertCall(rtn, IPOINT_BEFORE, (AFUNPTR)SETRTN_CONTEXT,
IARG_CONST_CONTEXT, IARG_THREAD_ID, IARG_END);
RTN_Close(rtn);
}
結果が 1 つしか得られず、Pin で接続して数秒待った後に結果が得られるため、ルーチンがその関数を呼び出すタイミングについて少し混乱しています。
これで私を助けるかもしれないピンヘッドはありますか?レジスタを取得するためにルーチンからのコンテキストが必要であることは理解していますが、コンテキストをオブジェクトとして返す関数が見つかりません...