NtCreateThreadEx не работает в Windows 10 64bit 1909

#c #multithreading #dll #code-injection #ntdll

#c #многопоточность #dll #внедрение кода #ntdll

Вопрос:

Недавно я изучил методы внедрения dll и протестировал их. Одним из них было внедрение dll с помощью CreateRemoteThread и NtCreateThreadEx. Я исследовал CreateRemoteThread и обнаружил, что он вызвал NtCreateThreadEx внутренне. Дело в том, что CreateRemoteThread работает нормально, а NtCreateThreadEx — нет. Код выглядит следующим образом.

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

typedef NTSTATUS(WINAPI *LPFUN_NtCreateThreadEx) (
    OUT PHANDLE hThread,
    IN ACCESS_MASK DesiredAccess,
    IN LPVOID ObjectAttributes,
    IN HANDLE ProcessHandle,
    IN LPTHREAD_START_ROUTINE lpStartAddress,
    IN LPVOID lpParameter,
    IN BOOL CreateSuspended,
    IN ULONG StackZeroBits,
    IN ULONG SizeOfStackCommit,
    IN ULONG SizeOfStackReserve,
    OUT LPVOID lpBytesBuffer
    );

...
HMODULE ntdll = GetModuleHandle(L"ntdll.dll");
HMODULE kernel32 = GetModuleHandle(L"kernel32.dll");
PTHREAD_START_ROUTINE ntCreateThreadExAddr = (PTHREAD_START_ROUTINE)GetProcAddress(ntdll, "NtCreateThreadEx");
lpfnLoadLibrary = GetProcAddress(kernel32, "LoadLibraryA");
NtCreateThreadExBuffer ntbuffer;
DWORD dwTmp1 = 0;
DWORD dwTmp2 = 0;
    
memset(amp;ntbuffer, 0, sizeof(NtCreateThreadExBuffer));
if (ntCreateThreadExAddr)
{
            ntbuffer.Size = sizeof(struct NtCreateThreadExBuffer);
            ntbuffer.Unknown1 = 0x10003;
            ntbuffer.Unknown2 = 0x8;
            ntbuffer.Unknown3 = amp;dwTmp2;
            ntbuffer.Unknown4 = 0;
            ntbuffer.Unknown5 = 0x10004;
            ntbuffer.Unknown6 = 4;
            ntbuffer.Unknown7 = amp;dwTmp1;
            ntbuffer.Unknown8 = 0;

        LPFUN_NtCreateThreadEx funNtCreateThreadEx = (LPFUN_NtCreateThreadEx)ntCreateThreadExAddr;
    
        NTSTATUS status = 0;
        status = funNtCreateThreadEx(
                amp;hThread,
                0x1FFFFF,
                NULL,
                hCurrp,
                (LPTHREAD_START_ROUTINE)lpfnLoadLibrary,
                (LPVOID)param,
                FALSE,
                NULL,
                NULL,
                NULL,
                amp;ntbuffer
            );  
}
  

Самое смешное в этом коде то, что код ошибки равен 31, а статус -1073741819. Если кто-нибудь знает об этом, пожалуйста, научите меня. Заранее спасибо.

Комментарии:

1. Вставьте его в отладчик и выполните его, чтобы узнать больше о том, что происходит.

2. Почему вы определяете здесь свою собственную структуру, полную «неизвестных» полей? Это кажется довольно странным.

3. Я отладил этот код, но не нашел ничего неправильного перед входом в системный вызов.

4. Откуда вы знаете, что эти значения верны?

5. Я сравнил его с теми, когда вызывается CreateRemoteThread . Но я не уверен. Возможно, я ошибаюсь.