0

関数のアドレスが与えられた場合、その署名を決定する方法は?

    DWORD funcAddr = 0x63001023; // 任意のアドレス
    char[MAX] 署名 = ? // どのようなアルゴリズムを考案できますか?  

その理由は次のとおりです。

プロセスがPC「A」で開始されると、Calc.exeというexeがあります

私のexeはプロセスの作成を傍受し、信号をpc "B"に送信します

同じ calc.exe が開始する場所。

その後、ユーザーはクリック、移動、

仮定加算の内部プロセスは、pc"A" から pc"B" に渡されます。

それは仮想化されています。関数の引数を操作するためのすべてのリソース

PC「B」に存在します。必要なのは完全な署名だけです......

そのため、未知の dll をフックするという根本的に危険なアクティビティでさえ、「一種の」安全になります...

サードパーティのライブラリを提案しないでください。

4

2 に答える 2

1

まあ、まず第一に - それは簡単ではありません。あなたはあきらめるかもしれません。

特にSymbol Handlerの下では、 DbgHelp 関数を使用する必要があります。呼び出し規約、それが取る引数と戻り値の型を特定する必要があります。必要な型 (UDF) について心配する必要があります。次に、それらの型を作成して関数に渡し、適切な呼び出し規約で関数を呼び出します。

RunDLL32.EXE関数をロードし、関数とその型を検索し、呼び出しを作成するツールの 1 つです。コマンド プロンプトで次のコマンドを実行してみてください。

rundll32 user32.dll LockWorkStation

API フックに関する記事、特に Jeffery Ritcher の記事を読んでください。

于 2012-08-29T14:50:17.040 に答える
1

それをしてはいけない。

boost::functionただし、同じ署名で保存しmap、関数アドレスとboost::functionオブジェクトを作成できます

プログラム内の生のアドレスではなく、関数ポインタを格納する方が安全です。

于 2012-08-29T13:07:50.060 に答える