#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 . Но я не уверен. Возможно, я ошибаюсь.