3

CreateRemoteThread を使用して既存のプロセスに DLL を挿入しようとしています。問題は、アプリケーションが Visual Studio 2010 内から開始されたときに、単純に機能しないことです。

DLL インジェクションは次のように機能します。

  1. 手動で起動する場合(エクスプローラーから)

  2. 手動で開始し、インジェクションの前に 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 がインジェクション アプリを実行しているときにのみ発生するのは非常に奇妙です。

4

1 に答える 1

1

最後に私は問題を発見しました!

私が使用した完全なモジュールパスを取得するには

GetFullPathName("Inj_DLL.dll", MAX_PATH, dll_path, NULL);

これは、現在の作業ディレクトリを使用してファイル パスを決定します。

アプリを手動で起動すると、作業ディレクトリは exe ファイルのパスになりますが、Visual Studio から起動すると、[プロジェクト プロパティ] -> [構成プロパティ] -> [デバッグ] の作業ディレクトリが使用されます。

デフォルトで「$(ProjectDir)」に設定されており、挿入された dll が Debug/Release dir にあったため、dll ファイルが見つからず、エラー 126 ERROR_MOD_NOT_FOUND が発生しました。

このプロパティを「$(SolutionDir)$(Configuration)\」に変更したところ、すべてが魅力的に機能するようになりました。

この質問で私を助けようとした人に感謝します。動作していないアプリケーションをデバッグするための新しいアプローチをいくつか発見しました。

于 2012-11-13T22:31:33.303 に答える