私は、C++で入力と終了の関数をログに記録するために、これは、従来のコードベースを想定して動作しています。しかし、私はgitからダウンロードしたプロジェクトにフックする際に、対象コードのextern変数に保存する関数アドレスを使用します。これらはプロファイラライブラリでは別のものになります。これは、フックされた関数と保存された関数の間の関数ポインタの比較を乱すことです。現在C++関数のアドレスは、対象となるコードベースよりも、添付のプロファイラライブラリで異なるものが出てくる
対象コードメインファイルの関数アドレス、ブレークポイントは、プロファイラコードで_penterフック関数内にある
に同じエントリは、関数名の前に「_」と別のアドレスを示していますプロファイラコード
私はそれがアドレスをどのように変更しているのか、私が何か間違っているかどうかを知りたいとは考えていません。
私がやっているのは、関数のポインタ(およびそれらの名前)がサブジェクト・メイン関数(すべての関数が利用可能)のサブジェクト・コード関数の参照で初期化されています。ライブラリのフック関数(_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 }
};
これは機能します。ありがとう、あなたは人生保護人@gezaです。 –