CreateRemoteThread を使用して既存のプロセスに DLL を挿入しようとしています。問題は、アプリケーションが Visual Studio 2010 内から開始されたときに、単純に機能しないことです。
DLL インジェクションは次のように機能します。
手動で起動する場合(エクスプローラーから)
手動で開始し、インジェクションの前に VS 2010 デバッガーを接続する場合。
Visual Studio 2010 でデバッグ開始 (F5) を選択すると、CreateRemoteThread が OK を返します。挿入されたプロセスで LoadLibraryA にブレークポイントを配置したところ、ヒットしました。したがって、スレッドは開始されますが、DllMain 関数には到達しません。LoadLibraryA は実行されますが、モジュールはロードされません。
注入コード:
void InjectDll(DWORD processId, string dllFile)
{
HANDLE hProcess = OpenProcess(CREATE_THREAD_ACCESS, FALSE, processId);
if ( hProcess != NULL )
{
int lenWrite = dllFile.length();
LPVOID allocMem = (LPVOID)VirtualAllocEx(hProcess, NULL, lenWrite, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, allocMem , dllFile.c_str(), lenWrite, NULL);
LPTHREAD_START_ROUTINE injector = (LPTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if(!injector)
return;
DWORD threadId;
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, injector, allocMem, 0, &threadId);
DWORD Result = WaitForSingleObject(hThread, 10*1000); //Time out : 10 secondes
VirtualFreeEx(hProcess, allocMem, lenWrite, MEM_RELEASE);
CloseHandle(hProcess);
CloseHandle(hThread);
}
}
そして DllMain コード:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
HelloWorldMessageBox();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
手伝ってくれてありがとう!
編集:
LoadLibraryA にブレークポイントを配置するために ollyDbg を使用しました。アセンブリ命令 "ret" を GetLastError の呼び出しに置き換えたところ、EAX レジスタに次の値が得られました: 126. MSDN からのシステム エラー コード 126 は、ERROR_MOD_NOT_FOUND (指定されたモジュールが見つかりませんでした) を意味します。Visual Studio がインジェクション アプリを実行しているときにのみ発生するのは非常に奇妙です。