Перечитываю Колисниченко Д.Н. "Rootkits под Windows. Теория и практика программирования "шапок-невидимок", позволяющих скрывать от системы данные, процессы, сетевые соединения." - СПб.: Наука и Техника, 2006. - 320 с.: ил. На 133 стр: Вопрос -- как грузить драйвер без символических ссылок? Как обращаться к такому драйверу? Как работать с драйвером и при этом не лезть в реестр? Пните в какую сторону искать или где использовалась подобная техника...
меня смущает этот вопрос. И мне почему-то кажется, что стандартный способ - это scm-манагер. Передавать информацию можно и без линка, раз уж у нас есть дров в ядре - дело вашей фантазии: делить общую память, или например перехватывать исполнение некой апи, дабы взять - отдать параметры =)
valentin_p Мне для коллекции: 1) запускаем драйвер, используя API-функции Service Control Manager'a: OpenSCManager, CreateService, StartService, CloseServiceHandle и DeleteService. 2) прописываем драйвер в реестре «вручную» (используем RegOpenKey, RegCreateKey, RegSetValue) и загружаем драйвер с помощью функции ZwLoadDriver 3) Устанавливаем драйвер при помощи ZwSetSystemInformation с SystemLoadAndCallImage но во всех случаях указывается полный путь к драйверу, в первых двух через реестр Можно ли еще как-то загрузить драйвер?
valentin_p не заразить, а загрузить если в папке drivers путь-то к драйверу всё равно нужно указать, как его грузить-то?
Mikl___ думается без zwLoadа не обойдется. На самом деле это будет квалифицироваться как попытка скрытой загрузки. Я считаю куда надежнее просто убрать импорт\поставить антиэмуляцию\(антисплайснуть в 7), и работать через scm.
valentin_p Вот модифицированный второй вариант для WinXP. Делаем замену функций из advapi32.dll и других динамических библиотек на Zw-функции из ntdll.dll, а далее замена Zw-функций на вызов 2Eh прерывания, поэтому за исключением функции RtlGetFullPathName_U наша программа не использует импорт Код (Text): .686P .model tiny include windows.inc ;for WinXP - 699 bytes exebase equ 400000h OBJ_CASE_INSENSITIVE equ 40h SERVICE_KERNEL_DRIVER equ 01h du macro string irpc c,<string> if '&c'gt 127 db ('&c'- 0B0h),4 else dw '&c' endif endm dw 0 endm UNICODE_STRING STRUCT _Length WORD ?; len of string in bytes (not chars) MaximumLength WORD ?; len of Buffer in bytes (not chars) Buffer PWSTR ?; pointer to string UNICODE_STRING ENDS PUNICODE_STRING typedef PTR UNICODE_STRING OBJECT_ATTRIBUTES STRUCT ; sizeof = 18h _Length DWORD ? ; original name Length RootDirectory HANDLE ? ObjectName PUNICODE_STRING ? Attributes DWORD ? SecurityDescriptor PVOID ? ; Points to type SECURITY_DESCRIPTOR SecurityQualityOfService PVOID ? ; Points to type SECURITY_QUALITY_OF_SERVICE OBJECT_ATTRIBUTES ENDS .code main: include capito.asm;здесь облегченный PE-заголовок align 4 us: du <\registry\machine\SYSTEM\CurrentControlSet\Services\scp00.sys> len_us = $-us align 4 cusDevice dw len_us - 10 dw len_us - 8 dd us+exebase pusSystem dw len_us-58; du <\SYSTEM\CurrentControlSet\Services> dw len_us-56 dd us+exebase+36 pusScp00 dw len_us-114; du <scp00> dw len_us-112 dd us+exebase+104 align 4 aImagePath: du <ImagePath> a2: align 4 pusImagePath dw a2-aImagePath-2 dw a2-aImagePath dd aImagePath+exebase align 4 aType: du <Type> a3: align 4 pusType dw a3-aType-2 dw a3-aType dd aType+exebase start: Key2 equ dword ptr [ebp-4] Key equ dword ptr [ebp-8] dwDisposition equ dword ptr [ebp-12] acDriverPath equ dword ptr [ebp-MAX_PATH-12] oa equ dword ptr [ebp-MAX_PATH-12-sizeof(OBJECT_ATTRIBUTES)] enter MAX_PATH+12+sizeof(OBJECT_ATTRIBUTES),0 xchg eax,ebx lea edi,acDriverPath mov eax,3F005Ch;unicode '\?' stosd ror eax,10h stosd invoke RtlGetFullPathName_U,offset us+exebase+104,MAX_PATH,edi,esp,eax sub edi,8;путь к драйверу должен начаться с '\??\' add eax,10 push eax;длина полного пути для ZwSetValueKey ;Для последующего вызова функции ZwOpenKey нам потребуется указатель на ;заполненную структуру OBJECT_ATTRIBUTES lea ecx,oa assume ecx: ptr OBJECT_ATTRIBUTES ;InitializeObjectAttributes mov [ecx]._Length,sizeof(OBJECT_ATTRIBUTES) mov [ecx].RootDirectory,ebx mov [ecx].ObjectName,offset pusSystem+exebase mov [ecx].Attributes,OBJ_CASE_INSENSITIVE mov [ecx].SecurityDescriptor,ebx mov [ecx].SecurityQualityOfService,ebx assume ecx: nothing lea eax,Key ; Адрес Key push ecx;POBJECT_ATTRIBUTES ObjectAttributes push KEY_READ;ACCESS_MASK DesiredAccess push eax;PHANDLE KeyHandle mov eax,119 mov edx,esp int 2Eh;ZwOpenKey(&Key,2000000h,&oa) lea ecx,oa;ObjectAttributes mov (OBJECT_ATTRIBUTES ptr [ecx]).ObjectName,offset pusScp00+exebase lea eax,dwDisposition push eax;PULONG Disposition OPTIONAL push ebx;ULONG CreateOptions=REG_OPTION_NON_VOLATILE push ebx;PUNICODE_STRING Class OPTIONAL push ebx;ULONG TitleIndex push ecx;POBJECT_ATTRIBUTES ObjectAttributes push KEY_READ;ACCESS_MASK DesiredAccess lea eax,Key2 push eax;PHANDLE KeyHandle mov eax,41 mov edx,esp int 2Eh;ZwCreateKey add esp,28+12 push edi;PVOID Data push REG_SZ;ULONG Type push ebx;ULONG TitleIndex OPTIONAL push offset pusImagePath+exebase;PUNICODE_STRING ValueName push Key2;HANDLE KeyHandle mov eax,247 mov edx,esp int 2Eh;ZwSetValueKey(Key2,&pusImagePath,0,REG_SZ,edi) add esp,24 mov eax,esp;указатель на пустое место в стеке mov dword ptr [eax],SERVICE_KERNEL_DRIVER;в пустое место в стеке поместим переменную dType=1 push sizeof(dword);ULONG DataSize push eax;PVOID Data push REG_DWORD;ULONG Type push ebx;ULONG TitleIndex OPTIONAL push offset pusType+exebase;PUNICODE_STRING ValueName push Key2;HANDLE KeyHandle mov eax,247 mov edx,esp int 2Eh;ZwSetValueKey(Key2,&pusType,0,REG_DWORD,eax,sizeof(dword)) push Key2;Handle mov eax,25 mov edx,esp int 2Eh;ZwClose(Key2) mov edi,offset cusDevice+exebase push edi mov eax,97 mov edx,esp int 2Eh;ZwLoadDriver(&cusDevice) push edi mov eax,262 mov edx,esp int 2Eh;ZwUnloadDriver(&cusDevice) push Key2;Handle mov eax,63 mov edx,esp int 2Eh;ZwDeleteKey(Key2) push Key;Handle mov eax,25 mov edx,esp int 2Eh;ZwClose(Key) leave retn;ExitProcess import: dd 0,0,0,ntdll_dll,ntdll_table dd 0,0 ntdll_table: RtlGetFullPathName_U dd _RtlGetFullPathName_U dw 0 _RtlGetFullPathName_U db 0,0,"RtlGetFullPathName_U",0 ntdll_dll db "ntdll" end_import: end main Но это всёравно не то!
ну вообще-то для сегодняшних антивирусов хватит ПРОСТО убрать их из импорта, а потом искать с помощью LoadLibrary\GetProcAddress. К тому же работает везде а не только на данной оси
Mikl___ А в чем вопрос-то? Если не хочется символических ссылок -- просто не вызывайте IoCreateDevice/IoCreateSymbolicLink. Драйвер при этом можно загрузить через scm. Как общаться с таким драйверов -- можно придумать. Например, через файл.