Загрузка драйвера из NamedPipe с помощью ZwLoadDriver

Тема в разделе "WASM.WIN32", создана пользователем m0zg, 1 июл 2009.

Статус темы:
Закрыта.
  1. m0zg

    m0zg New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2009
    Сообщения:
    21
    Идея такая:
    Драйвер хранится в ресурсах проги.
    Получаем указатель на образ драйвера с помощю FindResource(...) > LoadResource(...) > LockResource(...).
    Код (Text):
    1. HRSRC       hRes = ::FindResource( 0, MAKEINTRESOURCE(SYSFILE), L"BINARY" );
    2.     if ( hRes == NULL ){return 0;}
    3.     HGLOBAL     hgResMem = ::LoadResource( 0, hRes );
    4.     if ( hgResMem == NULL ){return 0;}
    5.     LPVOID      pRes = ::LockResource( hgResMem );
    6.     if ( pRes == NULL ){return 0;}
    7.     DWORD       dwResSize = ::SizeofResource( 0, hRes );
    8.     if ( dwResSize == 0 ){return 0;}
    В потоке делаем CreateNamedPipe, ConnectNamedPipe и в замкнутом цикле WriteFile с указателем на образ драйвера.

    Код (Text):
    1.     hPipe = CreateNamedPipe(
    2.         _T("\\\\.\\pipe\\ndisuio.sys"),
    3.         PIPE_ACCESS_DUPLEX,
    4.         PIPE_TYPE_BYTE |
    5.         PIPE_READMODE_BYTE |
    6.         PIPE_WAIT,
    7.         PIPE_UNLIMITED_INSTANCES,
    8.         dwResSize,
    9.         dwResSize,
    10.         NMPWAIT_USE_DEFAULT_WAIT,
    11.         NULL);
    12.  
    13.     DWORD NumberOfBytesWritten;
    14.     for(;;)
    15.     {
    16.     ConnectNamedPipe(hPipe,0); //здесь поток засыпает, пока кто-то не подключится
    17.  
    18.         WriteFile(hPipe,pRes,dwResSize,&NumberOfBytesWritten,0);
    19.  
    20.         DisconnectNamedPipe(hPipe);
    21.     }
    В другом потоке или другой копии процесса регистрируем сервис, в ImagePath прописываем что-то вроде "\\??\\\\\\.\\pipe\\ndisuio.sys", и вызываем ZwLoadDriver.

    В результате ZwLoadDriver сообщает что не может найти указанный путь, либо неправильное имя файла.
    Вроде как то давно у меня доходило до WriteFile и она вылетала с ошибкой (тоесть ZwLoadDriver нашел путь и пытался загрузить образ).

    Может кто знающий пробовал так сделать, или попробует... реально ли вообще таким образом загрузить драйвер?
    Способ интересен тем, что на жестокий диск драйвер никогда сбрасываться не будет.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Так нельзя по-моему дрова грузить через пайпы.
    У тебя не отмапируется он в юзермодное ап процесса system.
    А имена \\.\ это на самом деле расшифровывается в \??\ поэтому дописывать ничего не надо было бы (если бы так можно было делать вообще) - \??\pipe\......


    Скидывай его в файл, потом делай ZwLoadDriver, а затем удаляй файл.
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    ну или в shared memory если следить не хочется.
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Фигню сморозил, сорри.
     
  5. m0zg

    m0zg New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2009
    Сообщения:
    21
    Да, точно, зарегил ImagePath как \??\pipe\ndisuio.sys - теперь ZwLoadDriver попыталась загрузить, но выдала ошибку "STATUS_DRIVER_UNABLE_TO_LOAD (0xC000026C)", через RtlNtStatusToDosError расшифровывается как "Выбран неверный драйвер".
    Функция WriteFile в NamedPipe-сервере вернула код 0, но число записаных байт тоже 0.
    Может в CreateNamedPipe нужно задать другие параметры?

    - не совсем понимаю что это значит, нельзя это как-нибудь вручную сделать из юзермода?

    этот способ, конечно, проверенный, но совсем не интересный.

    Надежда умирает последней =)
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    MmLoadSystemImage проецирует файл сначала в адресное прострнство процесса System, а затем уже выделяет место в памяти ядра и копирует постранично туда образ. Далее применяются релоки и обрабатываются импорты.
    После этого проекция закрываетс, файл закрывается. По этой причине как раз файл драйвера может быть удален после загрузки.
    Однако, ZwCreateSection с флагом SEC_IMAGE, которая вызывается для маппирования образа не "скушает" твой named pipe, поскольку пайп по ее понятиям не подходит для проецирования в качестве образа.
    Вообщем, дохлый номер.
     
  7. m0zg

    m0zg New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2009
    Сообщения:
    21
    Код (Text):
    1. NTSTATUS
    2.   ZwCreateSection(
    3.     OUT PHANDLE  SectionHandle,
    4.     IN ACCESS_MASK  DesiredAccess,
    5.     IN POBJECT_ATTRIBUTES  ObjectAttributes OPTIONAL,
    6.     IN PLARGE_INTEGER  MaximumSize OPTIONAL,
    7.     IN ULONG  SectionPageProtection,
    8.     IN ULONG  AllocationAttributes,
    9.     IN HANDLE  FileHandle OPTIONAL
    10.     );
    как я понимаю, в FileHandle будет подставлен хендл от NamedPipe?

    А если перехватить ZwCreateSection и вызвать внутри обработчика
    Код (Text):
    1. hFile = CreateFile(L"\\\\.\\pipe\\ndisuio.sys",GENERIC_READ | GENERIC_EXECUTE, FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
    а потом вместо FileHandle отправить ей hFile?
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Что перехватить? Где? Это вызывается из ядра ядром же. Как ты из юзермода перехватишь?
     
  9. m0zg

    m0zg New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2009
    Сообщения:
    21
    Ну ZwCreateSection из NTDLL вроде как под юзером перехватывается при создании процесса...
    Вобщем жаль что дохлый номер, хотя ничего криминального с точки зрения видны тут нет, т.к. права админа все равно нужны.
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Какой процесс, если речь про драйвер?
     
  11. m0zg

    m0zg New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2009
    Сообщения:
    21
    http://www.wasm.ru/print.php?article=injected_evil
    "...хукаем в своем процессе из NTDLL - ZwCreateSection, ZwQuerySection и создаем процесс с помощью CreateProcess. До возврата из CreateProcess вызываются хукнутые ZwCreateSection/ZwQuerySection. Тут надо смотреть внутрь механима создания процесса - когда создается процесс, то один из этапов - открытие файла EXE-файла и проецирование его на адресное пространство создаваемого процесса. Создание проекции делается функцией ZwCreateSection. В этот момент в перехватчике функции ZwCreateSection можно писать любые данные..."
    То есть перехватить можно, если она вызывается не ядром, а откуда такая инфа что ядром?
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Читайте меньше всякого говна, разговор далее бесполезен и бессмысленен для нас обоих.
    Я устал разъяснять прописные истины и слушать вашу чушь.

    Бегом читать руссиновича и прочую литературу по теме. Читать исходники wrk и все такое.
    Без базовых знаний - не возвращаться.
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    m0zg
    Смысла нет юзать NtLoadDriver отдельно от services.exe
    Этот сервис требует ключ реестра параметром, в котором и описан драйвер. Иначе IopOpenRegistryKey() вернёт ошибку(NtOpenKey -> ObOpenObjectByName(CmpKeyObjectType)), это первая проверка которая вернёт ошибку, далее просто вызов не возможен, ибо обьект не того типа.
    Менеджер служб вызывет rpcrt4!NdrServerCall2 -> RStartService -> ScStartServiceAndDependencies -> ScStartMarkedServices -> ScStartService -> ScLoadDeviceDriver -> NtLoadDriver), тут можно посмотреть http://www.codebreakers-journal.com/downloads/cbj/2004/CBJ_1_1_2004_Reverse_Engineering_the_Service_Control_Manager.pdf
    NdrClientCall2 запрос на порт "\RPC Control\ntsvcs" посылает. Менеджер служб этот запрос принимает, извлекает внутренний номер сервиса и соответственно для него параметры из сообщения, после чего переходит к исполнению обработчика из таблицы(rpcrt4!NdrServerCall2):
    Код (Text):
    1. 01001830      /A7270001   dd services._RCloseServiceHandle@4
    2. 01001834      |EA590001   dd services._RControlService@12
    3. 01001838      |50140101   dd services._RDeleteService@4
    4. 0100183C      |EA460101   dd services._RLockServiceDatabase@8
    5. 01001840      |17590101   dd services._RQueryServiceObjectSecurity@20
    6. 01001844      |FE590101   dd services._RSetServiceObjectSecurity@16
    7. 01001848      |CE2A0001   dd services._RQueryServiceStatus@8
    8. 0100184C      |B05E0001   dd services._RSetServiceStatus@8
    9. 01001850      |B6740001   dd services._RUnlockServiceDatabase@4
    10. 01001854      |87890001   dd services._RNotifyBootConfigStatus@8
    11. 01001858      |24850001   dd services._RI_ScSetServiceBitsW@20
    12. 0100185C      |181C0101   dd services._RChangeServiceConfigW@52
    13. 01001860      |09260101   dd services._RCreateServiceW@64
    14. 01001864      |5C470101   dd services._REnumDependentServicesW@24
    15. 01001868      |88500001   dd services._REnumServicesStatusW@32
    16. 0100186C      |602A0001   dd services._ROpenSCManagerW@16
    17. 01001870      |0B290001   dd services._ROpenServiceW@16
    18. 01001874      |0E540001   dd services._RQueryServiceConfigW@16
    19. 01001878      |A7450101   dd services._RQueryServiceLockStatusW@16
    20. 0100187C      |79660001   dd services._RStartServiceW@12
    21. 01001880      |17150101   dd services._RGetServiceDisplayNameW@16
    22. 01001884      |99150101   dd services._RGetServiceKeyNameW@16
    23. 01001888      |D34E0101   dd services._RI_ScSetServiceBitsA@20
    24. 0100188C      |5D490101   dd services._RChangeServiceConfigA@52
    25. 01001890      |184B0101   dd services._RCreateServiceA@64
    26. 01001894      |074C0101   dd services._REnumDependentServicesA@24
    27. 01001898      |08500001   dd services._REnumServicesStatusA@32
    28. 0100189C      |58320001   dd services._ROpenSCManagerA@16
    29. 010018A0      |055D0001   dd services._ROpenServiceA@16
    30. 010018A4      |2DB70001   dd services._RQueryServiceConfigA@16
    31. 010018A8      |F94C0101   dd services._RQueryServiceLockStatusA@16
    32. 010018AC      |075E0001   dd services._RStartServiceA@12
    33. 010018B0      |3B4D0101   dd services._RGetServiceDisplayNameA@16
    34. 010018B4      |074E0101   dd services._RGetServiceKeyNameA@16
    35. 010018B8      |4D3C0101   dd services._RI_ScGetCurrentGroupStateW@12
    36. 010018BC      |80480101   dd services._REnumServiceGroupW@36
    37. 010018C0      |234A0101   dd services._RChangeServiceConfig2A@12
    38. 010018C4      |862B0101   dd services._RChangeServiceConfig2W@12
    39. 010018C8      |854C0101   dd services._RQueryServiceConfig2A@20
    40. 010018CC      |3D2E0101   dd services._RQueryServiceConfig2W@20
    41. 010018D0      |15A10001   dd services._RQueryServiceStatusEx@20
    42. 010018D4      |B0480101   dd services._REnumServicesStatusExA@40
    43. 010018D8      |45480101   dd services._REnumServicesStatusExW@40
    44. 010018DC      |03840001   dd services._RI_ScSendTSMessage@20
    Если к примеру сисер загружается, то NtLoadDriver принимает параметром "\Registry\Machine\System\CurrentControlSet\Services\Syser".

    Не имеет значения, выполянется ли загрузка дрова через NtLoadDriver в контексте менеджера служб, или в контексте нашего процесса. Всеголишь идентификатором процесса в данном случае прот не обойдешь, поэтому все движения бесполезны.

    Код (Text):
    1. injected_evil
    Там товарищ описал некоторые техники, основанные на ипользовании не захваченных протом сервисов, на дату топика посмотрите, теперь подобное не актуально. Всё в этой теме вкучу слили, не понятно уже что нужно и с чем связано, инжекты, драйвера, пайпы.. %)
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    Ты вообще к чему понаписал все это про сервисы не в тему?
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    А тема про что ?
    Вроде топег был в разделе WIN32, вопрос про загрузку дров посредством NtLoadDriver. Более детально я хз в чём вопрос заключается. Собственно тут темы насколько я понял нету, у афтора мозк ебё..я.)
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Тема - про NtLoadDriver, а ты тут про сервисы.
    Ты написал текст совершенно не по теме, автор негодуе почему нельзя загружать дрова из пайпов, а ты ему про сервисы.
    Не знаешь про что тема? Перечитай.
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Какие есчо сервисы, сам перечитай мой ответ .D
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Отвечай на мой ответ!11
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Изыди.)
     
Статус темы:
Закрыта.