3

問題なく動作するdllインジェクションプログラムを作成しました。dll をリモート プロセスにロードし、何らかの関数を呼び出します。今、私はその関数に引数を渡したいです。CreateRemoteThread にはそのための lpParameter がありますが、関数で使用するために dll 内で渡された引数を取得する方法は?

更新: dll エントリ ポイントは一般的です:

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)

DLL には、次のプロトタイプを持つ関数が 1 つだけ含まれています。

void TestFunction(const char* ua);

その関数を呼び出すコードは次のとおりです。

CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)((void*)codecaveExecAddr), (LPVOID)argumentAddress, 0, NULL);

ご覧のとおり、TestFunction 内で「テスト」文字列を渡そうとしています。しかし、その後、いくつかのゴミが含まれている TestFunction 内の ua 引数をチェックします。

プロジェクト ファイル全体は次のとおりです。
http://pastebin.com/gh4SnhmV
http://pastebin.com/Sq7hpSVx
http://pastebin.com/dvgXpUYz

更新 2
TestFunction には特定のプロポタイプが必要ですか、それとも LPVOID タイプのパラメーターが 1 つしかない限り、どれでも使用できますか? よくわかりません。注入された dll の関数を引数で呼び出す方法の例を教えてもらえますか?

4

1 に答える 1

6

他のプロセスのメモリ内にデータを割り当てる必要があります。そのためには、CreateRemoteThread に渡す、他のプロセス メモリ内のアドレスを返す VirtualAllocEx 関数を使用します。

CreateRemoteThread は、リモート プロセスでスレッドを作成することを除いて、CreateThread とまったく同じように機能します。覚えておくべきことの 1 つは、lpParameter 内のオブジェクトへのポインターを渡すときに、別の仮想アドレス空間で実行されているリモート スレッドが、そのアドレス空間内のそのアドレスにアクセスしようとすることです。

于 2011-07-05T12:24:04.003 に答える