вообще задача написать драйвер который отменяет загрузку процесса с заданным именем до загрузки его первичного потока перехват делаю подменой адресса в SDT (как описано в статье "Перехват API функций в Windows NT (часть 3). Нулевое кольцо.") при перехвате NtCreateProcess ничего не происходит (т.е. при старте процесса код моей newNtCreateProcess не выполняется) решил перехватывать NtCreateThread она вроде как перехватывается, но не знаю как узнать имя и адресс (на винте) процесса нашел какую-то функцию NtQueryInformationProcess но она возвращает STATUS_ACCESS_VIOLATION подскажите ченибудь
на курсы телепатов не ходим, код в студию. эта как? получить структуру EPROCESS для процесса, там есть имя вроде бы.
Код (Text): __declspec(naked) NTSTATUS _ZwQueryInformationThread( HANDLE ThreadHandle, THREADINFOCLASS ThreadInformationClass, PVOID ThreadInformation, ULONG ThreadInformationLength, PULONG ReturnLength) { __asm { cmp SDT_ZwQueryInformationThread,000h jz failed mov eax,SDT_ZwQueryInformationThread lea edx,[esp+004h] int 02Eh retn 00014h failed: mov eax,0xC00000001 // STATUS_UNSUCCESSFUL retn 00014h } } // ... NTSTATUS ns; THREAD_BASIC_INFORMATION ThreadInf; ULONG ProcId; ns = _ZwQueryInformationThread(*ThreadHandle, ThreadBasicInformation, &ThreadInf, sizeof(ThreadInf), NULL); if (NT_SUCCESS(ns)) { ProcId = (ULONG)ThreadInf.ClientId.UniqueProcess; DbgMsg("ZwCreateThread() PID:%d\n", ProcId); } // ... как получить имя по PID-у поищи на форуме... >> получить структуру EPROCESS для процесса, там есть имя вроде бы. там только имя, полный путь к бинарнику нужно из PEB вытаскивать
ну не суть) PEB читается как раз плюнуть. тока сначала конечно базу fs надо вычислить. В ринг3 это GetThreadSelectorEntry - основана на ntdll.ZwQueryInformationThread, аналогично и в ядре можно. а потом ZwReadVirtualMemory.
Код (Text): NTSTATUS NewNtCreateThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ProcessHandle, OUT PCLIENT_ID ClientId, IN PCONTEXT ThreadContext, IN PINITIAL_TEB UserStack, IN BOOLEAN CreateSuspended) { DPRINT("PID = %d",ClientId->UniqueProcess); return TrueNtCreateThread(ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle, ClientId, ThreadContext, UserStack, CreateSuspended); } в общем вот, перехватывает вроде она все, только Pid в основном выдает какие-то левые, из тех что совпадают, это svhost, lsass ну и бездействие системы (0) при запуске calc.exe например выдает -1, может я не ту функцию перехватываю, а чем отличаются Nt функции от Zw? какаято из них заглушка я так понял Cr4sh в твоем коде THREAD_BASIC_INFORMATION структура я ее в заголовках DDK не нашел и вот эта переменная SDT_ZwQueryInformationThread откуда взялась если че, сильно не пинайте, я слово DDK только неделю назад услишал
>> Cr4sh в твоем коде THREAD_BASIC_INFORMATION структура я ее в заголовках DDK не нашел она не документирована Код (Text): typedef struct THREAD_BASIC_INFORMATION { NTSTATUS ExitStatus; PVOID TebBaseAddress; CLIENT_ID ClientId; KAFFINITY AffinityMask; KPRIORITY Priority; KPRIORITY BasePriority; } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION; >> вот эта переменная SDT_ZwQueryInformationThread откуда взялась это номер ф-ции ZwQueryInformationThread в таблице системных сервисов
так 1-е SDT_ZwQueryInformationThread как этот номер получить? у меня файл с адресами есть, но там только Nt функции 2-е так почему у меня в вышеописанном коде Client_ID половину левые значения возвращает, причем при запуске процесса она 100% срабатывает (что-то запускаю, и DPRINT моментально PID возвращает), т.е. создание потока вроде как перехватует,может я не тем путем иду?
>> у меня файл с адресами есть, но там только Nt функции без разницы >> так почему у меня в вышеописанном коде Client_ID половину левые значения возвращает хз
Windows XP Professional Build 2600 NtCreateThread 0035 вот полный код: driver.c: Код (Text): #include "driver.h" extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable; extern PUSHORT NtBuildNumber; NtCreateThreadPointer TrueNtCreateThread; ULONG OpenProcId; OldCode OpPrcOld; PVOID NewNtOpenProcessAdr; PVOID NewNtCreateProcessAdr; ULONG ResetCR0() { ULONG CR0Reg; __asm { cli mov eax, cr0 mov CR0Reg, eax and eax, 0xFFFEFFFF mov cr0, eax } return CR0Reg; } ULONG RestoreCR0(ULONG CR0Reg) { __asm { mov eax, CR0Reg mov cr0, eax sti } return CR0Reg; } NTSTATUS NewNtCreateThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ProcessHandle, OUT PCLIENT_ID ClientId, IN PCONTEXT ThreadContext, IN PINITIAL_TEB UserStack, IN BOOLEAN CreateSuspended) { DPRINT("PID = %d",ClientId->UniqueProcess); return TrueNtCreateThread(ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle, ClientId, ThreadContext, UserStack, CreateSuspended); } VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { ULONG CR0Reg; NTSTATUS Result; DPRINT("Driver Uploaded"); CR0Reg = ResetCR0(); NTCALL(OpenProcId) = TrueNtCreateThread; RestoreCR0(CR0Reg); return; } NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { ULONG CR0Reg; char buf1[65],buf2[65]; DPRINT("Driver loaded"); switch (*NtBuildNumber) { case 2195: //win 2k OpenProcId = 0x02E;//NtCreateThread break; case 2600: //win xp OpenProcId = 0x035;//NtCreateThread break; default: return STATUS_NOT_IMPLEMENTED; break; } TrueNtCreateThread = NTCALL(OpenProcId); CR0Reg = ResetCR0(); NTCALL(OpenProcId) = NewNtCreateThread; RestoreCR0(CR0Reg); DriverObject->DriverUnload = DriverUnload; return STATUS_SUCCESS; } driver.h: Код (Text): #include <ntddk.h> #include <stdio.h> #define DEBUG #ifdef DEBUG #define DPRINT DbgPrint #else #define DPRINT #endif typedef PVOID* PNTPROC; typedef DWORD (ULONG); typedef DWORD* PDWORD; typedef unsigned char (BYTE); typedef BYTE* PBYTE; typedef struct _INITIAL_TEB { PVOID PreviousStackBase; PVOID PreviousStackLimit; PVOID StackBase; PVOID StackLimit; PVOID AllocatedStackBase; } INITIAL_TEB, *PINITIAL_TEB; typedef struct _SYSTEM_SERVICE_TABLE { PNTPROC ServiceTable; PDWORD CounterTable; ULONG ServiceLimit; PBYTE ArgumentTable; } SYSTEM_SERVICE_TABLE , * PSYSTEM_SERVICE_TABLE , **PPSYSTEM_SERVICE_TABLE; typedef struct _SERVICE_DESCRIPTOR_TABLE { SYSTEM_SERVICE_TABLE ntoskrnl; //SST для ntoskrnl.exe SYSTEM_SERVICE_TABLE win32k; //SST для win32k.sys SYSTEM_SERVICE_TABLE unused1; SYSTEM_SERVICE_TABLE unused2; } SERVICE_DESCRIPTOR_TABLE , * PSERVICE_DESCRIPTOR_TABLE , **PPSERVICE_DESCRIPTOR_TABLE; typedef struct THREAD_BASIC_INFORMATION { NTSTATUSExitStatus; PVOIDTebBaseAddress; CLIENT_IDClientId; KAFFINITYAffinityMask; KPRIORITYPriority; KPRIORITYBasePriority; } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION; #define NTCALL(_function) KeServiceDescriptorTable->ntoskrnl.ServiceTable[_function] typedef NTSTATUS (*NtCreateThreadPointer)(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ProcessHandle, OUT PCLIENT_ID ClientId, IN PCONTEXT ThreadContext, IN PINITIAL_TEB UserStack, IN BOOLEAN CreateSuspended);
>> не скажи) ты про ntdll или про ntoskrnl? я про таблицу системных сервисов))) хотя впринципе, да, если в этом конетксте, то правильнее об Nt говорить)
Поискать по форуму. Совсем недавно у WIN32 были проблемы со считыванием PEB'a. Тебе он и нужен. Поищи.