имя приложения, вызвавшего драйвер

Тема в разделе "WASM.WIN32", создана пользователем infern0, 6 июл 2005.

  1. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    Есть драйвер. Можно ли в процессе обработаки IRP узнать имя процесса (причем очень желательно различать exe и dll), который этот драйвер вызвал ?
     
  2. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    можно найти pid процесса и от этого танцевать

    Если находишься самом первом обработчика IRP, то PsGetCurrentProcess, Если нет - надо рассматривать конкретный случай...



    Например можно достать процесс из MDL ассоциированного с IRP или из IRP.Thread
     
  3. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    Если обработка IRP происходит в контексте интересующего потока, то в структуре РЕВ, так:
    Код (Text):
    1.  
    2.  mov eax, fs: [18h]
    3.  mov eax, [eax+30h]
    4.  mov eax, [eax+10h]
    5.  lea eax, [eax+38h]
    6.  mov eax, [eax+4h]
    7.  
     
  4. infern0

    infern0 New Member

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

    по PsGetCurrentProcess я получу имя процесса. Например some_proc.exe. А мне хочется еще узнать какая именнно дллка этого процесса вызвала драйвер. Тут как быть ?
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    IoGetRequestorProcess / IoGetRequestorProcessId - обе документированы.



    IoGetRequestorProcessId вызывает IoGetRequestorProcess, которая делает это:


    Код (Text):
    1. PEPROCESS
    2. IoGetRequestorProcess(
    3.     IN PIRP Irp
    4.     )
    5. {
    6.     if ( Irp->Tail.Overlay.Thread ) {
    7.  
    8.         return Irp->Tail.Overlay.Thread->ThreadsProcess;
    9.  
    10.     } else {
    11.  
    12.         return NULL;
    13.     }
    14. }
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Как видно, они могут обломиться. Если есть исходники системы, я бы проанализировал функции, формирующие IRP и посмотрел, как и когда заполняется поле Irp->Tail.Overlay.Thread.



    различить exe и dll... это посложнее будет, т.к. системе всё равно из какого модуля вызов - она это нигде не запоминает. IMHO, единственное, что можно сделать - раскрутить стек потока.
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    IMHO, если удастся получить информацию о потоке, вызвавшем драйвер, то получить имя dll уже проще.
     
  8. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    посмотрел я исходники regmon/filemon
    Код (Text):
    1.  
    2.         ...
    3.         curproc = PsGetCurrentProcess();
    4.         nameptr   = (PCHAR) curproc + ProcessNameOffset;
    5.         strncpy( ProcessName, nameptr, NT_PROCNAMELEN-1 );
    6.         ProcessName[NT_PROCNAMELEN-1] = 0;
    7.         ...
    8.  


    с учетом того что ни разу не видел, что-бы х-моны не писали имя процесса, то все должно работать. В 99% я первый в цепочке обработчиков IRP, так что должно катить.

    IceStudent

    и какие идеи по дллкам, кроме стека вызовов ?

    Four-F

    а как получить доступ к контексту 3-го кольца вызвавшего меня процесса / потока ? Было бы неплохо знать eip возврата после DeviceIoControl / ReadFile / WriteFile (не знаю как точно меня вызовут...)
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ну если ты уверен что в контексте вызывающего процесса, то тогда проще.



    В ProcessExplorer есть такая фича - в свойствах потока он показывает стек. В драйвере для этого юзает две функции. Они очень маленькие и простые, но дело давно было и деталей уже не помню..



    _ProcExpGetKcontext@12

    _ProcExpReadKstack@12



    Вызываются по DeviceIoControl с кодами соответственно:



    83350028

    83350024
     
  10. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Забыл сказать... Драйвер только сбрасывают ProcessExplorer'у стек, а саму раскрутку он уже сам делает без помощи драйвера. Примеры раскрутки стека есть в сорсах отладчиков. Кажется у Джона Робинса в примерах к его книге есть полноценный отладчик с исходниками. Насколько сложно будет сделать это прямо в ядре, я не знаю.
     
  11. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    думаю что впрямую достать длл нереально... по логике систему не должно интересовать какой модуль из процесса послал IRP, хотя дай бог что я ошбиаюсь :)



    можно попробовать такое шаманство:

    найти PID вызвавшего процесса,

    проенумерировать его дллки,

    найти PID вызвавшего потока,

    из ETHREAD найти стартовый адрес потока,

    определить какаой из длл этот адрес принадлежит
     
  12. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Упс... это, наверное, не то ;) Так он стеки ядра у драйвера запрашивает, но всё равно посмотри. А юзерный стек, наверное, надо искать в TEB.



    pThread->Tcb.Teb->StackBase

    pThread->Tcb.Teb->StackLimit
     
  13. infern0

    infern0 New Member

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

    не должно, она насколько я понял знает только process id / thread id.

    но разве thread id основного файла будет отличатся от thread id дллки ? ведь при вызове функций дллки переключения нитей не происходит. Т.е. единственный вариант - это через eip и базовые адреса дллелек в процессе. Чет мне это все меньше и меньше нравится...
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Four-F



    У него фича лучше есть: в свойствах потоков кнопочка "Module". Думаю, это самое то, что нужно: имя dll, создавшей поток, который обратился к драйверу.
     
  15. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    infern0

    В таком случае уж лучше повесить хук на DeviceIoControl и смореть по стеку и параметрам функции чего вызываем и кто вызывает :)) Ктому же будет просто с этим промапленные странички Kernel32.dll промаплены в единственном экземпляре в нормальном своем состоянии. Уж проще простого, чем огород городить :))
     
  16. infern0

    infern0 New Member

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

    с хуком это вариант, но придется еще и readfile/writefile хучить.

    IceStudent

    а processexplorer идет в сырцах ? ткните в линк плз...
     
  17. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow


    ну и что тут сложного ????? :)
     
  18. infern0

    infern0 New Member

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

    сложного ничего. хотелось сделать красивее - чисто из драйвера. но видимо не судьба...
     
  19. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    infern0

    Нет, не в сорцах.



    В общем, тебе нужно лишь получить из драйвера указатель на объект Thread или его ID, остальное дело техники. Возможно?
     
  20. infern0

    infern0 New Member

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

    Irp->Tail.Overlay.Thread думаю будет доступен всегда. А вот про технику можно чуть подробнее ?