интересно, те кто советовали сплайсинг под х64 - они делали его или так, титиретически [тут много чего титиретически заявляется ваще ;')] хотелось бы узнать процент сакцесса ... для прикола лично я в кернеле х64 только лонг_птр-ы подменяю и то далеко-далеко не везде юзайте новые колбэк-функции кстати, там кое-что есть, реестр например неплохо так
а можно немного поподробнее? что за технология и если где чего есть почитать? а контроль операций с файловой системой и процессами там реализован?
МСДН пока только реестр могу похвалить - остальное в зачаточном виде CmRegisterCallback, ObRegisterCallbacks ... ^_^ а драйвер-фильтр на что? легаси, мини - чего не хватает-то?
Решив попытаться всё-таки заставить работать драйвер с хуками функций из SSDT, столкнулся с невозможностью загрузить драйвер. В качестве теста использовался пример из 4 главы книги Хоглунда и Батлера "Руткиты Внедрение в ядро Windows". Ниже приведу ключевую часть исходника. Полная версия лежит здесь http://www.rootkit.com/vault/fuzen_op/HideProcessHookMFL.zip Код (Text): #pragma pack(1) typedef struct ServiceDescriptorEntry { unsigned int *ServiceTableBase; unsigned int *ServiceCounterTableBase; //Used only in checked build unsigned int NumberOfServices; unsigned char *ParamTableBase; } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t; #pragma pack() __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; #define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)] #define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1) #define HOOK_SYSCALL(_Function, _Hook, _Orig ) \ _Orig = (PVOID) InterlockedExchange( (PLONG) &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook) NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath) { theDriverObject->DriverUnload = OnUnload; m_UserTime.QuadPart = m_KernelTime.QuadPart = 0; OldZwQuerySystemInformation =(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation)); 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 = MmMapLockedPages(g_pmdlSystemCall, KernelMode); HOOK_SYSCALL( ZwQuerySystemInformation, NewZwQuerySystemInformation, OldZwQuerySystemInformation ); return STATUS_SUCCESS; } При попытке загрузить данный драйвер при помощи OsLoader или NET START возникает ошибка 127: Не найдена указанная процедура. Многочисленные эксперименты показали что проблема заключается в структуре KeServiceDescriptorTable, которая вероятно экспортируется отличным образом от 32-битной windows. Рабочей мтеодики получения адреса и работы с KeServiceDescriptorTable под x64 пока найти не удалось. подскажите кто знает в чём может быть пролема и как её можно решить?
мммда? а это тогда зачем? так просто от [...] делать написали? утилита чтобы узнать будет ли на вашем конкретном процессоре запускаться 64-вара: http://download3.vmware.com/software/vi/VMware-CPU-Compatibility-e.x.p-102204.zip
а есть ли в учебных целях рабочие примеры легаси и смини драйвер-фильтров?(совсем простые, чтобы понять основной смысл)