драйвер запущен или нет?

Тема в разделе "WASM.WIN32", создана пользователем cresta, 28 дек 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Добрый вечер.

    Пытаюсь открыть процесс из драйвера: скачал архив kmd3 и слепил такое (подсмотрел у Four-F) :


    Код (Text):
    1. ;=====================================================================   ====================
    2. OpenProcessByPID proc pid:DWORD
    3.     LOCAL hProcess      :HANDLE
    4.     LOCAL oa            :OBJECT_ATTRIBUTES
    5.     LOCAL cid           :CLIENT_ID
    6.    
    7.     InitializeObjectAttributes addr oa, NULL, OBJ_CASE_INSENSITIVE, NULL, NULL
    8.     push    pid
    9.     pop     hProcess
    10.     mov     cid.UniqueProcess,0
    11.  
    12.     invoke  ZwOpenProcess, addr hProcess, 2035711, addr oa, addr cid
    13.     .if (eax==STATUS_SUCCESS)
    14.         invoke ZwClose, hProcess
    15.     .endif
    16.    
    17.     ret
    18. OpenProcessByPID endp
    19.  
    20. ;=====================================================================   ====================
    21. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    22.  
    23.     invoke OpenProcessByPID, 1856
    24.  
    25.     mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    26.     ret
    27.  
    28. DriverEntry endp
    29.  
    30.  
    31. end DriverEntry




    Пользуюсь KdmManager'ом:


    Код (Text):
    1. Operation |  Status    |  Last Error
    2. ------------------------------------------------------------------
    3. Register  |  Success   |  Протекает наложенное событие ввода/вывода
    4. Start     |  Success   |  Параметр задан неверно
    5. Stop      |  Fail      |  Служба не запущена
    6. Unregister|  Success   |  Протекает наложенное событие ввода/вывода




    Такой вопрос: служба запускается или нет?

    Если да, почему на Stop выдаёт: "Служба не запущена"

    Если нет, почему на Start статус = Success?

    Если запускать из exe при помощи

    invoke StartService, hService, 0, NULL

    возвращает ноль, GetLastError - параметр задан неверно :dntknw: В каком месте неверно - не понял. hService - валидный (не ноль)

    Просветите, в чем тут дело?
     
  2. Ation

    Ation New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2005
    Сообщения:
    92
    Адрес:
    Zaporozhie
    Все дело в :

    mov eax, STATUS_DEVICE_CONFIGURATION_ERROR

    ret

    Этим ты сообшаешь системе, что драйвер стартовал неудачно и его можно смело выгрузитьиз памяти.

    Следовательно DriverUnload, который наверно и не предусмотрен ), никогда не вызовется.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ation



    Понял, спасибо!

    Пробовал искать другие константы - в ntstatus.inc их нет, в инете - тоже нет. Не бывает других ? :))

    Если mov eax,0 - то теперь уже на Stop ругается:

    "Команда неуместна для данной службы"
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    :))

    Вообще для выгрузки требуется чтоб он (драйвер) нормально загрузился - вернул STATUS_SUCCESS. И еще обязательно должна быть процедура DriverUnload . Она тоже должна возвращать STATUS_SUCCESS при успешной выгрузке.

    Эти константы есть в ntstatus.inc (их там полно) (у Four-F бери)
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Вообще то DriverUnload ничего не возврщает.
     
  6. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Код (Text):
    1. [b]VOID[/b]
    2.   DriverUnload(
    3.     IN PDRIVER_OBJECT  DriverObject
    4.     );


    Это кусок из DDK :)

    cresta

    В твоём случае лучше вынести hProcess в глобальные перемнные и в DriverUnload сделать
    Код (Text):
    1.   invoke ZwClose, hProcess
    2.   ret
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Верно, не возвращает )

    Дезинформация, сорр.
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Гут, как я понял для моей цели не нужно ни возвращать STATUS_SUCCESS, ни вызывать DriverUnload.

    Нужно было убить зловредный процесс, который не убивался, хотя и определялся утилитой pHunter by Ms Rem.

    Убил прямо по вызову DriverEntry, и собственно ничего больше делать не надо, можно сделать вид, что не запускались (STATUS_DEVICE_CONFIGURATION_ERROR).

    Еще один вопрос: как снаружи (из ехе) передать какое-нибудь значение в драйвер, например тот же pid процесса? Кроме как писать в файл или в реестр, а из драйвера читать - не знаю. Но это не очень красиво :dntknw:
     
  9. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    cresta

    DeviceIoControl
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    infern0



    спасибо, попробую разобраться
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    с DeviceIoControl разобрался, только одна проблема: работает только если .sys лежит рядом с .exe :dntknw:

    Указать произвольный путь не получается, а держать sys рядом с ехе не хотелось.



    Это код в exe:


    Код (Text):
    1. LOCAL szDriverName[256]     :BYTE
    2.  
    3.     invoke  GetModuleFileName, NULL, addr szDriverName, 256
    4.     invoke  lstrlen, addr szDriverName
    5.     lea     ecx,szDriverName
    6.     lea     ecx,[ecx+eax-3]
    7.     mov     dword ptr[ecx],00737973h    ;замена ехе на sys
    8.  
    9.     invoke  CreateService,  ..., ..., ...,
    10.                             ..., ..., ...,
    11.                             ..., addr szDriverName, ...,
    12.                             ..., ..., ..., ...
    13.     mov     hSrv,eax
    14.     test    eax,eax
    15.     jz      _error
    16.     invoke  StartService, hSrv, NULL, NULL
    17.     test    eax,eax
    18.     jz      _error
    19.     invoke CreateFile, $CTA0("\\\\.\\MyDriver"), NULL, NULL, NULL, OPEN_EXISTING, NULL, NULL
    20.  




    По какому принципу формировать замену "\\\\.\\MyDriver", чтобы можно указать любой произвольный путь в системе, например "c:\windows\system32\drivers\MyDriver" - не могу найти :dntknw: Пробовал по-всякому, безуспешно.
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    а GetFullPathName не подходит ?
     
  13. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Если ты создаешь девайс с именем MyDriver, то с таким именем его и должен открывать, пофиг где у тебя драйвер лежит.
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Всё, разобрался :) Действительно, всё равно где лежит драйвер. Путаница из-за макроса $CTA0 была, заменил их на offset'ы строк.

    Спасибо всем.