Выполнение кода внутри введенного Dll DllMain приводит к таймауту внедрения - PullRequest
0 голосов
/ 23 мая 2018

Итак, я пытаюсь внедрить dll в процесс, пока мне удалось внедрить dll в процесс, но у меня возникают проблемы с запуском любого кода внутри DllMain введенной dll, когдаDllMain выглядит как приведенный ниже код, который, кажется, работает во время работы целевого приложения, а Process Explorer показывает, что dll загружен.

BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
{
    switch (dwReason)
    {
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    };

    return TRUE;
}

Однако, когда я добавляю какой-либо код ниже DLL_PROCESS_ATTACH, это приводит к тому, что инъекция приводит к превышению времени ожидания.,Вот то, что я пытался загрузить:

extern "C" {
    BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
    {
        switch (dwReason)
        {
            case DLL_PROCESS_ATTACH:
                MessageBox(0, "Hello, world!", "Hello!", 0);
                break;
            case DLL_PROCESS_DETACH:
                break;
         };

         return TRUE;
    }
}

А вот как я делаю инъекцию dll:

bool InjectDLL(PROCESS_INFORMATION* pInfo, const char* dllPath) {
    bool result = false;
    HANDLE nmsProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pInfo->dwProcessId);
    if (nmsProcess) {
        LPVOID baseAddress = VirtualAllocEx(nmsProcess, NULL, strlen(dllPath) + 1, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        if (baseAddress) {
            LPVOID loadLibraryAddress = (LPVOID)GetProcAddress(LoadLibraryA("kernel32.dll"), "LoadLibraryA");
            WriteProcessMemory(nmsProcess, baseAddress, dllPath, strlen(dllPath) + 1, NULL);
            HANDLE thread = CreateRemoteThread(nmsProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibraryAddress, baseAddress, 0, 0);
            if (thread != NULL) {
                switch (WaitForSingleObject(thread, 5000)) {
                    case WAIT_OBJECT_0:
                        cout << "Injected" << endl;
                        result = TRUE;
                        break;
                    case WAIT_ABANDONED:
                        cout << "Abandoned" << endl;
                        break;
                    case WAIT_TIMEOUT:
                        cout << "Timed out" << endl;
                        break;
                    case WAIT_FAILED:
                        cout << "Failed"<< endl;
                        break;
                }
            }
            else {

                cout << "Error: \n" << GetLastError() << endl;
            }
            CloseHandle(thread);

        }
        else {
            cout << "Error: \n" << GetLastError() << endl;
        }
        VirtualFreeEx(nmsProcess, baseAddress, 0, MEM_RELEASE);
        CloseHandle(nmsProcess);
    }
    return result;
}

Я довольно новичок в инъекции Dll, поэтому явероятно, где-то допустили ошибку в инъекции, любая помощь будет принята с благодарностью.

Редактировать:

Я также пытался поместить вызов MessageBox в другую функцию, но это дало те же результаты:

extern "C" {
    void Init(void) {
        MessageBox(0, "Hello, world!", "Hello!", 0);
    }

    BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
    {
        switch (dwReason)
        {
        case DLL_PROCESS_ATTACH:
            Init();
            break;
        case DLL_PROCESS_DETACH:
            break;
        };

        return TRUE;
    }
}

1 Ответ

0 голосов
/ 23 мая 2018

Оказывается, что решение (благодаря Гансу Пассанту и Кристиану.К) было вызвать функцию в новом потоке, например:

extern "C" {
    void Init() {
        MessageBox(0, "Hello, world!", "Hello!", 0);
    }

    BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
    {
        switch (dwReason)
        {
        case DLL_PROCESS_ATTACH:
            CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Init, NULL, 0, NULL);
            break;
        case DLL_PROCESS_DETACH:
            break;
        };

        return TRUE;
   }
}
...