словом весь вопрос в заголовке темы, вот более конкретно есть драйвер, к-рый хучит функции ядра ZwWriteProcessMemory, ZwOpenProcess и т.п. по параметру, к-рый входит в тело этой функции (IN PHANDLE ProcessHandle), можно узнать какой процесс пытаются открыть или в какой процесс хотят проинжектиться, это я знаю как а нужно узнать PID процесса, к-рый вызвал эти функции, ну никак не могу понять в какую сторону смотреть как-то же узнают фаеры, кто пытается залезть в реестр, кто вписаться в какой процесс (прежде чем задать здесь вопрос, гуглю не меньше дня, но увы((((, поэтому прошу подсказки)
Clerk буагага ))) а так пока выполняет свои функции и то, что в него заложено на твердую 4 Clerk еще пара вопросов - не линкуется дров под х64, ругается на ассемблерные вставки Код (Text): __asm { cli push eax mov eax, cr0 mov g_Cr0, eax and eax, not 10000h mov cr0, eax pop eax } (ZWWRITEVIRTUALMEMORY)(KeServiceDescriptorTable->ServiceTableBase[proc]) = NewZwWriteVirtualMemory; //(ZWOPENPROCESS)(KeServiceDescriptorTable->ServiceTableBase[temp]) = NewZwOpenProcess; //(ZWTERMINATEPROCESS)(KeServiceDescriptorTable->ServiceTableBase[temp2]) = NewZwTerminateProcess; __asm { push eax mov eax, g_Cr0 mov cr0, eax pop eax sti } как это исправить?
а система тогда даст изменить адреса??? в х32 это ассемблерная вставка сбрасывает бит только на чтение и соответственно разрешает запись, потом это дело опять восстанавливается вот и спрашиваю, какизбавиться от ассемблерной вставки? просто убрать я так думаю это вообще не вариант, имхо)))
от ассемблерных вставок удалось избавиться таким образом Код (Text): PMDL g_pmdlSystemCall; PVOID *MappedSystemCallTable; // установка хука proc = *((USHORT*)(functionAddr + 1)); // запоминаем настоящий адрес функции OldZwWriteVirtualMemory = ((ZWWRITEVIRTUALMEMORY)KeServiceDescriptorTable->ServiceTableBase[proc]); g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable->ServiceTableBase, KeServiceDescriptorTable->NumberOfServices * 4); if (!g_pmdlSystemCall) return STATUS_UNSUCCESSFUL; MmBuildMdlForNonPagedPool(g_pmdlSystemCall); g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; MappedSystemCallTable = (PVOID*)MmMapLockedPages(g_pmdlSystemCall, KernelMode); (PVOID)InterlockedExchange((PLONG)&MappedSystemCallTable[proc], (LONG)NewZwWriteVirtualMemory); // анхук InterlockedExchange((PLONG)&MappedSystemCallTable[proc], (LONG)OldZwWriteVirtualMemory); InterlockedExchange((PLONG)&MappedSystemCallTable[proc2], (LONG)OldZwOpenProcess); if (g_pmdlSystemCall) { MmUnmapLockedPages(MappedSystemCallTable, g_pmdlSystemCall); IoFreeMdl(g_pmdlSystemCall); }
но теперь другая трабла - не линкуется опять под х64, ругаясь на KeServiceDescriptorTable объявляется это дело так Код (Text): typedef struct ServiceDescriptorEntry { unsigned int *ServiceTableBase; unsigned int *ServiceCounterTableBase; unsigned int NumberOfServices; unsigned char *ParamTableBase; } ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry; extern PServiceDescriptorTableEntry KeServiceDescriptorTable; плиз, в чем трабла, как исправить