Может мой вопрос глупый, т.к. я не спец. в области ring0 приложений. Есть драйвер который загружается вместе с системой как сервис. Мне нужно выгрузить этот драйвер без перезагрузки комп.. Вот два метода выгрузки которые мне знакомы: 1. Код (Text): SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); if (scm == NULL) return FALSE; SC_HANDLE svc = OpenService(scm, SERVICENAME, SERVICE_START | DELETE | SERVICE_STOP); if(svc == NULL) return FALSE; SERVICE_STATUS status; ControlService(svc, SERVICE_CONTROL_STOP, &status); DeleteService(svc); CloseServiceHandle(svc); CloseServiceHandle(scm); 2. Код (Text): Через функцию NtUnLoadDriver Но ни первый ни второй код драйвер не выгрузили. Почему?
насколько я понимаю если DriveEntry не зарегестрировал процедуру для выхода то его выгрузить нельзя никак. я про: theDriverObject->DriverUnload=DriverUnload; Буду рад если меня поправят.
spencer насколько позволяют мои скромные познания ядра то это может быть одна из причин, другие причины: 2) не хватает прав, либо функция остановки хукается - тут ничего происходит 3) драйвер занят - в этом случае он помечается к удалению и удаляется при случае окончания работы с ним занятым приложением либо перезагрузке я тоже буду рад если меня поправят
shihoda В первом способе смотри на возвращаемые функциями значения и GetLastError`ы. Вероятнее всего не закрываешь какой-нибудь хендл
Первый способ у меня работал тогда, когда функция DriverUnload не была зарегистрирована. Как только я её зарегистрировал, так сразу же исчезла возможность выгрузить драйвер без перезагрузки. Может существуют специальные программы, позволяющие выгружать драйвера принудительно?
Попробуй загрузить/выгрузить минемальный драйвер используя стандартные средства: net start mydrv net stop mydrv
SysProger Есть. Удалить из списков(загрузчика и др.), тормознуть в ипи или какомнибудь спинлоке всю систему(чтоб левый проц не мешал), восстановить секции кода всех системных дров с диска, похучить KiTrap0E(#PF) и из хэндлера смореть кто память того дрова заюзает, если на исполнение выполнить развёртку стека, короче долго епацца придется.
Clerk и нафига это надо? D все равно если драйвер очень очень занят то хрен ты его выгрузить даже если перелопатишь все ядро кверх ногами - в ринг0 отлично действует фраза "против лома нет приема если нет другого лома", и войнушку из драйверов устраивать смысла практически нет
Great Я и сам прекрасно это знаю, да и вообще это не мне нужно. Great: а то я не знаю кому это надо =) Я просто говорю что чето ты странное пишешь...
Great Если быть открытым, то у тебя подход прост - есть у нас лом, у них тоже лом есть, значит в войне мы проиграем. Одна мысль что боротся в кернелмоде и ты уже сдался. Ничего странного, лом у них есть, но редко кто им пользоватсо умеет. Я так понимаю что выгрузить - удалить на него все ссылки, чтобы он не получал управление. Человек спросил как его можно выгрузить - ну так ответь ему что мол никак не выгрузишь, тема закрыта. Я хотябы могу попытаться, в большинстве случаев выгрузить удастся. А если и руткит, то он использует модуль - это плохой руткит. Допустим подвесилсо он на прерывание, освободили мы память дрова, возникло исключение при передаче управления в дров по этому прерыванию, мы обработаем исключение, возьмём из стека адрес возврата, и вернём управление. Если знать откуда вызов, а это не состовляет труда узнать - мы возвратим корректное значение, к примеру дабы не нарушить цепочку обработчиков, иначе будет если не крах, то полное зависание системы. Для большинства случаев, покрайней мере те драйвера что загружены у меня сейчас, не юзают низкоуровневые перехваты и тп., что не удастся снять. Единственный момент - не всё экспортируется и принудительная выгрузка дрова внесёт некоторые ограничения в систему. Кстати насчёт войнушки - это не борьба руткитов, выгружаемый дров сопротивляться не будет.
вообще я частично пошутил, с долей правды, конечно, но все-таки не стоило воспринимать так серьезно. все-таки, наверное, под выгрузкой он понимал нормальную выгрузку. ведь если после такой твоей "выгрузки" попробовать потом его снова загрузить, ничего хорошего не получится. если конечно аккуратно все-все-все не подтереть, что не очень просто
конечно. А я сейчас и не говорю про занятые драйвера. Выгружать занятый драйвер - это уже совсем другая проблема. Вот спокойная выгрузка - текущая проблема.
Нужно ставить в сисире бряк на NtUnloadDriver в процессе services.exe, затем заюзать код с первого поста, когда будет вызван этот сервис(либо сам заюзай NtUnloadDriver) и посмотреть код ошибки, винапи используют rpc, загрузка/выгрузка в контексте services.exe. Пока без возвращаемого значения трудно сказать.