CreateRemoteThread успешно выполнен, но LoadLibrary не удалось для некоторого целевого приложения - PullRequest
0 голосов
/ 07 июня 2019

Я использую метод CreateRemoteThread () + LoadLibrary () для ввода кода. Все нормально, когда я запускаю свой инжектор на моем ноутбуке с 64-битной ОС Windows7, и он все еще работает в 64-битной Windows Server 2012 R2 для некоторых целевых приложений.

НО, в этой среде Windows Server 2012 для некоторого целевого приложения, которое является старым приложением MFC, CreateRemoteThread завершился успешно, но DllMain не был вызван, и я обнаружил, что LoadLibrary () кажется неудачным, используя GetExitCodeThread () на создан удаленный поток.

Для записи памяти в целевом процессе я посчитал завершающий 0 байт.

Кроме того, я уже знал, что адрес kernel32.dll одинаков как для Windows 7, так и для Windows Server 2012, используя метод, представленный в приведенной ниже части ответа URL.

Сбой CreateRemoteThread, возможно, lpBaseAddress в целевом процессе недействителен, но он выделен системой?

GetExitCodeThread () ниже получил нулевой код выхода.

    HANDLE hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)addr, arg, NULL, NULL);
    if(hThread == NULL) {
        OutputDebugString(_T("Error: the remote thread could not be created.\n"));
        writeLog("Error: the remote thread could not be created.");
    }
    else {
        DWORD dResult = WAIT_OBJECT_0;
        dResult = WaitForSingleObject(hThread, 1000*3);// the thread may already exited, so do not wait INFINITE
        DWORD dwExitCode = 0;
        GetExitCodeThread(hThread, &dwExitCode);
        if(dwExitCode == 0)
        {
            writeLog("Error: LoadLibraryA failed.");
        }
        else
        {
            OutputDebugString(_T("Success: the remote thread was successfully created.\n"));
            writeLog("Success: the remote thread was successfully created.");
        }
    }

Есть ли у вас какие-либо идеи, что я должен подозревать дальше?

Подводя итог, на диаграмме ниже вы можете увидеть, что единственная ошибка - это только когда я запускаю инжектор на Windows Server 2012 для внедрения в какое-то старое приложение MFC.

results on the 2 OS

На диаграмме ниже приведена информация о том, сколько лет приложению MFC:

dlls the old MFC using* * 1030

Я пытаюсь предоставить достаточно информации, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

ниже приведен полный код для ввода моей DLL:

void inject(int procID, char* pszHookDll)
{
    g_nTargetProcId = procID;
    HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);
    g_hTargetProc = process;

    BOOL bInit = SymInitialize(g_hTargetProc, g_sPdbFolder, TRUE);// for analysing the information spy.dll send out

    if(process == NULL) {
        writeLog("Error: the specified process couldn't be found.");
    }
    /*
    * Get address of the LoadLibrary function.
    */
    LPVOID addr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
    if(addr == NULL) {
        writeLog("Error: the LoadLibraryA function was not found inside kernel32.dll library.");
    }
    //addr = getProcAddrInTargetProcess(procID, process);

    /*
    * Allocate new memory region inside the process's address space.
    */
    int nBufSize = strlen(pszHookDll)+1;
    LPVOID arg = (LPVOID)VirtualAllocEx(process, NULL, nBufSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    if(arg == NULL) {
        writeLog("Error: the memory could not be allocated inside the chosen process.");
    }

    /*
    * Write the argument to LoadLibraryA to the process's newly allocated memory region.
    */
    int n = WriteProcessMemory(process, arg, pszHookDll, nBufSize, NULL);
    if(n == 0) {
        writeLog("Error: there was no bytes written to the process's address space.");
    }

    /*
    * Inject our DLL into the process's address space.
    */
    HANDLE hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)addr, arg, NULL, NULL);
    if(hThread == NULL) {
        writeLog("Error: the remote thread could not be created.");
    }
    else {
        DWORD dResult = WAIT_OBJECT_0;
        dResult = WaitForSingleObject(hThread, 1000*3);
        DWORD dwExitCode = 0;
        GetExitCodeThread(hThread, &dwExitCode);
        if(dwExitCode == 0)
        {
            writeLog("Error: LoadLibraryA failed.");
        }
        else
        {
            OutputDebugString(_T("Success: the remote thread was successfully created.\n"));
            writeLog("Success: the remote thread was successfully created.");
        }
    }

    /*
    * Close the handle to the process, becuase we've already injected the DLL.
    */
    //CloseHandle(process);close after symcleanup
}

1 Ответ

2 голосов
/ 07 июня 2019

Я получил причину: это была проблема зависимости.

Вот зависимости spy.dll:

dependencies

spy.dll зависит от msvcr100d.dll, который по умолчанию недоступен в моей среде Windows Server 2012.

Новое приложение MFC, о котором я упоминал, было развернуто вместе с msvcr100d.dll на Windows Server 2012, поэтому проблем не было.

Спасибо, Баффи и Реми !!

...