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

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

  1. Rel

    Rel Well-Known Member

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

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

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

    alex_dz Active Member

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

    Rel Well-Known Member

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

    rmn Well-Known Member

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

    Rel Well-Known Member

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

    Thetrik UA6527P

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

    HoShiMin Well-Known Member

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

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    372
    Можно через 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
     
  9. UbIvItS

    UbIvItS Well-Known Member

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

    Thetrik UA6527P

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

    UbIvItS Well-Known Member

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