Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определение программы


Страницы:   1 2

SpyBoy ©   (2005-07-14 20:41:00) 

Как определить, какая программа в данный момент использует файл(file.*)?


Германн   (2005-07-15 01:18:00) [21]

>BiN ©   (15.07.05 00:25) [8]
>В общем-то, решаемо и не так уж сложно.

В переводе на русский - "В общем-то решаемо, но только на NT-системах и с очень большим геморроем!"

Если я не правильно перевел, извини!

А уж если вспомнить Просто Джо ©   (14.07.05 21:13) [5],
то вообще "непереводимо"!


BiN   (2005-07-15 00:25:00) [22]

В общем-то, решаемо и не так уж сложно.
Содержимое таблиц хэндлов процессов можно получить с помощью функции NtQuerySystemInformation (тип информации SystemHandleInformation).
Выбираешь объекты с типом 'File', тип предварительно можешь узнать с помощью NtQueryObject или по полю ObjectTypeNumber из _SYSTEM_HANDLE_INFORMATION.
Далее с помощью всё того же NtQueryObject получаешь имя объекта файл, т.е. собственно путь файла в форме \Device\Harddisk0\Myfile.txt, который переводишь с помощью QueryDosDevice или еще как в удобоваримый DOS-формат.
Вуаля.
Да, чуть не забыл, в NtQueryObject следует, конечно же, передавать описатель полученный от DuplicateHandle, т.е. вероятно не все процессы можно будет открыть с доступом PROCESS_DUP_HANDLE.
Пример всего вышеописанного процесса любезно предоставлен Игорем Шевченко в посте http://www.delphimaster.ru/cgi-bin/forum.pl?id=1120126541&n=5

И еще, этот способ периодически будет приводить к фатальным зависанием в NtQueryObject, а именно при попытке обращения к именнованным каналам (а они также имеют тип "File") с незавершенными операциями ввода/вывода.
Есть и другой способ получения информации об открытых объектах, например, используя \Device\Physicalmemory, но это уже совсем другая история -)


SpyBoy   (2005-07-14 21:24:00) [23]

Неужнли никто не сталкивался


SpyBoy   (2005-07-14 21:17:00) [24]

Ну вобщем я пишу антикейлоггер, лог файл я уже нахожу, а как
найти сам .exe- ведь при использовании DotFixFileSigner ативирь его не ловит


Просто Джо   (2005-07-14 21:13:00) [25]

В общем случае нерешаемо, тем более, что не определено понятие "использует файл".


SpyBoy   (2005-07-14 21:10:00) [26]

да нет, а нельзя ли напистаь какую-нибудь ловушку?


Просто Джо   (2005-07-14 21:08:00) [27]


>  [2] SpyBoy ©   (14.07.05 21:05)
> А средствами DELPHI никак?

Ты ищешь что-то вроде функции WhoDoesUseThisFile? Нету такой функции, ни в Делфи, ни в Си++, ни в Бэйсике.


SpyBoy   (2005-07-14 21:05:00) [28]

А средствами DELPHI никак?


Просто Джо   (2005-07-14 21:01:00) [29]

Полный скан содержимого оп. памяти и страничного файла в режиме ядра. Затем подключаешь дисассемблер + мощный ИИ для выявлений мест, из которых вызывается CreateFile etc, затем подключаешь еще более мощный ИИ для выяснения времени когда это произошло и не закрыт ли уже файл. Примерная схема, удачи :0)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо