(私たち) modder に API を提供するゲームの拡張機能をプログラミングしています。この API はさまざまなものを提供しますが、1 つの制限があります。API は「エンジン」専用です。つまり、エンジンに基づいてリリースされたすべてのモディフィケーション (モッド) は、いかなる種類の (モッド固有の) API も提供または持っていません。「署名スキャナー」を作成しました (注: 私のプラグインは共有ライブラリとしてロードされ、-share と -fPIC でコンパイルされます) 対象の関数を見つけます (これは Linux を使用しているので簡単です)。説明するために、特定のケースを取り上げます。目的の関数へのアドレスを見つけました。その関数ヘッダーは非常に単純です。int * InstallRules(void);
. 何も (void) を取り、(関心のあるオブジェクトへの) 整数ポインターを返します。今、私がやりたいことは、迂回を作成することです (関数の開始アドレスがあることを覚えておいてください)、自分の関数に、次のように動作させたいと思います:
void MyInstallRules(void)
{
if(PreHook() == block) // <-- First a 'pre' hook which can block the function
return;
int * val = InstallRules(); // <-- Call original function
PostHook(val); // <-- Call post hook, if interest of original functions return value
}
これが取引です。私は関数フックについてまったく経験がなく、インライン アセンブリについての知識はほとんどありません (AT&T のみ)。インターネット上の事前に作成された迂回パッケージは、Windows専用であるか、まったく別の方法を使用しています (つまり、dll をプリロードして元のパッケージを上書きします)。だから基本的に; 軌道に乗るにはどうすればいいですか?呼び出し規則 (この場合は cdecl) について読んで、インライン アセンブリについて学ぶべきですか、それとも何をすべきですか? おそらく、Linux 迂回路用の既に機能するラッパー クラスが最適でしょう。最後に、次のような単純なものが欲しいです。
void * addressToFunction = SigScanner.FindBySig("Signature_ASfs&43"); // I've already done this part
void * original = PatchFunc(addressToFunction, addressToNewFunction); // This replaces the original function with a hook to mine, but returns a pointer to the original function (relocated ofcourse)
// I might wait for my hook to be called or whatever
// ....
// And then unpatch the patched function (optional)
UnpatchFunc(addressToFunction, addressToNewFunction);
ここで完全に満足のいく答えを得ることができないことは理解していますが、私はここで薄い氷の上にいるので、道順についていくつかの助けをいただければ幸いです...迂回路について読みましたが、ほとんどありませんドキュメント (特に Linux の場合) はまったくありません。「トランポリン」として知られているものを実装したいと思いますが、この知識を習得する方法を見つけることができないようです。
注: _thiscall にも興味がありますが、私が読んだ限りでは、GNU 呼び出し規約 (?) で呼び出すのはそれほど難しくありません。