· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Как отследить запись на диск файла из ДОСовской программы?

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Окт 3, 2004 05:16:48

Помоги решить проблему, горю. Необходимо отследить запись на диск файла из досовской программы и проанализировать этот файл. Написал драйвер, поставил хук на ZwWriteFile. Запись через эту функцию не проходит, т.е. файл создается обычным ZwCreateFile, закрывается ZwClose, но пишется через что-то другое. Есть подозрение на ZwVDMControl. У кого есть какие мысли поделитесь, если не трудно. Спасибо. P.S. Система WinXP.


Дата: Окт 3, 2004 09:26:15

Почему не просто перехват int 21h ?


Дата: Окт 3, 2004 12:57:44 · Поправил: frozen

Потому что программа работает в Windows XP, под NTVDM. Перехват int 21h насколько я помню можно было делать в чистом DOSe. Или может я что то не знаю?

Единственное что нашел в инете - прототип этой функции: ZwVdmControl performs a control operation on a VDM.
NTSYSAPI
NTSTATUS
NTAPI
ZwVdmControl(
IN ULONG ControlCode,
IN PVOID ControlData
);
т.е. вероятно, в зависимости от ControlCode выполняется определенная операция (м/б и запись на диск файла)...
Я все еще горю, приз хелп!!


Дата: Окт 3, 2004 21:56:25

>Почему не просто перехват int 21h ?
А разве файл только так можно создать?


Дата: Окт 4, 2004 01:05:40

Если дела так пошли, то мож стоит перехватывать IRP ? Приаттачся к девайсу и получай чё надо.

А NtWriteFile или ещё чё пробывал? Это имеет смысл, т.к. хук на zwcreatefile для NTVDM не катит - она обращается к openfile. Может и с read/write тоже самое.


Дата: Окт 4, 2004 04:24:39

_Chingachguk_ > Почему не просто перехват int 21h ?
frozen > Потому что программа работает в Windows XP ...
Кто мешает запустить исследуемую программу из bat-файла, первой строчкой которого будет резидент следящий за int13h, int21h, int26h и т.п.?


Дата: Окт 4, 2004 10:12:24

q_q
В SoftIce набираем
bpint 21 if (ah==3c) || (ah==3d) || (ah==40) || (ah==5b) || (ah==6c)

И ставим бряки на
3c - CreateFile
3d - OpenFile
40 - WriteFile
5b - CreateNewFile
6c - Extended Create/Open

Если прога написанна на BP то при выводе на экран будут бряки на 40(запись) с handle =1


Дата: Окт 4, 2004 11:13:13

Мысля у меня, конечно, дикая, но тем не менее она есть :)
Может быть стоит попробовать бряк на ntvdm.exe!DispatchInterrupts ?


Дата: Окт 4, 2004 14:02:37

MoKC0DeR все правильно написал. Если прога досовская то она слыхом не слыхала от NTVDM и юзает только то, чему с рождения учили (int 21h). Проще надо быть :)


Дата: Окт 5, 2004 17:18:55

frozen
Всё очень просто. Когда создаётся процесс NTVDM, в таблице IDT чудесным образом появляется дескриптор, накоторы указывает селектор 21H, то есть досовский инт. Любой вызов данного прерывания из процесса ntvdm приводит к дёрганью этого инт в главной таблице, который затем отправляется к драйверу, оттуда библиотеке vdm а затем, уже последние вызывают системные функции для работы с файлами (NtReadFile, NtWtiteFile и тд). Делаешь просто. Пишешь драйвер, и всовываешь обработчик в дескриптор 21h таблицы IDT, только имей в виду, что придётся согласовать 16 и 32 битные код, так как 21h описывает точку входа в 16 разрядном сегменте. Ну это уже просто. Таким образом ты сможешь контролировать этот процесс. Не веришь, проверь айсом. А кроме того, это на каждом заборе написано..


Дата: Окт 8, 2004 23:11:59

Спасибо всем кто ответил.
1)хук на zwcreatefile для NTVDM не катит - файл в данной программе создается именно этой функцией.
2) с перехватом IRP мысль была, но решил доделать так как начал.
3) Bat с резидентом это очень просто и не подходит, т.к. программа должна работать скрытно, а отслеживаемую программу можно запустить и без bat`a.
4) про int 21 в DOSe это итак понятно. Кстати, bpint 21 ничего не дает - молчит...(по поводу IDT и т.д.)
5) самое главное. Все вызовы в конце концов проходят через Native API. Итак, меня с самого начала интересовало, при помощи какой функции Native API осуществляется запись в файл из NTVDM. Файл создается NtCreateFile, закрывается - NtClose, но!! ЗАПИСЬ ОСУЩЕСТВЛЯЕТСЯ НЕ NtWriteFile. Более того. Мониторинг системных вызовов (strace), не показывает вообще никаких функций, подходящих для записи.
Вот. Так что это может быть за функция???


Дата: Окт 9, 2004 00:59:51

Ну уж если так плохо, так начнинизу: предположим ( :-))) ), что запись/чтение проходит ч/з IRP. Ну и наверно ч/з IofCallDriver, вконце концов. Цель - поймать кто это послал, и прошагать обратко по ret-коммандам прошагать до вызавающей ф-ии. Тогда _ТОЧНО_ можем знать, кто это там пишет... Знаем, что можно в SoftIce поставить:
BPX IofCallDriver IF (ECX==pDriverObjectXXX)
ну и типа тогда и начнем обратно шагать по RET.

Как узнать pDriverObjectXXX:
Можно поставить хук - BPX ObReferenceObjectByHandle if (*(esp+04)== HANDLE)
,где HANDLE – хэндл файла. Ну этим уж Ты точно располагаешь.
После, пишешь
D ESP+5*4 , и затем
P RET
Тем самым, окажешься в моменте завершившейся ObReferenceObjectByHandle, а по адресу ESP+5*4 будет Твой pDriverObjectXXX.

Готово. Можешь хучить IofCallDriver.
Тем самым, вызавая:
IRP EDX при остьнове на этом бряке, получаешь кучу доп. Инфы. В том числе и об pFileObject.

P.S. Знаю, что ч/з ?-е место, но… тоже способ :-)


Дата: Окт 9, 2004 12:14:39

В принципе, можно попробовать поставить bpm на хэндл, возвращаемый "OpenFile".


Дата: Окт 9, 2004 17:05:36

frozen
Госспади, яж тебе сказал, что делать, это сработает


Дата: Окт 9, 2004 19:27:43

CARDINAL
уже последние вызывают системные функции для работы с файлами (NtReadFile, NtWtiteFile и тд). - мне и надо, узнать эту функцию!! Ну не вызывается NtWriteFile, яж ясно написал, и не раз. А еще я написал, что bpint 0x21 чудесным образом молчит. ОК?

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.104