CreateRemoteThread, не запускает поток - PullRequest
0 голосов
/ 07 августа 2020

Я использую эту функцию как обычно, но следы отладки (OutputDebugString) не работают при внедрении dll. И в целевом приложении поток не создается (я просматриваю хакера процесса) GetlastError говорит 0 CreateRemoteThread говорит tid, но WaitForSingleObject немедленно завершает работу (почему, если все в порядке !?) ... Я запутался% OS windows 10 x64 app и dll - x86

код dll:

#include <stdio.h>
#include <windows.h>

WINAPI DllMain(HINSTANCE h, DWORD reason, LPVOID res)
{
    CHAR pszMessage[1024] = { 0 };
    sprintf(pszMessage, ("L2Proj: GetCurrentProcessId() %d, hModule 0x%p, nReason %d\r\n"), GetCurrentProcessId(), h, reason);
    OutputDebugString(pszMessage);
    switch(reason) {
        case DLL_PROCESS_ATTACH:
                    //MessageBoxA(NULL, "inject success", "done", MB_OK);
                    TerminateProcess(GetCurrentProcess(), -1);
            break;
    }
    return TRUE;
}

PS TerminateProcess в dll не работает

PPS GetExitCodeThread () после завершения WaitForSingleObject равно 0

В чем проблема?

ДОБАВЛЕНО

Код приложения:

ПРИМЕЧАНИЕ. Это всего лишь тестовый код (без контроля возврата значения / неправильное имя ярлыка codestyle et c.), пожалуйста, не говорите мне об этом.

Я написал пошагово в комментариях, какие функции какие значения возвращают

    // process of course has access
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
    // handle is valid
    if(!hProcess) {
        return GetLastError();
    }


    DWORD id;
    char str[] = "G:\\workspace\\proj\\test.dll";
    void *l = (void*)GetProcAddress(
            GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    // addr is valid
    if(!l) {
        return 35;
    }

    DWORD str_size = strlen(str) + 1;

    // memory addr is valid
    LPVOID lp = VirtualAllocEx(hProcess, NULL, str_size, MEM_COMMIT | 
                                                        MEM_RESERVE, PAGE_READWRITE);

    BOOL res = WriteProcessMemory(hProcess, lp, str, str_size, NULL);
    // res is true

    HANDLE h = CreateRemoteThread(hProcess,
            NULL,
            0,
            (LPTHREAD_START_ROUTINE)l,
            lp,
            0,
            &id);

    // handle is valid
    // id is valid (tid remote thread)
    if(!h) {
        return GetLastError();
    }

    DWORD err = GetLastError();
    CHAR pszMessage[1024] = { 0 };
    sprintf(pszMessage, ("L2Proj: GetProcessId() %d\r\n"), id);

    OutputDebugString(pszMessage);
    // ends immediately (no waiting)
    WaitForSingleObject(h, INFINITE);

    GetExitCodeThread(h, &id);
            //id is 0 (exit code)

    sprintf(pszMessage, ("L2Proj: GetExitCodeThread() %d (GetLastError=%d)\r\n"), id, err);
    OutputDebugString(pszMessage);

    // the only error after this function (VirtualFreeEx)
    // GetLastError gives 87 (0x57) - ERROR_INVALID_PARAMETER
    VirtualFreeEx(hProcess, lp, 0, MEM_RELEASE);

    CloseHandle(h);
    CloseHandle(hProcess);

Забыл, использую g ++ (G CC) 9.3.0 - может проблема в этом?

1 Ответ

0 голосов
/ 08 августа 2020

Проблему решил, просто поменять компилятор. Да, проблема была с компилятором, на компиляторе Microsoft все работает нормально.

Спасибо за ответы.

проблема в том, что вы не используете отладчик - RbMm вчера

и да, я всегда использую отладчик, большое спасибо ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...