Перечислить открытые процессом файлы без OpenProcess?

Тема в разделе "WASM.WIN32", создана пользователем Rel, 8 июн 2024.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.320
    Есть процесс, хочется перечислить все открытые процессом файлы, но очень не хочется делать ему OpenProcess. То есть, понятно, что я могу перечислить все хендлы в системе, отобрать хендлы процесса по пиду, но чтобы получить, какой именно файл (путь к нему) ассоциирован с хендлом, мне нужно дублировать хендл в свой процесс, а для этого нужно делать OpenProcess, а я этого не хочу. Есть какие-то другие варианты?

    Я нашел апи Restart Manager'а, которое позволяет по конкретному файлу (по его пути) узнать, какой процесс держит на него хендл, но в обратную сторону, похоже, сделать нельзя, судя по апи. Может я что-то упустил в этом?

    Ну и да: само собой юзер мод, желательно от имени обычного мирского пользователя (не админа).
     
  2. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    78
    Возможно бред: Использовать NtQuerySystemInformation с параметром SystemHandleInformation, чтобы получить информацию о всех открытых
    хендлах в системе. Затем отфильтровать хендлы, связанные с твоим процессом, используя его PID, без необходимости вызывать OpenProcess

    https://habr.com/ru/companies/infopulse/articles/352060/
     
  3. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    410
    интересно сколько таких в современно венде
    десятки (сотни) тыш?
    или пару мульенов?
     
  4. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    78
    alex_dz, каждый хэндл значимый и особенный, и не важно сколько их, тысячи или мульоны тысяч(без них ничто бы в системе не работало). Нужно быть благодарным каждому хэндлу, без них, система не могла бы работать так гладко и безопасно
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.320
    Я об этом и писал в первом сообщении, перечислить хендлы я могу, отобрать хендлы процесса я могу, отобрать среди них хендлы файлов я могу, но чтобы узнать по хендлу имя файла, с которым этот хендл ассоциирован, мне нужно дублировать хендл к себе в процесс, а для этого нужно делать OpenProcess. Или я чего-то не понимаю тут?
     
  6. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    78
    Чат гпт подсказывает забористое решение:
    Код (Text):
    1. HANDLE hSourceHandle = /* исходный хендл */;
    2. HANDLE hTargetHandle = NULL; // новый хендл
    3.  
    4. if (DuplicateHandle(GetCurrentProcess(), hSourceHandle, GetCurrentProcess(), &hTargetHandle, 0, FALSE, DUPLICATE_SAME_ACCESS))
    5. {
    6.     // Дублирование хендла прошло успешно
    7.     // Теперь у вас есть новый хендл hTargetHandle, который указывает на тот же объект, что и исходный хендл
    8. }
    9. else
    10. {
    11.     // Обработка ошибки дублирования хендла
    12. }
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Ну наконец-то. Только надо было на расте пример просить, а то только от одного вида сорца вся память утечет в переполняющийся буфер :)
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.320
    Да, надо же было просто дублировать хендл из своего процесса в свой процесс, как же я об этом не подумал? С каждым днем убеждаюсь, что меня (как программиста) скоро заменит ии, ну ничего, пойду в лену ленину ногти пилить.
     
  9. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    78
    Иногда возникает необходимость узнать хэндл (или идентификатор) файла для последующей обработки или мониторинга.
    Часто возникает вопрос: каким образом можно получить этот идентификатор, особенно если у вас нет прямого доступа.

    Некоторые разработчики прибегают к методу, известному как "брутфорс" (brute force), чтобы получить хэндл.

    В некоторых ситуациях у разработчиков нет другого способа получить хэндл для файла, например, если файл находится внутри защищенной среды или если доступ ограничен. В таких случаях брутфорс может быть единственным способом получить необходимую информацию. Кроме того, при использовании брутфорса разработчики могут узнать больше о внутренней структуре системы и улучшить свои навыки взаимодействия с файловой системой.
     
    Последнее редактирование: 9 июн 2024
  10. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    868
    Можно использовать драйвер Process Explorer'а для открытия процесса если не хочется из юзермода дергать OpenProcess.
     
  11. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    Можно пойти другим путём: включить трассировку через ETW, подписавшись, например, на Microsoft-Windows-Kernel-File на события KERNEL_FILE_KEYWORD_CREATE и KERNEL_FILE_KEYWORD_CREATE_NEW_FILE, затем запустить процесс, и в интересующий момент остановить трассировку.
    Мы получим полный лог всех открытий и созданий файлов во всей системе. Распарсив dumpfile.xml, исключим все события, кроме событий от нашего процесса - и так поймём, что он открывал.
     
    Research нравится это.
  12. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    153
    Можно через WMI попробовать запросить процессы.
    Походу CIM_Process дёргает апи с классом "SystemProcessInformation",
    т.к. логи получаю почти такие-же как в буфере апи. Но в списке есть поля как Pid так и Handle,
    хотя значения их у меня почему-то одинаковые (оба pid). Вот батник софтины WmiGen, может у тебя вернёт хэндл:

    Код (Text):
    1. @ECHO OFF
    2. :: WMI query to list selected or all properties and values of the \\root\CIMV2:CIM_Process class.
    3. :: This batch file was generated using the WMI Code Generator, Version 10.0.15.4
    4. :: https://www.robvanderwoude.com/wmigen.php
    5.  
    6. IF "%~1"=="" (
    7.     SET Node=%ComputerName%
    8. ) ELSE (
    9.     SET Node=%~1
    10. )
    11.  
    12. FOR /F %%A IN ('WMIC.EXE /Node:"%Node%" Path CIM_Process Get /Format:CSV ^| MORE.COM /E +2 ^| FIND.EXE /C ","') DO (
    13.     IF %%A EQU 1 (
    14.         ECHO 1 instance:
    15.     ) ELSE (
    16.         ECHO %%A instances:
    17.     )
    18. )
    19.  
    20. WMIC.EXE /Node:"%Node%" Path CIM_Process Get * /Format:Value
     
  13. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    а такое не поможет Адцу русской демократии??? :)
    https://learn.microsoft.com/en-us/sysinternals/downloads/handle
     
    Research нравится это.
  14. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    868
    Там как раз через перечисление хендлов сделано и сначала открывает через OpenProcess и если облом то через драйвер ProcessExplorer'а.
     
  15. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    ТС просто много хочет - вот и приходится на Бренную мечтателя возвращать :) шерстить хэндлы даже в пределах собственного процесса является нарушением секуры, а Ему подавай из других процессов на уровне мирского юзверя.. губу раскатал да по всей палубе :laugh1::laugh2::laugh3: