作成したDLLをロードし、そこから関数を実行するリモートスレッドを作成しようとしています。DLLは正常に動作しています(チェック済み)が、何らかの理由でリモートスレッドが失敗し、DLLが作成されたプロセスが応答を停止します。
ollyDebugを使用して何が問題になっているのかを確認しましたが、2つのことに気づきました...
- 私の文字列(dll名と関数名)がリモートスレッドに正しく渡されます
- スレッドはLoadLibraryでlasterrorcode87"ERROR_INVALID_PARAMETER"で失敗します
私の最善の推測は、どういうわけか、リモートスレッドがLoadLibraryを見つけることができないということです(これは、リンカーが私のプロセスを尊重して行われているためですか?、推測です...)
私は何が間違っているのですか?
これは、リモート関数のコードです。
static DWORD WINAPI SetRemoteHook (DATA *data)
{
HINSTANCE dll;
HHOOK WINAPI hook;
HOOK_PROC hookAdress;
dll = LoadLibrary(data->dll);
hookAdress = (HOOK_PROC) GetProcAddress(dll,data->func);
if (hookAdress != NULL)
{
(hookAdress)();
}
return 1;
}
編集:
これは、メモリをリモートプロセスに割り当てる部分です。
typedef struct
{
char* dll;
char* func;
} DATA;
char* dllName = "C:\\Windows\\System32\\cptnhook.dll";
char* funcName = "SetHook";
char* targetPrgm = "mspaint.exe";
Data lData;
lData.dll = (char*) VirtualAllocEx( explorer, 0, sizeof(char)*strlen(dllName), MEM_COMMIT, PAGE_READWRITE );
lData.func = (char*) VirtualAllocEx( explorer, 0, sizeof(char)*strlen(funcName), MEM_COMMIT, PAGE_READWRITE );
WriteProcessMemory( explorer, lData.func, funcName, sizeof(char)*strlen(funcName), &v );
WriteProcessMemory( explorer, lData.dll, dllName, sizeof(char)*strlen(dllName), &v );
rDataP = (DATA*) VirtualAllocEx( explorer, 0, sizeof(DATA), MEM_COMMIT, PAGE_READWRITE );
WriteProcessMemory( explorer, rDataP, &lData, sizeof(DATA), NULL );
編集:問題は、リモートスレッドがLoadLibraryベースアドレスではなく「ガベージ」アドレスを呼び出していることのようです。リモートプロセスのLoadLibraryアドレスに間違ってリンクされている可能性のあるVisualStudioはありますか?
編集:ローカルスレッドとまったく同じコードを実行しようとすると(CreateRemoteThreadの現在のプロセスへのハンドルを使用します)、すべてが正常に機能します。これを引き起こす原因は何ですか?
呼び出し元の関数コードを追加する必要がありますか?コードが正しいパラメータを使用してリモートスレッドで実行されているため、その役割を果たしているようです...
コードはVS2010でコンパイルされます。
dataは、名前にchar*が付いた単純な構造体です。(コードで文字列を明示的に記述すると、元のプロセスへのポインタが表示されます)。
私は何が間違っているのですか?