мой инжектор c ++ dll с ошибками NtCreateThreadEx - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь внедрить dll, используя функцию NtCreateThreadEx, но она не работает, я не уверен в реализации этого и не уверен в dll (потому что впервые пишудлл в с ++). код не дает мне никакой ошибки, я не знаю, где находится ошибка, PLZ, помогите мне

здесь код инжектора:

        #include <Windows.h>
        #include <TlHelp32.h>
        #include <iostream>

        struct NtCreateThreadExBuffer
        {
            SIZE_T Size;
            SIZE_T Unknown1;
            SIZE_T Unknown2;
            PULONG Unknown3;
            SIZE_T Unknown4;
            SIZE_T Unknown5;
            SIZE_T Unknown6;
            PULONG Unknown7;
            SIZE_T Unknown8;
        };

        #pragma comment(lib, "ntdll.lib")
        EXTERN_C NTSYSAPI NTSTATUS NTAPI NtCreateThreadEx(PHANDLE,
            ACCESS_MASK, LPVOID, HANDLE, LPTHREAD_START_ROUTINE, LPVOID,
            BOOL, SIZE_T, SIZE_T, SIZE_T, LPVOID);

        DWORD GetPid(const char* targetProcess)
        {
            HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
            PROCESSENTRY32 procEntry;
            procEntry.dwSize = sizeof(procEntry);

            if (snap && snap != INVALID_HANDLE_VALUE && Process32First(snap, &procEntry))
            {
                do
                {
                    if (!strcmp(procEntry.szExeFile, targetProcess))
                    {
                        break;
                    }
                } while (Process32Next(snap, &procEntry));
            }
            CloseHandle(snap);
            return procEntry.th32ProcessID;
        }

        int main()
        {
            DWORD dwPid = GetPid("chrome.exe");
            NtCreateThreadExBuffer ntbuffer;

            memset(&ntbuffer, 0, sizeof(NtCreateThreadExBuffer));
            DWORD temp1 = 0;
            DWORD temp2 = 0;

            ntbuffer.Size = sizeof(NtCreateThreadExBuffer);
            ntbuffer.Unknown1 = 0x10003;
            ntbuffer.Unknown2 = 0x8;
            ntbuffer.Unknown3 = (DWORD*)& temp2;
            ntbuffer.Unknown4 = 0;
            ntbuffer.Unknown5 = 0x10004;
            ntbuffer.Unknown6 = 4;
            ntbuffer.Unknown7 = &temp1;
            ntbuffer.Unknown8 = 0;

            HANDLE proc = OpenProcess(GENERIC_ALL, 0, dwPid);
            HANDLE hThread;
            wchar_t path[] = L"C:\\Users\\SIMONE\\source\\repos\\HELLO_WORD_DLL\\x64\\Debug\\dll2.dll";
            LPVOID allocAddr = VirtualAllocEx(proc, 0, sizeof(path), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
            WriteProcessMemory(proc, allocAddr, path, sizeof(path), nullptr);
            NTSTATUS status = NtCreateThreadEx(&hThread, GENERIC_ALL, NULL, proc,
                (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW"), allocAddr,
                FALSE, NULL, NULL, NULL, &ntbuffer);
            if(hThread == NULL)
                std::cout << "cannot create thread\n";
            printf("%d\n", dwPid);
            printf("%d\n", GetLastError());
            return 0;
        }

и здесь код DLL:

extern "C" {
        void Init() {
            MessageBox(0, L"Hello, world!", L"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;
        }
    }
...