Есть драйвер. Можно ли в процессе обработаки IRP узнать имя процесса (причем очень желательно различать exe и dll), который этот драйвер вызвал ?
можно найти pid процесса и от этого танцевать Если находишься самом первом обработчика IRP, то PsGetCurrentProcess, Если нет - надо рассматривать конкретный случай... Например можно достать процесс из MDL ассоциированного с IRP или из IRP.Thread
Если обработка IRP происходит в контексте интересующего потока, то в структуре РЕВ, так: Код (Text): mov eax, fs: [18h] mov eax, [eax+30h] mov eax, [eax+10h] lea eax, [eax+38h] mov eax, [eax+4h]
Kola по PsGetCurrentProcess я получу имя процесса. Например some_proc.exe. А мне хочется еще узнать какая именнно дллка этого процесса вызвала драйвер. Тут как быть ?
IoGetRequestorProcess / IoGetRequestorProcessId - обе документированы. IoGetRequestorProcessId вызывает IoGetRequestorProcess, которая делает это: Код (Text): PEPROCESS IoGetRequestorProcess( IN PIRP Irp ) { if ( Irp->Tail.Overlay.Thread ) { return Irp->Tail.Overlay.Thread->ThreadsProcess; } else { return NULL; } }
Как видно, они могут обломиться. Если есть исходники системы, я бы проанализировал функции, формирующие IRP и посмотрел, как и когда заполняется поле Irp->Tail.Overlay.Thread. различить exe и dll... это посложнее будет, т.к. системе всё равно из какого модуля вызов - она это нигде не запоминает. IMHO, единственное, что можно сделать - раскрутить стек потока.
посмотрел я исходники regmon/filemon Код (Text): ... curproc = PsGetCurrentProcess(); nameptr = (PCHAR) curproc + ProcessNameOffset; strncpy( ProcessName, nameptr, NT_PROCNAMELEN-1 ); ProcessName[NT_PROCNAMELEN-1] = 0; ... с учетом того что ни разу не видел, что-бы х-моны не писали имя процесса, то все должно работать. В 99% я первый в цепочке обработчиков IRP, так что должно катить. IceStudent и какие идеи по дллкам, кроме стека вызовов ? Four-F а как получить доступ к контексту 3-го кольца вызвавшего меня процесса / потока ? Было бы неплохо знать eip возврата после DeviceIoControl / ReadFile / WriteFile (не знаю как точно меня вызовут...)
Ну если ты уверен что в контексте вызывающего процесса, то тогда проще. В ProcessExplorer есть такая фича - в свойствах потока он показывает стек. В драйвере для этого юзает две функции. Они очень маленькие и простые, но дело давно было и деталей уже не помню.. _ProcExpGetKcontext@12 _ProcExpReadKstack@12 Вызываются по DeviceIoControl с кодами соответственно: 83350028 83350024
Забыл сказать... Драйвер только сбрасывают ProcessExplorer'у стек, а саму раскрутку он уже сам делает без помощи драйвера. Примеры раскрутки стека есть в сорсах отладчиков. Кажется у Джона Робинса в примерах к его книге есть полноценный отладчик с исходниками. Насколько сложно будет сделать это прямо в ядре, я не знаю.
думаю что впрямую достать длл нереально... по логике систему не должно интересовать какой модуль из процесса послал IRP, хотя дай бог что я ошбиаюсь можно попробовать такое шаманство: найти PID вызвавшего процесса, проенумерировать его дллки, найти PID вызвавшего потока, из ETHREAD найти стартовый адрес потока, определить какаой из длл этот адрес принадлежит
Упс... это, наверное, не то Так он стеки ядра у драйвера запрашивает, но всё равно посмотри. А юзерный стек, наверное, надо искать в TEB. pThread->Tcb.Teb->StackBase pThread->Tcb.Teb->StackLimit
Kola не должно, она насколько я понял знает только process id / thread id. но разве thread id основного файла будет отличатся от thread id дллки ? ведь при вызове функций дллки переключения нитей не происходит. Т.е. единственный вариант - это через eip и базовые адреса дллелек в процессе. Чет мне это все меньше и меньше нравится...
Four-F У него фича лучше есть: в свойствах потоков кнопочка "Module". Думаю, это самое то, что нужно: имя dll, создавшей поток, который обратился к драйверу.
infern0 В таком случае уж лучше повесить хук на DeviceIoControl и смореть по стеку и параметрам функции чего вызываем и кто вызывает ) Ктому же будет просто с этим промапленные странички Kernel32.dll промаплены в единственном экземпляре в нормальном своем состоянии. Уж проще простого, чем огород городить )
CARDINAL с хуком это вариант, но придется еще и readfile/writefile хучить. IceStudent а processexplorer идет в сырцах ? ткните в линк плз...
infern0 Нет, не в сорцах. В общем, тебе нужно лишь получить из драйвера указатель на объект Thread или его ID, остальное дело техники. Возможно?
IceStudent Irp->Tail.Overlay.Thread думаю будет доступен всегда. А вот про технику можно чуть подробнее ?