
Быстрый поиск
Введите фрагмент названия статьи для поиска

Рекурсивный обход дерева каталогов
19.01.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обход дерева каталогов является одной из классических прикладных задач на применение рекурсии. В Windows штатных API-функций для этого нет, поэтому поиск файлов выполняется при помощи пары API-функций FindFirstFile и FindNextFile. Совершенно непонятно, почему разработчики Windows не дали возможность точно настраивать критерии поиска, ограничившись только маской имени файла. Даже в MS-DOS для решения аналогичной задачи можно было задать по крайней мере атрибуты файлов, например для поиска только каталогов. Более расширенные возможности для поиска предоставляет API-функция FindFirstFileEx, но она доступна только в операционной системе Windows 2000 и выше.Для рекурсивного обхода дерева каталогов я написал следующую функцию. Она сканирует дерево каталогов, начиная с указанного, и передает все найденные имена файлов в заданную функцию-обработчик. Все действия с найденными файлами выполняются уже в ней.
Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------------
- ; Функция рекурсивного обхода дерева каталогов
- ; (C) ManHunter / PCL
- ; http://www.manhunter.ru
- ;
- ; Параметры вызова:
- ; lpFStr - указатель на начальный каталог без завершающего слеша.
- ; он должен быть в буфере размером не менее MAX_PATH байт
- ; lpProc - указатель на callback-функцию для передачи имен файлов,
- ; это обязательный параметр
- ; dFlag - флаг "передавать в callback-функцию имена найденных
- ; каталогов" (TRUE/FALSE)
- ;------------------------------------------------------------------
- proc FindFileRecursive lpFStr:dword,lpProc:dword,dFlag:dword
- local hFind:DWORD ; Локальный хэндл текущего поиска
- locals
- FndData WIN32_FIND_DATA ; Локальная структура WIN32_FIND_DATA
- endl
- ; Сохранить изменяемые регистры
- push ebx ecx edx
- ; Добавить к пути поиска '\*.*'
- invoke lstrcat,[lpFStr],ff_mask
- ; Найти первый файл
- lea eax,[FndData]
- push eax
- invoke FindFirstFile,[lpFStr]
- ; В случае ошибки полностью прекратить дальнейшее сканирование
- cmp eax,INVALID_HANDLE_VALUE
- jne @f
- xor eax,eax
- jmp ff_exit
- @@:
- ; Сохранить хэндл текущего поиска
- mov [hFind],eax
- ff_chk_file:
- ; Проверить имя файла на недопустимое
- lea eax,[FndData.cFileName]
- push eax
- ; Имя файла '.'
- invoke lstrcmp,ff_skip1
- or eax,eax
- ; Да, пропустить
- jz ff_next_file
- lea eax,[FndData.cFileName]
- push eax
- ; Имя файла '..'
- invoke lstrcmp,ff_skip2
- or eax,eax
- ; Да, пропустить
- jz ff_next_file
- ; Если установлен флаг dFlag=TRUE, то передавать в callback-процедуру
- ; все найденные результаты, в том числе и каталоги
- cmp [dFlag],0
- jne @f
- ; Установлен флаг передавать только файлы. Проверить атрибуты
- ; найденного файла
- mov eax,[FndData.dwFileAttributes]
- and eax,FILE_ATTRIBUTE_DIRECTORY
- ; Это каталог, пропустить
- jnz ff_do_not_callback
- @@:
- ; Вычислить длину текущей строки поиска и обрезать '*.*'
- invoke lstrlen,[lpFStr]
- sub eax,3
- add eax,[lpFStr]
- mov byte [eax],0
- push eax
- ; Дописать к пути имя найденного файла или каталога
- lea eax,[FndData.cFileName]
- push eax
- invoke lstrcat,[lpFStr]
- ; Передать имя файла в callback-функцию
- stdcall [lpProc],[lpFStr]
- ; Вернуть маску поиска на место
- pop ecx
- mov dword [ecx],'*.*'
- ; Если callback-функция вернула 0, то прекратить сканирование
- or eax,eax
- jz ff_stop_scan
- ; Это каталог?
- mov eax,[FndData.dwFileAttributes]
- and eax,FILE_ATTRIBUTE_DIRECTORY
- je ff_next_file
- ff_do_not_callback:
- ; Вычислить длину текущей строки поиска и обрезать '*.*'
- invoke lstrlen,[lpFStr]
- sub eax,3
- add eax,[lpFStr]
- mov byte [eax],0
- push eax
- ; Дописать к пути имя найденного каталога
- lea eax,[FndData.cFileName]
- push eax
- invoke lstrcat,[lpFStr]
- ; Рекурсивный вызов поиска файлов в новом каталоге
- stdcall FindFileRecursive,[lpFStr],[lpProc],[dFlag]
- ; Вернуть маску поиска на место
- pop ecx
- mov dword [ecx],'*.*'
- ; Если callback-функция вернула 0, то прекратить сканирование
- or eax,eax
- jz ff_stop_scan
- ff_next_file:
- ; Найти следующий файл
- lea eax,[FndData]
- push eax
- invoke FindNextFile,[hFind]
- or eax,eax
- ; Файл найден, обработать его
- jnz ff_chk_file
- ; По умолчанию установить флаг "продолжать сканирование"
- mov eax,TRUE
- ff_stop_scan:
- ; Закрыть хэндл текущего поиска
- push eax
- invoke FindClose,[hFind]
- pop eax
- ff_exit:
- ; Восстановить измененные регистры
- pop edx ecx ebx
- ; Возврат из процедуры.
- ; Код возврата EAX=1 - продолжать сканирование, EAX=0 - стоп
- ret
- ff_mask db '\*.*',0 ; Маска файлов для поиска
- ff_skip1 db '.',0 ; Запрещенное имя файла
- ff_skip2 db '..',0 ; Запрещенное имя файла
- endp
Читать статью целиком »
Просмотров: 9132 | Комментариев: 2

Chameleon Clock Fixer 1.0
28.11.2008 | Категория: Мои программы | Автор: ManHunter
Есть такая хорошая программа-часики Chameleon Clock, всех ее достоинств расписывать не буду, кто пользуется - тот знает. Но к сожалению, примерно с версии 3.10, в ней перестала работать опция "Убрать из Alt-Tab". В настройках галочка ставится, но фактически ничего не происходит. Автор на багрепорты и просьбы пользователей не реагирует, предпочитает тратить свое время на борьбу с варезными ссылками на файлообменниках. Пришлось самому писать мелкую утилитку для принудительного убирания значка Chameleon Clock из меню Alt-Tab. Противозаконных действий эта программа не выполняет, никаких защит не ломает и изменений в файлы не вносит, так что всякие заshitники аффтарских прав могут не напрягаться.Chameleon Clock Fixer сделан в двух вариантах: загрузчик основной программы и стационарная версия. Loader рекомендуется использовать в автозагрузке. Для этого отключите в Chameleon Clock штатную функцию автозагрузки, поместите файл chamfix_loader.exe в папку с программой и пропишите в автозагрузку ярлычок на него. Рабочей папкой в ярлыке загрузчика укажите папку Chameleon Clock. Стационарная версия chamfix_standalone.exe после запуска выдерживает паузу в 5 секунд и потом выполняет основные действия. Ее рекомендуется использовать когда Chameleon Clock уже запущен, но также можно использовать в автозагрузке, при условии что стационарная версия будет запускаться после Chameleon Clock.
Читать статью целиком »
Просмотров: 8530 | Комментариев: 7

Время непрерывной работы (Uptime) Windows
01.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для получения времени непрерывной работы системы обычно используется функция API GetTickCount. Она возвращает количество миллисекунд, прошедших с момента последнего старта системы. Проблема в том, что счетчик имеет тип dword, и по прошествии примерно 50 дней (49,7 если быть точным) достигает предельного значения и обнуляется. Конечно, продержать систему без перезагрузки почти два месяца трудно, но не значит что невозможно. Поэтому для получения гарантированно точного времени работы системы воспользуемся функцией NtQuerySystemInformation. Достаточно долго эта функция относилась к разряду недокументированных, теперь же на MSDN по ней имеется описание с примечанием, что ее использование в прикладных программах все равно нежелательно.Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ; По умолчанию структура в FASM не определена, сделаем это самостоятельно
- ; Для получения необходимой информации нужны только два первых значения
- struct SYSTEM_TIME_INFORMATION
- liKeBootTime dq ? ; Время старта системы
- liKeSystemTime dq ? ; Текущее время
- liExpTimeZoneBias dq ?
- uCurrentTimeZoneId dd ?
- dwReserved dw ?
- ends
- SystemTime SYSTEM_TIME_INFORMATION ; Наша структура с данными
- ; Константа нужного класса информации тоже не определена, сделаем это сами
- GET_SYSTEM_TIME_INFORMATION = 3
- ; Сегмент кода
- section '.code' code readable executable
- ...
- invoke NtQuerySystemInformation, GET_SYSTEM_TIME_INFORMATION,\
- SystemTime, sizeof.SYSTEM_TIME_INFORMATION, 0
- ; Записать в регистры EDX:EAX текущее время в миллисекундах
- mov eax, dword [SystemTime.liKeSystemTime]
- mov edx, dword [SystemTime.liKeSystemTime+4]
- ; Вычесть время старта системы
- sub eax, dword [SystemTime.liKeBootTime]
- sbb edx, dword [SystemTime.liKeBootTime+4]
- ; Теперь в регистры EDX:EAX записано реальное количество миллисекунд,
- ; прошедшее с момента старта системы
- ...
Читать статью целиком »
Просмотров: 6330 | Комментариев: 1

Взлом паролей учетных записей Windows
22.09.2008 | Категория: Темная сторона Силы | Автор: ManHunter
В этой статье я расскажу о программных продуктах, предназначенных для взлома паролей учетных записей операционной системы Windows. Официально этот процесс называется "восстановление забытых или утраченных паролей", но название сути не меняет. Взлом может выполняться при загрузке со специального компакт-диска или дискеты, а также путем подбора пароля на уже запущенной системе. Первый способ наиболее предпочтителен, так как самый надежный и быстрый, но для его реализации в компьютере должен быть собственно сам CD- или FDD-привод, возможность загрузки с внешних устройств раньше чем с HDD или открытый доступ в BIOS для изменения порядка загрузки. Вход в BIOS может быть закрыт паролем. На большинстве стационарных компьютеров пароли на BIOS сбрасываются отключением на несколько секунд аккумулятора CMOS или замыканием специального джампера на материнской плате. В ноутбуках настройки могут храниться на энергонезависимой Flash-памяти, в этом случае придется признать, что фокус не удался.Второй способ требует доступа к работающей системе чтобы извлечь необходимые данные из системных файлов, а потом длительного времени для расшифровки паролей. В двух словах, наиболее удачное решение для этих целей на сегодняшний день - программа SAMInside, больше на этом способе останавливаться не будем.
Разберем подробно все существующие программы для взлома паролей учетных записей при загрузке с компакт-дисков или дискет, а также порядок работы с ними.
Сразу предупреждаю, что если использовалось шифрование файловой системы, то после сброса пароля зашифрованные файлы могут стать недоступны! Используйте указанные программы на свой риск и только в самых крайних случаях!
Читать статью целиком »
Просмотров: 146862 | Комментариев: 78
