Blog. Just Blog

Быстрый поиск

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

Рекурсивный обход дерева каталогов

19.01.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обход дерева каталогов является одной из классических прикладных задач на применение рекурсии. В Windows штатных API-функций для этого нет, поэтому поиск файлов выполняется при помощи пары API-функций FindFirstFile и FindNextFile. Совершенно непонятно, почему разработчики Windows не дали возможность точно настраивать критерии поиска, ограничившись только маской имени файла. Даже в MS-DOS для решения аналогичной задачи можно было задать по крайней мере атрибуты файлов, например для поиска только каталогов. Более расширенные возможности для поиска предоставляет API-функция FindFirstFileEx, но она доступна только в операционной системе Windows 2000 и выше.

Для рекурсивного обхода дерева каталогов я написал следующую функцию. Она сканирует дерево каталогов, начиная с указанного, и передает все найденные имена файлов в заданную функцию-обработчик. Все действия с найденными файлами выполняются уже в ней.
  1. ;------------------------------------------------------------------
  2. ; Функция рекурсивного обхода дерева каталогов
  3. ; (C) ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;
  6. ; Параметры вызова:
  7. ; lpFStr - указатель на начальный каталог без завершающего слеша.
  8. ;          он должен быть в буфере размером не менее MAX_PATH байт
  9. ; lpProc - указатель на callback-функцию для передачи имен файлов,
  10. ;          это обязательный параметр
  11. ; dFlag  - флаг "передавать в callback-функцию имена найденных
  12. ;          каталогов" (TRUE/FALSE)
  13. ;------------------------------------------------------------------
  14. proc    FindFileRecursive lpFStr:dword,lpProc:dword,dFlag:dword
  15.         local   hFind:DWORD     ; Локальный хэндл текущего поиска
  16.  
  17.         locals
  18.         FndData WIN32_FIND_DATA ; Локальная структура WIN32_FIND_DATA
  19.         endl
  20.  
  21.         ; Сохранить изменяемые регистры
  22.         push    ebx ecx edx
  23.  
  24.         ; Добавить к пути поиска '\*.*'
  25.         invoke  lstrcat,[lpFStr],ff_mask
  26.  
  27.         ; Найти первый файл
  28.         lea     eax,[FndData]
  29.         push    eax
  30.         invoke  FindFirstFile,[lpFStr]
  31.         ; В случае ошибки полностью прекратить дальнейшее сканирование
  32.         cmp     eax,INVALID_HANDLE_VALUE
  33.         jne     @f
  34.         xor     eax,eax
  35.         jmp     ff_exit
  36. @@:
  37.         ; Сохранить хэндл текущего поиска
  38.         mov     [hFind],eax
  39.  
  40. ff_chk_file:
  41.         ; Проверить имя файла на недопустимое
  42.         lea     eax,[FndData.cFileName]
  43.         push    eax
  44.         ; Имя файла '.'
  45.         invoke  lstrcmp,ff_skip1
  46.         or      eax,eax
  47.         ; Да, пропустить
  48.         jz      ff_next_file
  49.  
  50.         lea     eax,[FndData.cFileName]
  51.         push    eax
  52.         ; Имя файла '..'
  53.         invoke  lstrcmp,ff_skip2
  54.         or      eax,eax
  55.         ; Да, пропустить
  56.         jz      ff_next_file
  57.  
  58.         ; Если установлен флаг dFlag=TRUE, то передавать в callback-процедуру
  59.         ; все найденные результаты, в том числе и каталоги
  60.         cmp     [dFlag],0
  61.         jne     @f
  62.  
  63.         ; Установлен флаг передавать только файлы. Проверить атрибуты
  64.         ; найденного файла
  65.         mov     eax,[FndData.dwFileAttributes]
  66.         and     eax,FILE_ATTRIBUTE_DIRECTORY
  67.         ; Это каталог, пропустить
  68.         jnz     ff_do_not_callback
  69. @@:
  70.         ; Вычислить длину текущей строки поиска и обрезать '*.*'
  71.         invoke  lstrlen,[lpFStr]
  72.         sub     eax,3
  73.         add     eax,[lpFStr]
  74.         mov     byte [eax],0
  75.         push    eax
  76.  
  77.         ; Дописать к пути имя найденного файла или каталога
  78.         lea     eax,[FndData.cFileName]
  79.         push    eax
  80.         invoke  lstrcat,[lpFStr]
  81.         ; Передать имя файла в callback-функцию
  82.         stdcall [lpProc],[lpFStr]
  83.  
  84.         ; Вернуть маску поиска на место
  85.         pop     ecx
  86.         mov     dword [ecx],'*.*'
  87.  
  88.         ; Если callback-функция вернула 0, то прекратить сканирование
  89.         or      eax,eax
  90.         jz      ff_stop_scan
  91.  
  92.         ; Это каталог?
  93.         mov     eax,[FndData.dwFileAttributes]
  94.         and     eax,FILE_ATTRIBUTE_DIRECTORY
  95.         je      ff_next_file
  96.  
  97. ff_do_not_callback:
  98.         ; Вычислить длину текущей строки поиска и обрезать '*.*'
  99.         invoke  lstrlen,[lpFStr]
  100.         sub     eax,3
  101.         add     eax,[lpFStr]
  102.         mov     byte [eax],0
  103.         push    eax
  104.  
  105.         ; Дописать к пути имя найденного каталога
  106.         lea     eax,[FndData.cFileName]
  107.         push    eax
  108.         invoke  lstrcat,[lpFStr]
  109.  
  110.         ; Рекурсивный вызов поиска файлов в новом каталоге
  111.         stdcall FindFileRecursive,[lpFStr],[lpProc],[dFlag]
  112.  
  113.         ; Вернуть маску поиска на место
  114.         pop     ecx
  115.         mov     dword [ecx],'*.*'
  116.  
  117.         ; Если callback-функция вернула 0, то прекратить сканирование
  118.         or      eax,eax
  119.         jz      ff_stop_scan
  120.  
  121. ff_next_file:
  122.         ; Найти следующий файл
  123.         lea     eax,[FndData]
  124.         push    eax
  125.         invoke  FindNextFile,[hFind]
  126.         or      eax,eax
  127.         ; Файл найден, обработать его
  128.         jnz     ff_chk_file
  129.         ; По умолчанию установить флаг "продолжать сканирование"
  130.         mov     eax,TRUE
  131. ff_stop_scan:
  132.         ; Закрыть хэндл текущего поиска
  133.         push    eax
  134.         invoke  FindClose,[hFind]
  135.         pop     eax
  136. ff_exit:
  137.         ; Восстановить измененные регистры
  138.         pop     edx ecx ebx
  139.  
  140.         ; Возврат из процедуры.
  141.         ; Код возврата EAX=1 - продолжать сканирование, EAX=0 - стоп
  142.         ret
  143.  
  144. ff_mask  db '\*.*',0    ; Маска файлов для поиска
  145. ff_skip1 db '.',0       ; Запрещенное имя файла
  146. ff_skip2 db '..',0      ; Запрещенное имя файла
  147.  
  148. endp
Путь к начальному каталогу должен размещаться в буфере размером не менее определенного в системе MAX_PATH (обычно 256 символов). Обязательным параметром является адрес callback-функции RecursiveFindFileProc, которой поочередно передаются все результаты поиска. Флаг dFlag указывает, будут передаваться в callback-функцию все найденные результаты, включая каталоги, или же будут передаваться только найденные файлы. Код возврата из FindFileRecursive EAX=1 - сканирование было закончено, когда больше ни одного файла не было найдено, EAX=0 - сканирование завершилось аварийно или же было остановлено из callback-функции.

Читать статью целиком »
Просмотров: 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 по ней имеется описание с примечанием, что ее использование в прикладных программах все равно нежелательно.
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. ; По умолчанию структура в FASM не определена, сделаем это самостоятельно
  5. ; Для получения необходимой информации нужны только два первых значения
  6. struct SYSTEM_TIME_INFORMATION
  7.        liKeBootTime       dq ?  ; Время старта системы
  8.        liKeSystemTime     dq ?  ; Текущее время
  9.        liExpTimeZoneBias  dq ?
  10.        uCurrentTimeZoneId dd ?
  11.        dwReserved         dw ?
  12. ends
  13.  
  14. SystemTime   SYSTEM_TIME_INFORMATION  ; Наша структура с данными
  15.  
  16. ; Константа нужного класса информации тоже не определена, сделаем это сами
  17. GET_SYSTEM_TIME_INFORMATION = 3 
  18.  
  19. ; Сегмент кода
  20. section '.code' code readable executable
  21. ...
  22.         invoke  NtQuerySystemInformation, GET_SYSTEM_TIME_INFORMATION,\
  23.                 SystemTime, sizeof.SYSTEM_TIME_INFORMATION, 0
  24.         ; Записать в регистры EDX:EAX текущее время в миллисекундах
  25.         mov     eax, dword [SystemTime.liKeSystemTime]
  26.         mov     edx, dword [SystemTime.liKeSystemTime+4]
  27.         ; Вычесть время старта системы
  28.         sub     eax, dword [SystemTime.liKeBootTime]
  29.         sbb     edx, dword [SystemTime.liKeBootTime+4]
  30.         ; Теперь в регистры EDX:EAX записано реальное количество миллисекунд,
  31.         ; прошедшее с момента старта системы
  32. ...
Преобразовать миллисекунды в обычный вид даты и времени можно при помощи пары стандартных функций FileTimeToLocalFileTime и FileTimeToSystemTime.

Читать статью целиком »
Просмотров: 6330 | Комментариев: 1

Взлом паролей учетных записей Windows

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

Читать статью целиком »
Просмотров: 146862 | Комментариев: 78

01 ... 28 29 30 31 32 33 34 35 36 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.17 сек. / MySQL: 3 (0.0126 сек.) / Память: 4.5 Mb
Наверх