Здрасте. Задача следующая, юзермод. Есть сервисный обработчик создания процессов, при вызове NtCreateProcess(Ex) нужно получить нормальный, человеческий путь к файлу, из которого создаётся процесс. Любой ядерный сервис возвращает путь к файлу в нт формате, тоесть не c:\path, а \device\harddiscvolume\.. В сервис передаётся описатель секции(section:handle), из которой запускается процесс. Сервиса для получения инфы про файловую секцию нет, точнее он не возвращает пути. Поэтому секция отображается в текущий процесс и для неё получается MemoryMappedFilenameInformation. Инфа возвращается в нт-формате. Можно запросить инфу по обьекту(NtQuerySection), либо открыть файл по пути и запросить инфу NtQueryInformationFile. В любом случае возвращается путь в нт формате. Функций конвертации в юм нет. Есть нэйтивные функции трансляции путей, но они работают лишь для текущей директории, по этому не пригодны. Есть старая реализация, перечисляются символические ссылки. Не хотелось бы это использовать. Возможно есть нормальный способ. Я что то не могу вспомнить, этот вопрос поднимался. Системный слепок для процессов(SystemProcessInformation) путей не содержит. На этапе создания процесса вроде бы как в окружении процесса никакие пути не настроены, чтением памяти это не получить. --- Сообщение объединено, 15 ноя 2018 --- Можно проследить путь данных, кто пишет в окружение процесса дос путь. Скорее всего это делает винапи, создающая процесс по передаваемому пути(аргумент). При этом трансляция путей не выполняется. Имя(путь) передаётся в дос формате и что будет если создать процесс по нт пути хз. --- Сообщение объединено, 15 ноя 2018 --- В любом ином случае пути содержит окружение, нп загрузчик. Но тут юзер фильтр на создание процессов, на сервисном этапе не понятно как получить нормальный файловый путь. Это задача белая, фильтр ставится в юм на создание процесса для взятия под монитор протекторов(армадилла), которые запускают свои клоны.
Thetrik, Саппорт только с Vista. Смотрим импорт: NtQueryObject NtQueryInformationFile. Эти апи не предоставляют инфу для решения(возвращают нт путь). Возможно что используется инфа загруженная при старте кернел32. Но в любом случае - не приемлемо, тем более у меня вин хп. --- Сообщение объединено, 16 ноя 2018 --- TermoSINteZ Тут немного людей у кого можно что то спросить. Почему вы не ответили ?
..думаю самый простой/портируемый вариант - это получить файл-базу процессов через WMI, и потом пропарсить её. Там всего одна строчка батника, которую можно зашить в программу и запускать прямо со своей exe-тушки: Код (Text): @echo off wmic /Output:process.txt process get caption,ExecutablePath /format:list здесь, в базу будет сохраняться только "имя процесса" и его "полный путь", хотя WMIC портянку возвращает приличную со-всей подноготной всех процессов - при надобности можно добавить ещё пунктов. Так-же, вариант "CreateToolhelp32Snapshot()" - тоже у меня на ХР-SP3 возвращает путь, но только для подключаемых модулей DLL (флаг=8). А вот для процессов (флаг=2) опять только имя, хотя в доках сказано, что путь (и резерв в буфере под путь 256-байт). Код (ASM): ; fasm-code ;---------- include 'win32ax.inc' .data title db 'Path',0 handle dd 0 align 16 size dd 230h ; размер структуры - нужно установить до вызова moduleID dd 0 ; MID - в контексте процесса-владельца processID dd 0 ; PID проверяющего процесса glblcntUsage dd 0 ; глобальных ссылок на модуль proccntUsage dd 0 ; ссылок процесса на модуль modBaseAddr dd 0 ; базовый адрес модуля в контексте процесса modBaseSize dd 0 ; размер модуля hModule dd 0 ; хэндл модуля в контексте процесса module db 256 dup(0) ; имя модуля exePath db 256 dup(0) ; путь к модулю ;---------- .code start: invoke CreateToolhelp32Snapshot,8,0 ; 8=модули, 2=процессы mov [handle],eax invoke Module32First,[handle],size ; для процессов = "Process32First" и структуру оформить @@: invoke MessageBox,0,exePath,title,0 invoke Module32Next,[handle],size or eax,eax jne @b invoke CloseHandle,[handle] invoke ExitProcess,0 .end start ;----------- Ещё можно написать свою DLL, которая на входе в "DllEntryPoint()" будет проверять на PROCESS_ATTACH, по которому можно вытянуть путь родителя. Но это нужно тестить..
Коцит, CreateToolhelp32Snapshot() не может вернуть нормальный путь. Так как через NtQuerySystemInformation не получаются дос-пути, а локально из процесса инфу эту не получить, так как процесс создан, но не запущен. Пути туда пишутся позже создания процесса, но до запуска треда. --- Сообщение объединено, 18 ноя 2018 --- Посмотрел как это ядро делает. Есть функция IoQueryFileDosDeviceName(). Она вызывается из NtQueryInformationProcess(class 43), возвращая дос путь. Класс в 7-ке, 8 и 10 один и тот же. На xp этого класса нет. Вызывается из апи QueryFullProcessImageName().