0

別のプログラムからプロセスを呼び出そうとしていますが、このプロセスは DLL 経由で挿入したものです。ライブラリ「Client.dll」をロードする最初のものは完全に機能します。これは、DllMain の MessageBox Debug (DLL_PROCESS_ATTACH) によって生成されます。

DLL がプログラムに読み込まれたら、Client.dll から MainThread 関数を呼び出そうとしますが、同じ方法 (コピー、貼り付け、編集) を使用しても機能しません。両方とも以下に掲載されていますが、理由を教えてもらえますか? MainThread からすべてのコードを削除しましたが、それはデバッグ上の理由によるものです。

メインスレッドは次のとおりです。

void MainThread(void * Arguments)
{
    MessageBoxA(NULL, "MainThread Started!", "bla", MB_OK); //Not Shown
    for (;;)
    {
         //This loop is here for the main program loop.
    }
    _endthread();
}

Client.dll をロードしてメイン スレッドを呼び出そうとする方法は次のとおりです。実際のインジェクションは機能しますが、メイン スレッドの開始ではないことに注意してください。

bool InjectDLL(DWORD ProcessID, const char* Path)
{
    HANDLE Handle = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
    if (!Handle)
    {
        std::cout << "Could not access process! Inject Failed!";
        return false;
    }

    LPVOID LoadLibraryAddress = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
    LPVOID Allocate = VirtualAllocEx(Handle, NULL, strlen(Path), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL);

    HANDLE Thread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryAddress, Allocate, 0, NULL);
    WaitForSingleObject(Thread, INFINITE); // WAIT FOREVER!
    VirtualFreeEx(Handle, Thread, strlen(Path), MEM_RELEASE);

    //Start DLL Main Thread
    LPVOID MainThreadAddress = (LPVOID)GetProcAddress(GetModuleHandleA("Client.dll"), "MainThread");
    Allocate = VirtualAllocEx(Handle, NULL, 0, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL);

    HANDLE MainThread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)MainThreadAddress, Allocate, 0, NULL);
    WaitForSingleObject(MainThread, INFINITE); // Wait for Main Thread to start
    VirtualFreeEx(Handle, MainThread, strlen(Path), MEM_RELEASE);

    CloseHandle(MainThread);
    CloseHandle(Thread);
    CloseHandle(Handle);
    return true;
}

助けてくれる人に感謝します。

4

1 に答える 1

1

特に「MainThread」のアドレスを取得している場合のエラーチェックは見られません。これは成功していますか?

これを機能させるには、.DEF ファイルまたは__declspec( dllexport ). 詳細については、この SO リンクを参照してください。

于 2014-10-09T17:17:02.033 に答える