2017-07-10 8 views
1

私は、C++で入力と終了の関数をログに記録するために、これは、従来のコードベースを想定して動作しています。しかし、私はgitからダウンロードしたプロジェクトにフックする際に、対象コードのextern変数に保存する関数アドレスを使用します。これらはプロファイラライブラリでは別のものになります。これは、フックされた関数と保存された関数の間の関数ポインタの比較を乱すことです。現在C++関数のアドレスは、対象となるコードベースよりも、添付のプロファイラライブラリで異なるものが出てくる

対象コードメインファイルの

関数アドレス、ブレークポイントは、プロファイラコードで_penterフック関数内にある enter image description here

に同じエントリは、関数名の前に「_」と別のアドレスを示していますプロファイラコード

私はそれがアドレスをどのように変更しているのか、私が何か間違っているかどうかを知りたいとは考えていません。

私がやっているのは、関数のポインタ(およびそれらの名前)がサブジェクト・メイン関数(すべての関数が利用可能)のサブジェクト・コード関数の参照で初期化されています。ライブラリのフック関数(_penter)では、今入力した関数のアドレスを取得します。だから私はそれをextern配列のアドレスと比較し、それが一致すれば、入力された関数を記録する。 PROFILE.H FROM

SNIPPET(プロファイラ)

extern Signature FuncTable[3000]; 

PROFILE.CPPからの抜粋(プロファイラ)

void _stdcall EnterFunc0(unsigned * pStack) 
{ 
    void  * pCaller; 
    pCaller = (void *)(pStack[0] - 5); // the instruction for calling _penter is 5 bytes long 
    Signature * funct = FuncTable; //the table that has references to functions and their names 
    funct = FuncTable; 
    while (funct->function) 
    { 
     //const BYTE * func = (const BYTE *)funct->function; 
     if ((void *)(pStack[0] - 5) == (void *)(funct->function)) 
     { 
      int a = 0; 
      linesBuffer = linesBuffer + "Entering " + funct->signature + ";"; 
      linesBuffer = linesBuffer + "\n"; 
      WriteToFile(false); //function buffers 100kb before writing 
      break; 
     } 
     funct++; 
    } 
} 
extern "C" __declspec(naked) void __cdecl _penter() 
{ 
    _asm 
    { 
     pushad    // save all general purpose registers 
      mov eax, esp  // current stack pointer 
      add eax, 32  // stack pointer before pushad 
      push eax   // push pointer to return address as parameter to EnterFunc0 

      call EnterFunc0 

      popad    // restore general purpose registers 
      ret     // start executing original function 
    } 
} 

SNIPPET main.cの(対象コードメインファイル)FROM

#include "../Profile/Profile.h" 
Signature FuncTable[] = { 
    { (int)TetrisView_ProcessPauseMenu, "TetrisView_ProcessPauseMenu" }, 
    { NULL } 
}; 

答えて

1

インクリメンタルリンクが原因だと思います。これをオンにすると、Incremental Linking Table(ILT)が表示されます。 ILTにはジャンプテーブルがあります。関数が呼び出されると、このILTを介して呼び出されます。

FuncTableには、実際の機能のアドレスではないILTのアドレスがあります。しかし、_penterでは、その戻りアドレスは実際の関数になります(これはpCallerに入れられます)。

増分リンクをオフにすると、問題ありません。

+0

これは機能します。ありがとう、あなたは人生保護人@gezaです。 –

関連する問題