Доброго времени суток. Собственно, возникла необходимость в ядре вытащить полный путь к файлу образа какого-либо процесса. Луканулся, было, прочитать из PEB, да оказалось смещения изменились. Хотел из секции - SectionObject в EPROCESS тоже хрен знает где теперь лежит. В списках InLoadOrderModuleList и им подобных записи об ЕХЕ-шнике нет, да и не факт, что в Висте смещение LoaderData в PEB не поменялось. Но меня вдохновляет то, что RkU, ProcessExplorer прекрасно справляются с задачей - значит задача решаема. Мне только что предложили один извращенный способ, но мне он не нравится по вполне понятным причинам: Способ основан на вызове из ядра GetModuleFileNameW - задираем IRQL, патчим LdrUnlockLoaderLock и LdrLockLoaderLock, чтоб в их начале был валидный ret, дергаем GetModuleFileNameW и восстанавливаем пропатченное. Патч необходим потому, что Ldr(Unl/L)ockLoaderLock вызывают sysenter, а это, в нашем случае, ни к чему хорошему не приведет. Первая понятная причина - это постоянный патч. Ну не вызывает он доверия в ядре. Вторая - получать путь процесса нужно будет довольно часто, иногда по многу раз в секунду. Это лишь дополняет первую причину. Вот и прошу поделиться кто чем может - смещениями, методами...
Я же тебе написал когда предлагал этот способ - что такого то? Постоянный патч ну и что. Мы задираем IRQL, ставим патч, делаем все, что надо, снимаем патч и снижаем IRQL. Не уверен насчет многопроцессорных машин, но на однопроцессорной точно не будет никаких проблем - другие потоки не смогут выполниться пока стоит патч, а когда смогут выполниться - мы на этот момент его уже снимем. Поэтому первую причину не вижу реальной.. Вторая следовательно тоже.
Насчет MP отписал в асю. кстати можно не получать каждый раз имя процесса. можно повеситься на создание процесса PsSetCreateProcessNotifyRoutine и вести таблицу соответствия PID -> FileName. когда надо делать просто лукап по таблице
Twister Уважаемый Twister, вы что-то путаете. Смещение на Section объект действительно поменялось, но все остальное остается неизменным. А то, что вы тут активно обсуждаете, господа, вы меня извините, но это дикий способ, примерно как выдирание гланд через одно место.
Вообще, конечно, не исключено что я ошибся - экспериментировал я поздно ночью, когда сильно хотелось спать. Сегодня я еще раз проверю. Но тем не менее - PEB не самый удачный в плане документированности способ и мне, по возможности, хотелось бы его избежать. Есть идеи?
Смещение для Vista и Vista SP1 в EPROCESS (поле ImageFileName) -- 14Ch RkU использует в том числе и этот метод.
Проверил - нужные смещения в PEB действительно не изменились. А SectionObject? Вообще, есть полный define?
http://www.wasm.ru/forum/viewtopic.php?id=20973 http://www.nirsoft.net/kernel_struct/vista/EPROCESS.html
А Вам для каких целей? Если для мирных , можно воспользоваться ф. ZwQueryInformationProcess + класс ProcessImageFileName. Работает она с дескриптором процесса, поэтому для начала его нужно поиметь с помощью ZwOpenProcess. Работать будет начиная с WinXP.
Для мирных. Для очень мирных. Скоро (я думаю, что скоро) выложу бету этого проекта на суд общественности. Это проактивный монитор. Поддержку w2k делать не думаю. Но еще не уверен. За способ спасибо, но это медленно, лучше PEB, ведь ZwQueryInformationProcess скорее всего от туда и берет.