Добрый вечер. Пытаюсь открыть процесс из драйвера: скачал архив kmd3 и слепил такое (подсмотрел у Four-F) : Код (Text): ;===================================================================== ==================== OpenProcessByPID proc pid:DWORD LOCAL hProcess :HANDLE LOCAL oa :OBJECT_ATTRIBUTES LOCAL cid :CLIENT_ID InitializeObjectAttributes addr oa, NULL, OBJ_CASE_INSENSITIVE, NULL, NULL push pid pop hProcess mov cid.UniqueProcess,0 invoke ZwOpenProcess, addr hProcess, 2035711, addr oa, addr cid .if (eax==STATUS_SUCCESS) invoke ZwClose, hProcess .endif ret OpenProcessByPID endp ;===================================================================== ==================== DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING invoke OpenProcessByPID, 1856 mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry endp end DriverEntry Пользуюсь KdmManager'ом: Код (Text): Operation | Status | Last Error ------------------------------------------------------------------ Register | Success | Протекает наложенное событие ввода/вывода Start | Success | Параметр задан неверно Stop | Fail | Служба не запущена Unregister| Success | Протекает наложенное событие ввода/вывода Такой вопрос: служба запускается или нет? Если да, почему на Stop выдаёт: "Служба не запущена" Если нет, почему на Start статус = Success? Если запускать из exe при помощи invoke StartService, hService, 0, NULL возвращает ноль, GetLastError - параметр задан неверно В каком месте неверно - не понял. hService - валидный (не ноль) Просветите, в чем тут дело?
Все дело в : mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret Этим ты сообшаешь системе, что драйвер стартовал неудачно и его можно смело выгрузитьиз памяти. Следовательно DriverUnload, который наверно и не предусмотрен ), никогда не вызовется.
Ation Понял, спасибо! Пробовал искать другие константы - в ntstatus.inc их нет, в инете - тоже нет. Не бывает других ? ) Если mov eax,0 - то теперь уже на Stop ругается: "Команда неуместна для данной службы"
) Вообще для выгрузки требуется чтоб он (драйвер) нормально загрузился - вернул STATUS_SUCCESS. И еще обязательно должна быть процедура DriverUnload . Она тоже должна возвращать STATUS_SUCCESS при успешной выгрузке. Эти константы есть в ntstatus.inc (их там полно) (у Four-F бери)
Код (Text): [b]VOID[/b] DriverUnload( IN PDRIVER_OBJECT DriverObject ); Это кусок из DDK cresta В твоём случае лучше вынести hProcess в глобальные перемнные и в DriverUnload сделать Код (Text): invoke ZwClose, hProcess ret
Гут, как я понял для моей цели не нужно ни возвращать STATUS_SUCCESS, ни вызывать DriverUnload. Нужно было убить зловредный процесс, который не убивался, хотя и определялся утилитой pHunter by Ms Rem. Убил прямо по вызову DriverEntry, и собственно ничего больше делать не надо, можно сделать вид, что не запускались (STATUS_DEVICE_CONFIGURATION_ERROR). Еще один вопрос: как снаружи (из ехе) передать какое-нибудь значение в драйвер, например тот же pid процесса? Кроме как писать в файл или в реестр, а из драйвера читать - не знаю. Но это не очень красиво
с DeviceIoControl разобрался, только одна проблема: работает только если .sys лежит рядом с .exe Указать произвольный путь не получается, а держать sys рядом с ехе не хотелось. Это код в exe: Код (Text): LOCAL szDriverName[256] :BYTE invoke GetModuleFileName, NULL, addr szDriverName, 256 invoke lstrlen, addr szDriverName lea ecx,szDriverName lea ecx,[ecx+eax-3] mov dword ptr[ecx],00737973h ;замена ехе на sys invoke CreateService, ..., ..., ..., ..., ..., ..., ..., addr szDriverName, ..., ..., ..., ..., ... mov hSrv,eax test eax,eax jz _error invoke StartService, hSrv, NULL, NULL test eax,eax jz _error invoke CreateFile, $CTA0("\\\\.\\MyDriver"), NULL, NULL, NULL, OPEN_EXISTING, NULL, NULL По какому принципу формировать замену "\\\\.\\MyDriver", чтобы можно указать любой произвольный путь в системе, например "c:\windows\system32\drivers\MyDriver" - не могу найти Пробовал по-всякому, безуспешно.
Если ты создаешь девайс с именем MyDriver, то с таким именем его и должен открывать, пофиг где у тебя драйвер лежит.
Всё, разобрался Действительно, всё равно где лежит драйвер. Путаница из-за макроса $CTA0 была, заменил их на offset'ы строк. Спасибо всем.