Загрузка драйверов без символических ссылок

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl___, 26 сен 2011.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.876
    Перечитываю Колисниченко Д.Н. "Rootkits под Windows. Теория и практика программирования "шапок-невидимок", позволяющих скрывать от системы данные, процессы, сетевые соединения." - СПб.: Наука и Техника, 2006. - 320 с.: ил.
    На 133 стр:
    Вопрос -- как грузить драйвер без символических ссылок? Как обращаться к такому драйверу? Как работать с драйвером и при этом не лезть в реестр? Пните в какую сторону искать или где использовалась подобная техника...
     
  2. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    меня смущает этот вопрос. И мне почему-то кажется, что стандартный способ - это scm-манагер.
    Передавать информацию можно и без линка, раз уж у нас есть дров в ядре - дело вашей фантазии: делить общую память, или например перехватывать исполнение некой апи, дабы взять - отдать параметры =)
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.876
    valentin_p
    Мне для коллекции:
    1) запускаем драйвер, используя API-функции Service Control Manager'a: OpenSCManager, CreateService, StartService, CloseServiceHandle и DeleteService.
    2) прописываем драйвер в реестре «вручную» (используем RegOpenKey, RegCreateKey, RegSetValue) и загружаем драйвер с помощью функции ZwLoadDriver
    3) Устанавливаем драйвер при помощи ZwSetSystemInformation с SystemLoadAndCallImage
    но во всех случаях указывается полный путь к драйверу, в первых двух через реестр
    Можно ли еще как-то загрузить драйвер?
     
  4. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    да, заразить чужой можно, или кинуть в папку /drivers (палится KISом)
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.876
    valentin_p
    не заразить, а загрузить :) если в папке drivers путь-то к драйверу всё равно нужно указать, как его грузить-то?
     
  6. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    гляньте исходники RootkitUnhooker'а
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.876
    valentin_p
    спасибо!
     
  8. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    Mikl___ думается без zwLoadа не обойдется.
    На самом деле это будет квалифицироваться как попытка скрытой загрузки. Я считаю куда надежнее просто убрать импорт\поставить антиэмуляцию\(антисплайснуть в 7), и работать через scm.
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.876
    valentin_p
    Вот модифицированный второй вариант для WinXP. Делаем замену функций из advapi32.dll и других динамических библиотек на Zw-функции из ntdll.dll, а далее замена Zw-функций на вызов 2Eh прерывания, поэтому за исключением функции RtlGetFullPathName_U наша программа не использует импорт
    Код (Text):
    1. .686P
    2. .model tiny
    3. include windows.inc
    4. ;for WinXP - 699 bytes
    5. exebase     equ 400000h
    6. OBJ_CASE_INSENSITIVE    equ 40h
    7. SERVICE_KERNEL_DRIVER   equ 01h
    8. du  macro string
    9.     irpc c,<string>
    10.     if '&c'gt 127
    11.     db ('&c'- 0B0h),4
    12.     else
    13.     dw '&c'
    14.     endif
    15.     endm
    16.     dw 0
    17.     endm
    18.  
    19. UNICODE_STRING STRUCT
    20.     _Length     WORD    ?; len of string in bytes (not chars)
    21.     MaximumLength   WORD    ?; len of Buffer in bytes (not chars)
    22.     Buffer      PWSTR   ?; pointer to string
    23. UNICODE_STRING ENDS
    24.  
    25. PUNICODE_STRING typedef PTR UNICODE_STRING
    26.  
    27. OBJECT_ATTRIBUTES STRUCT        ; sizeof = 18h
    28.     _Length             DWORD       ? ; original name Length
    29.     RootDirectory           HANDLE      ?
    30.     ObjectName          PUNICODE_STRING ?
    31.     Attributes          DWORD       ?
    32.     SecurityDescriptor      PVOID       ? ; Points to type SECURITY_DESCRIPTOR
    33.     SecurityQualityOfService    PVOID       ? ; Points to type SECURITY_QUALITY_OF_SERVICE
    34. OBJECT_ATTRIBUTES ENDS
    35.  
    36. .code
    37.  
    38. main:
    39. include capito.asm;здесь облегченный PE-заголовок
    40. align 4
    41. us: du <\registry\machine\SYSTEM\CurrentControlSet\Services\scp00.sys>
    42. len_us = $-us
    43. align 4
    44. cusDevice dw len_us - 10
    45.           dw len_us - 8
    46.       dd us+exebase
    47. pusSystem dw len_us-58; du <\SYSTEM\CurrentControlSet\Services>
    48.       dw len_us-56
    49.       dd us+exebase+36
    50. pusScp00  dw len_us-114; du <scp00>
    51.       dw len_us-112
    52.       dd us+exebase+104
    53. align 4
    54. aImagePath: du <ImagePath>
    55. a2:
    56. align 4
    57. pusImagePath    dw a2-aImagePath-2
    58.         dw a2-aImagePath
    59.         dd aImagePath+exebase
    60. align 4
    61. aType:  du <Type>
    62. a3:
    63. align 4
    64. pusType     dw a3-aType-2
    65.         dw a3-aType
    66.         dd aType+exebase
    67. start:
    68. Key2        equ dword ptr [ebp-4]
    69. Key     equ dword ptr [ebp-8]
    70. dwDisposition   equ dword ptr [ebp-12]
    71. acDriverPath    equ dword ptr [ebp-MAX_PATH-12]
    72. oa      equ dword ptr [ebp-MAX_PATH-12-sizeof(OBJECT_ATTRIBUTES)]
    73.     enter MAX_PATH+12+sizeof(OBJECT_ATTRIBUTES),0
    74.         xchg eax,ebx
    75.     lea edi,acDriverPath
    76.     mov eax,3F005Ch;unicode '\?'
    77.     stosd
    78.     ror eax,10h
    79.         stosd
    80.     invoke RtlGetFullPathName_U,offset us+exebase+104,MAX_PATH,edi,esp,eax
    81.     sub edi,8;путь к драйверу должен начаться с '\??\'
    82.     add eax,10
    83.     push eax;длина полного пути для ZwSetValueKey
    84. ;Для последующего вызова функции ZwOpenKey нам потребуется указатель на
    85. ;заполненную структуру OBJECT_ATTRIBUTES
    86.         lea ecx,oa
    87.     assume ecx: ptr OBJECT_ATTRIBUTES
    88. ;InitializeObjectAttributes
    89.         mov [ecx]._Length,sizeof(OBJECT_ATTRIBUTES)
    90.     mov [ecx].RootDirectory,ebx
    91.     mov [ecx].ObjectName,offset pusSystem+exebase
    92.     mov [ecx].Attributes,OBJ_CASE_INSENSITIVE
    93.     mov [ecx].SecurityDescriptor,ebx
    94.     mov [ecx].SecurityQualityOfService,ebx
    95.         assume ecx: nothing
    96.         lea eax,Key  ; Адрес Key
    97.     push ecx;POBJECT_ATTRIBUTES  ObjectAttributes
    98.     push KEY_READ;ACCESS_MASK  DesiredAccess
    99.     push eax;PHANDLE  KeyHandle
    100.     mov eax,119
    101.     mov edx,esp
    102.     int 2Eh;ZwOpenKey(&Key,2000000h,&oa)
    103.     lea ecx,oa;ObjectAttributes
    104.     mov (OBJECT_ATTRIBUTES ptr [ecx]).ObjectName,offset pusScp00+exebase
    105.     lea eax,dwDisposition
    106.     push eax;PULONG  Disposition  OPTIONAL
    107.     push ebx;ULONG  CreateOptions=REG_OPTION_NON_VOLATILE
    108.     push ebx;PUNICODE_STRING  Class  OPTIONAL
    109.     push ebx;ULONG  TitleIndex
    110.     push ecx;POBJECT_ATTRIBUTES  ObjectAttributes
    111.     push KEY_READ;ACCESS_MASK  DesiredAccess
    112.     lea eax,Key2
    113.     push eax;PHANDLE  KeyHandle
    114.     mov eax,41
    115.     mov edx,esp
    116.     int 2Eh;ZwCreateKey
    117.     add esp,28+12
    118.     push edi;PVOID  Data
    119.     push REG_SZ;ULONG  Type
    120.     push ebx;ULONG  TitleIndex  OPTIONAL
    121.     push offset pusImagePath+exebase;PUNICODE_STRING  ValueName
    122.     push Key2;HANDLE  KeyHandle
    123.     mov eax,247
    124.     mov edx,esp
    125.     int 2Eh;ZwSetValueKey(Key2,&pusImagePath,0,REG_SZ,edi)
    126.     add esp,24
    127.     mov eax,esp;указатель на пустое место в стеке
    128.     mov dword ptr [eax],SERVICE_KERNEL_DRIVER;в пустое место в стеке поместим переменную dType=1
    129.     push sizeof(dword);ULONG  DataSize
    130.     push eax;PVOID  Data
    131.     push REG_DWORD;ULONG  Type
    132.     push ebx;ULONG  TitleIndex  OPTIONAL
    133.     push offset pusType+exebase;PUNICODE_STRING  ValueName
    134.     push Key2;HANDLE  KeyHandle
    135.     mov eax,247
    136.     mov edx,esp
    137.     int 2Eh;ZwSetValueKey(Key2,&pusType,0,REG_DWORD,eax,sizeof(dword))
    138.     push Key2;Handle
    139.     mov eax,25
    140.     mov edx,esp
    141.     int 2Eh;ZwClose(Key2)
    142.     mov edi,offset cusDevice+exebase
    143.     push edi
    144.         mov eax,97
    145.     mov edx,esp
    146.     int 2Eh;ZwLoadDriver(&cusDevice)
    147.     push edi
    148.         mov eax,262
    149.     mov edx,esp
    150.     int 2Eh;ZwUnloadDriver(&cusDevice)
    151.     push Key2;Handle
    152.     mov eax,63
    153.     mov edx,esp
    154.     int 2Eh;ZwDeleteKey(Key2)
    155.     push Key;Handle
    156.     mov eax,25
    157.     mov edx,esp
    158.     int 2Eh;ZwClose(Key)
    159.     leave
    160.     retn;ExitProcess
    161. import:
    162. dd 0,0,0,ntdll_dll,ntdll_table
    163. dd 0,0
    164. ntdll_table:
    165. RtlGetFullPathName_U    dd _RtlGetFullPathName_U
    166.             dw 0
    167. _RtlGetFullPathName_U   db 0,0,"RtlGetFullPathName_U",0
    168. ntdll_dll       db "ntdll"
    169. end_import:
    170. end main
    Но это всёравно не то!
     
  10. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    ну вообще-то для сегодняшних антивирусов хватит ПРОСТО убрать их из импорта, а потом искать с помощью LoadLibrary\GetProcAddress. К тому же работает везде а не только на данной оси
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.876
    valentin_p
    Сложно, отпираться, но это не вирь! Мамой клянусь... ;)
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Mikl___
    А в чем вопрос-то? Если не хочется символических ссылок -- просто не вызывайте IoCreateDevice/IoCreateSymbolicLink. Драйвер при этом можно загрузить через scm. Как общаться с таким драйверов -- можно придумать. Например, через файл.
     
  13. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    я думал что вопрос исчерпан