Отслеживание изменений в каталоге на Ассемблере
Отслеживание изменений в каталоге на Ассемблере
Одна из интересных задач, с которой рано или поздно сталкивается системный программист - это отслеживание изменений в определенном каталоге или на всем диске целиком. Это может быть что-то типа файлового монитора или какого-нибудь программного триггера, срабатывающего при появлении или изменении определенного файла. Не стоит забывать и борьбу со всякой хитрозакрученной шароварой, когда надо точно и быстро отследить, в какой файл записывается регистрационная информация или триальный счетчик. В этой статье я расскажу, как сделать подобный монитор изменений в каталогах на чистом Ассемблере.
Сперва надо определить целую пачку констант, которых по умолчанию нет в библиотеках FASM. Они представляют собой различные флаги событий и их комбинации, а также идентификаторы произошедших изменений.
Code (Assembler) : Убрать нумерацию
- ; Флаги для отслеживания отдельных изменений
- FILE_NOTIFY_CHANGE_FILE_NAME = 0x00000001
- FILE_NOTIFY_CHANGE_DIR_NAME = 0x00000002
- FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x00000004
- FILE_NOTIFY_CHANGE_SIZE = 0x00000008
- FILE_NOTIFY_CHANGE_LAST_WRITE = 0x00000010
- FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x00000020
- FILE_NOTIFY_CHANGE_CREATION = 0x00000040
- FILE_NOTIFY_CHANGE_SECURITY = 0x00000100
- ; Сводный флаг для отслеживания всех изменений
- FILE_NOTIFY_CHANGE = FILE_NOTIFY_CHANGE_FILE_NAME or \
- FILE_NOTIFY_CHANGE_DIR_NAME or \
- FILE_NOTIFY_CHANGE_ATTRIBUTES or FILE_NOTIFY_CHANGE_SIZE or \
- FILE_NOTIFY_CHANGE_LAST_WRITE or FILE_NOTIFY_CHANGE_LAST_ACCESS or \
- FILE_NOTIFY_CHANGE_CREATION or FILE_NOTIFY_CHANGE_SECURITY
- ; Флаги для идентификации произошедших изменений
- FILE_ACTION_ADDED = 0x00000001
- FILE_ACTION_REMOVED = 0x00000002
- FILE_ACTION_MODIFIED = 0x00000003
- FILE_ACTION_RENAMED_OLD_NAME = 0x00000004
- FILE_ACTION_RENAMED_NEW_NAME = 0x00000005
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------
- ; Процедура наблюдателя за изменениями
- ;-----------------------------------------
- proc WatchProc hWnd:DWORD
- ; Получить хэндл каталога для наблюдения
- invoke CreateFile,szFile,GENERIC_READ,FILE_SHARE_READ or\
- FILE_SHARE_WRITE or FILE_SHARE_DELETE, NULL, OPEN_EXISTING,\
- FILE_FLAG_BACKUP_SEMANTICS,0
- mov [hFile],eax
- .loc_watch:
- ; Ожидать происходящие изменения
- invoke ReadDirectoryChangesW,[hFile], fni, MAX_PATH, TRUE,\
- FILE_NOTIFY_CHANGE,tmp,NULL,NULL
- cmp [tmp],0
- je .loc_watch
- mov ebx,fni
- .loc_process:
- ; [ebx+FILE_NOTIFY_INFORMATION.FileName] - имя измененного файла
- ; [ebx+FILE_NOTIFY_INFORMATION.FileNameLength] - длина имени файла
- ; Файл добавлен
- cmp [ebx+FILE_NOTIFY_INFORMATION.Action],FILE_ACTION_ADDED
- je .loc_added
- ; Файл удален
- cmp [ebx+FILE_NOTIFY_INFORMATION.Action],FILE_ACTION_REMOVED
- je .loc_removed
- ; Файл изменен
- cmp [ebx+FILE_NOTIFY_INFORMATION.Action],FILE_ACTION_MODIFIED
- je .loc_modified
- ; Файл переименован - старое имя
- cmp [ebx+FILE_NOTIFY_INFORMATION.Action],FILE_ACTION_RENAMED_OLD_NAME
- je .loc_renamed_old
- ; Файл переименован - новое имя
- cmp [ebx+FILE_NOTIFY_INFORMATION.Action],FILE_ACTION_RENAMED_NEW_NAME
- je .loc_renamed_new
- ...
- ...
- ; Обработка событий
- ...
- ...
- ; Произошло более одного изменения?
- cmp [ebx+FILE_NOTIFY_INFORMATION.NextEntryOffset],0
- je .loc_watch
- ; Указатель на следующую структуру с информацией об изменении
- add ebx,[ebx+FILE_NOTIFY_INFORMATION.NextEntryOffset]
- jmp .loc_process
- .loc_exit:
- ret
- endp
В приложении пример программы с исходным текстом, которая мониторит все изменения на диске C: и вложенных каталогах, и выводит полученные данные в окно лога.
Просмотров: 5499 | Комментариев: 10
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(03.10.2020 в 14:46):
Просто взять и ручками дописать в импорт ReadDirectoryChangesW, вот и все решение. Нельзя же во всем полагаться на инклуды, в FASM они остановились в развитии на поддержке Win2000.
Олег
(03.10.2020 в 14:29):
Скачал FASM, хочу скомпилировать для корня другого диска - не хочет.
Оказалось что в "INCLUDE" нету под-директории "\apiw\", только "\api\".
Изменил исходник, всё равно не компилирует - теперь не знает 'ReadDirectoryChangesW'.
У вас какие-то свои "INCLUDE"? Где бы их взять? Спасибо!
Оказалось что в "INCLUDE" нету под-директории "\apiw\", только "\api\".
Изменил исходник, всё равно не компилирует - теперь не знает 'ReadDirectoryChangesW'.
У вас какие-то свои "INCLUDE"? Где бы их взять? Спасибо!
FFFF
(14.09.2020 в 20:44):
Неплохо! Осталось то же для регистра - и прокмон мона в мусор.
ManHunter
(10.04.2017 в 01:34):
А что, недостаточно чистый? Или WinAPI не труЪ, нужен уровень драйвера диска?
Nobody4all
(10.04.2017 в 01:27):
писал что на чистом ассемблере )))
Рысь
(01.10.2015 в 15:56):
Здорово, спасибо! Узнал что некий "USBModem-MegaFon", который не подключался и не включался (и был удалён из автозагрузки) уже года два как постоянно что-то пишет в свой лог.
Ещё бы сохранение в файл и возможность указывать папку для мониторинга через параметр командной строки...
Ещё бы сохранение в файл и возможность указывать папку для мониторинга через параметр командной строки...
ManHunter
(25.08.2015 в 23:18):
Отслеживает, но обозначает только как модификацию файла \system32
Sergey
(25.08.2015 в 23:02):
А запись в файловый поток таким образом отслеживается? Например в \system32:blablabla
ManHunter
(17.08.2015 в 13:28):
Ага, особенно когда прога пишет свой триал куда-нибудь в \system32\kernel33.dll
user
(17.08.2015 в 12:34):
Короче, это логгер, в отличие от ревизора наподобие AdInf'a.
Тоже нужная штука.
Тоже нужная штука.
Добавить комментарий
Заполните форму для добавления комментария