Идея такая: Драйвер хранится в ресурсах проги. Получаем указатель на образ драйвера с помощю FindResource(...) > LoadResource(...) > LockResource(...). Код (Text): HRSRC hRes = ::FindResource( 0, MAKEINTRESOURCE(SYSFILE), L"BINARY" ); if ( hRes == NULL ){return 0;} HGLOBAL hgResMem = ::LoadResource( 0, hRes ); if ( hgResMem == NULL ){return 0;} LPVOID pRes = ::LockResource( hgResMem ); if ( pRes == NULL ){return 0;} DWORD dwResSize = ::SizeofResource( 0, hRes ); if ( dwResSize == 0 ){return 0;} В потоке делаем CreateNamedPipe, ConnectNamedPipe и в замкнутом цикле WriteFile с указателем на образ драйвера. Код (Text): hPipe = CreateNamedPipe( _T("\\\\.\\pipe\\ndisuio.sys"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, dwResSize, dwResSize, NMPWAIT_USE_DEFAULT_WAIT, NULL); DWORD NumberOfBytesWritten; for(;;) { ConnectNamedPipe(hPipe,0); //здесь поток засыпает, пока кто-то не подключится WriteFile(hPipe,pRes,dwResSize,&NumberOfBytesWritten,0); DisconnectNamedPipe(hPipe); } В другом потоке или другой копии процесса регистрируем сервис, в ImagePath прописываем что-то вроде "\\??\\\\\\.\\pipe\\ndisuio.sys", и вызываем ZwLoadDriver. В результате ZwLoadDriver сообщает что не может найти указанный путь, либо неправильное имя файла. Вроде как то давно у меня доходило до WriteFile и она вылетала с ошибкой (тоесть ZwLoadDriver нашел путь и пытался загрузить образ). Может кто знающий пробовал так сделать, или попробует... реально ли вообще таким образом загрузить драйвер? Способ интересен тем, что на жестокий диск драйвер никогда сбрасываться не будет.
Так нельзя по-моему дрова грузить через пайпы. У тебя не отмапируется он в юзермодное ап процесса system. А имена \\.\ это на самом деле расшифровывается в \??\ поэтому дописывать ничего не надо было бы (если бы так можно было делать вообще) - \??\pipe\...... Скидывай его в файл, потом делай ZwLoadDriver, а затем удаляй файл.
Да, точно, зарегил ImagePath как \??\pipe\ndisuio.sys - теперь ZwLoadDriver попыталась загрузить, но выдала ошибку "STATUS_DRIVER_UNABLE_TO_LOAD (0xC000026C)", через RtlNtStatusToDosError расшифровывается как "Выбран неверный драйвер". Функция WriteFile в NamedPipe-сервере вернула код 0, но число записаных байт тоже 0. Может в CreateNamedPipe нужно задать другие параметры? - не совсем понимаю что это значит, нельзя это как-нибудь вручную сделать из юзермода? этот способ, конечно, проверенный, но совсем не интересный. Надежда умирает последней =)
MmLoadSystemImage проецирует файл сначала в адресное прострнство процесса System, а затем уже выделяет место в памяти ядра и копирует постранично туда образ. Далее применяются релоки и обрабатываются импорты. После этого проекция закрываетс, файл закрывается. По этой причине как раз файл драйвера может быть удален после загрузки. Однако, ZwCreateSection с флагом SEC_IMAGE, которая вызывается для маппирования образа не "скушает" твой named pipe, поскольку пайп по ее понятиям не подходит для проецирования в качестве образа. Вообщем, дохлый номер.
Код (Text): NTSTATUS ZwCreateSection( OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN PLARGE_INTEGER MaximumSize OPTIONAL, IN ULONG SectionPageProtection, IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL ); как я понимаю, в FileHandle будет подставлен хендл от NamedPipe? А если перехватить ZwCreateSection и вызвать внутри обработчика Код (Text): hFile = CreateFile(L"\\\\.\\pipe\\ndisuio.sys",GENERIC_READ | GENERIC_EXECUTE, FILE_SHARE_READ,0,OPEN_EXISTING,0,0); а потом вместо FileHandle отправить ей hFile?
Ну ZwCreateSection из NTDLL вроде как под юзером перехватывается при создании процесса... Вобщем жаль что дохлый номер, хотя ничего криминального с точки зрения видны тут нет, т.к. права админа все равно нужны.
http://www.wasm.ru/print.php?article=injected_evil "...хукаем в своем процессе из NTDLL - ZwCreateSection, ZwQuerySection и создаем процесс с помощью CreateProcess. До возврата из CreateProcess вызываются хукнутые ZwCreateSection/ZwQuerySection. Тут надо смотреть внутрь механима создания процесса - когда создается процесс, то один из этапов - открытие файла EXE-файла и проецирование его на адресное пространство создаваемого процесса. Создание проекции делается функцией ZwCreateSection. В этот момент в перехватчике функции ZwCreateSection можно писать любые данные..." То есть перехватить можно, если она вызывается не ядром, а откуда такая инфа что ядром?
Читайте меньше всякого говна, разговор далее бесполезен и бессмысленен для нас обоих. Я устал разъяснять прописные истины и слушать вашу чушь. Бегом читать руссиновича и прочую литературу по теме. Читать исходники wrk и все такое. Без базовых знаний - не возвращаться.
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): 01001830 /A7270001 dd services._RCloseServiceHandle@4 01001834 |EA590001 dd services._RControlService@12 01001838 |50140101 dd services._RDeleteService@4 0100183C |EA460101 dd services._RLockServiceDatabase@8 01001840 |17590101 dd services._RQueryServiceObjectSecurity@20 01001844 |FE590101 dd services._RSetServiceObjectSecurity@16 01001848 |CE2A0001 dd services._RQueryServiceStatus@8 0100184C |B05E0001 dd services._RSetServiceStatus@8 01001850 |B6740001 dd services._RUnlockServiceDatabase@4 01001854 |87890001 dd services._RNotifyBootConfigStatus@8 01001858 |24850001 dd services._RI_ScSetServiceBitsW@20 0100185C |181C0101 dd services._RChangeServiceConfigW@52 01001860 |09260101 dd services._RCreateServiceW@64 01001864 |5C470101 dd services._REnumDependentServicesW@24 01001868 |88500001 dd services._REnumServicesStatusW@32 0100186C |602A0001 dd services._ROpenSCManagerW@16 01001870 |0B290001 dd services._ROpenServiceW@16 01001874 |0E540001 dd services._RQueryServiceConfigW@16 01001878 |A7450101 dd services._RQueryServiceLockStatusW@16 0100187C |79660001 dd services._RStartServiceW@12 01001880 |17150101 dd services._RGetServiceDisplayNameW@16 01001884 |99150101 dd services._RGetServiceKeyNameW@16 01001888 |D34E0101 dd services._RI_ScSetServiceBitsA@20 0100188C |5D490101 dd services._RChangeServiceConfigA@52 01001890 |184B0101 dd services._RCreateServiceA@64 01001894 |074C0101 dd services._REnumDependentServicesA@24 01001898 |08500001 dd services._REnumServicesStatusA@32 0100189C |58320001 dd services._ROpenSCManagerA@16 010018A0 |055D0001 dd services._ROpenServiceA@16 010018A4 |2DB70001 dd services._RQueryServiceConfigA@16 010018A8 |F94C0101 dd services._RQueryServiceLockStatusA@16 010018AC |075E0001 dd services._RStartServiceA@12 010018B0 |3B4D0101 dd services._RGetServiceDisplayNameA@16 010018B4 |074E0101 dd services._RGetServiceKeyNameA@16 010018B8 |4D3C0101 dd services._RI_ScGetCurrentGroupStateW@12 010018BC |80480101 dd services._REnumServiceGroupW@36 010018C0 |234A0101 dd services._RChangeServiceConfig2A@12 010018C4 |862B0101 dd services._RChangeServiceConfig2W@12 010018C8 |854C0101 dd services._RQueryServiceConfig2A@20 010018CC |3D2E0101 dd services._RQueryServiceConfig2W@20 010018D0 |15A10001 dd services._RQueryServiceStatusEx@20 010018D4 |B0480101 dd services._REnumServicesStatusExA@40 010018D8 |45480101 dd services._REnumServicesStatusExW@40 010018DC |03840001 dd services._RI_ScSendTSMessage@20 Если к примеру сисер загружается, то NtLoadDriver принимает параметром "\Registry\Machine\System\CurrentControlSet\Services\Syser". Не имеет значения, выполянется ли загрузка дрова через NtLoadDriver в контексте менеджера служб, или в контексте нашего процесса. Всеголишь идентификатором процесса в данном случае прот не обойдешь, поэтому все движения бесполезны. Код (Text): injected_evil Там товарищ описал некоторые техники, основанные на ипользовании не захваченных протом сервисов, на дату топика посмотрите, теперь подобное не актуально. Всё в этой теме вкучу слили, не понятно уже что нужно и с чем связано, инжекты, драйвера, пайпы.. %)
Great А тема про что ? Вроде топег был в разделе WIN32, вопрос про загрузку дров посредством NtLoadDriver. Более детально я хз в чём вопрос заключается. Собственно тут темы насколько я понял нету, у афтора мозк ебё..я.)
Тема - про NtLoadDriver, а ты тут про сервисы. Ты написал текст совершенно не по теме, автор негодуе почему нельзя загружать дрова из пайпов, а ты ему про сервисы. Не знаешь про что тема? Перечитай.