\harddiscvolume

Тема в разделе "WASM.NT.KERNEL", создана пользователем Indy_, 15 ноя 2018.

  1. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Здрасте.

    Задача следующая, юзермод.

    Есть сервисный обработчик создания процессов, при вызове NtCreateProcess(Ex) нужно получить нормальный, человеческий путь к файлу, из которого создаётся процесс.

    Любой ядерный сервис возвращает путь к файлу в нт формате, тоесть не c:\path, а \device\harddiscvolume\..

    В сервис передаётся описатель секции(section:handle), из которой запускается процесс. Сервиса для получения инфы про файловую секцию нет, точнее он не возвращает пути. Поэтому секция отображается в текущий процесс и для неё получается MemoryMappedFilenameInformation. Инфа возвращается в нт-формате.

    Можно запросить инфу по обьекту(NtQuerySection), либо открыть файл по пути и запросить инфу NtQueryInformationFile. В любом случае возвращается путь в нт формате.

    Функций конвертации в юм нет. Есть нэйтивные функции трансляции путей, но они работают лишь для текущей директории, по этому не пригодны.

    Есть старая реализация, перечисляются символические ссылки. Не хотелось бы это использовать.

    Возможно есть нормальный способ. Я что то не могу вспомнить, этот вопрос поднимался. Системный слепок для процессов(SystemProcessInformation) путей не содержит.

    На этапе создания процесса вроде бы как в окружении процесса никакие пути не настроены, чтением памяти это не получить.
    --- Сообщение объединено, 15 ноя 2018 ---
    Можно проследить путь данных, кто пишет в окружение процесса дос путь. Скорее всего это делает винапи, создающая процесс по передаваемому пути(аргумент). При этом трансляция путей не выполняется. Имя(путь) передаётся в дос формате и что будет если создать процесс по нт пути хз.
    --- Сообщение объединено, 15 ноя 2018 ---
    В любом ином случае пути содержит окружение, нп загрузчик. Но тут юзер фильтр на создание процессов, на сервисном этапе не понятно как получить нормальный файловый путь. Это задача белая, фильтр ставится в юм на создание процесса для взятия под монитор протекторов(армадилла), которые запускают свои клоны.
     
    Последнее редактирование: 15 ноя 2018
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Thetrik,

    Саппорт только с Vista. Смотрим импорт:

    NtQueryObject
    NtQueryInformationFile.

    Эти апи не предоставляют инфу для решения(возвращают нт путь). Возможно что используется инфа загруженная при старте кернел32. Но в любом случае - не приемлемо, тем более у меня вин хп.
    --- Сообщение объединено, 16 ноя 2018 ---
    TermoSINteZ

    Тут немного людей у кого можно что то спросить. Почему вы не ответили ?
     
  4. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    ..думаю самый простой/портируемый вариант - это получить файл-базу процессов через WMI, и потом пропарсить её. Там всего одна строчка батника, которую можно зашить в программу и запускать прямо со своей exe-тушки:
    Код (Text):
    1.  
    2. @echo off
    3. wmic  /Output:process.txt process get caption,ExecutablePath /format:list
    4.  
    здесь, в базу будет сохраняться только "имя процесса" и его "полный путь", хотя WMIC портянку возвращает приличную со-всей подноготной всех процессов - при надобности можно добавить ещё пунктов.

    Так-же, вариант "CreateToolhelp32Snapshot()" - тоже у меня на ХР-SP3 возвращает путь, но только для подключаемых модулей DLL (флаг=8). А вот для процессов (флаг=2) опять только имя, хотя в доках сказано, что путь (и резерв в буфере под путь 256-байт).

    Код (ASM):
    1. ; fasm-code
    2. ;----------
    3. include 'win32ax.inc'
    4. .data
    5. title          db 'Path',0
    6. handle         dd  0
    7. align 16
    8. size           dd  230h   ; размер структуры - нужно установить до вызова
    9. moduleID       dd  0      ; MID - в контексте процесса-владельца
    10. processID      dd  0      ; PID проверяющего процесса
    11. glblcntUsage   dd  0      ; глобальных ссылок на модуль
    12. proccntUsage   dd  0      ; ссылок процесса на модуль
    13. modBaseAddr    dd  0      ; базовый адрес модуля в контексте процесса
    14. modBaseSize    dd  0      ; размер модуля
    15. hModule        dd  0      ; хэндл модуля в контексте процесса
    16. module         db  256 dup(0)   ; имя модуля
    17. exePath        db  256 dup(0)   ; путь к модулю
    18. ;----------
    19. .code
    20. start: invoke  CreateToolhelp32Snapshot,8,0      ; 8=модули, 2=процессы
    21.        mov     [handle],eax
    22.        invoke  Module32First,[handle],size       ; для процессов = "Process32First" и структуру оформить
    23. @@:    invoke  MessageBox,0,exePath,title,0
    24.        invoke  Module32Next,[handle],size
    25.        or      eax,eax
    26.        jne     @b
    27.        invoke  CloseHandle,[handle]
    28.        invoke  ExitProcess,0
    29. .end start
    30. ;-----------
    Ещё можно написать свою DLL, которая на входе в "DllEntryPoint()" будет проверять на PROCESS_ATTACH, по которому можно вытянуть путь родителя. Но это нужно тестить..
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Коцит,

    CreateToolhelp32Snapshot() не может вернуть нормальный путь. Так как через NtQuerySystemInformation не получаются дос-пути, а локально из процесса инфу эту не получить, так как процесс создан, но не запущен. Пути туда пишутся позже создания процесса, но до запуска треда.
    --- Сообщение объединено, 18 ноя 2018 ---
    Посмотрел как это ядро делает. Есть функция IoQueryFileDosDeviceName(). Она вызывается из NtQueryInformationProcess(class 43), возвращая дос путь. Класс в 7-ке, 8 и 10 один и тот же. На xp этого класса нет. Вызывается из апи QueryFullProcessImageName().