CMD-shell на службе у хакера Крис Касперски aka мыщъх Спецвыпуск: Хакер, номер #048, стр. 048-016-5 Простейший пример реализации может выглядеть так: #ФАЙЛ MAIN.BAT @ECHO OFF FOR %%A IN (*.%1) DO CALL print_file_name __666__ "%%A" @ECHO OFF REM проверяем наличие магического «пирожка», и, если его нет, REM вызываем основной файл программы, не забыв при этом REM передать ему аргументы командной строки IF NOT #%1#==#__666__# main.bat %1 %2 %3 %4 %5 %6 REM если мы здесь, это значит, что нас вызвали умышленно, REM а не случайно. А раз так - выкусываем магический REM «пирожок» и начинаем делать то, что мы должны делать ;) SHIFT REM * * * тело программы * * * ECHO %1 К сожалению, командные файлы не поддерживают возможности вызова процедур (или, в терминологии Си, функций), что затрудняет решение многих задач и вообще уродует программный листинг. Обычно в таких случаях прибегают к вызову внешних командных файлов, что также не есть хорошо, так как вспомогательные командные файлы смотрятся не очень красиво. Тем не менее, эта задача вполне решаема. Пусть командный файл вызывает сам себя, передавая в качестве аргумента имя метки, на которую надо осуществить передачу управления. Естественно, еще потребуется включить в строку аргументов специальное ключевое слово, обозначающее вызов функции, а в начало пакетного файла - особый обработчик, который при наличии этого самого ключевого слова перехватывал бы поток управления на себя и, сдвинув список аргументов на две позиции влево, передавал бы управление на указанную метку. Одна проблема – возврат значений. Вероятно, единственное, что здесь можно предложить, – использовать переменные окружения, а имеет смысл передавать имя переменной как аргумент, чтобы вызываемой и вызывающей функциям было легче "договориться", в противном случае их будет трудно разрабатывать независимо друг от друга. Посмотрим на пример реализации: @ECHO OFF REM Менеджер вызова процедур REM ARG: REM CALL %0 _call имя_метки_функции аргументы_функции.... REM :call_manager IF NOT #%1#==#_call# GOTO call_manager_end SHIFT SHIFT GOTO %0 :call_manager_end REM * Основное тело командного файла * :main rem пример вызова функции print_file_name FOR %%A IN (*.*) DO CALL %0 _call print_file_name "%%A" FIND/FINDSTR Поиск двоичных данных (текстовых строк) в группе файлов. Своеобразный аналог <ALT-F7> в FAR'е. Основное оружие взломщика для поиска интересных документов на сервере.
TIME Задает текущее системное время, не требуя прав администратора, что делает ее самой деструктивной командной из всех представленных. Представь, что произойдет с документооборотом и базой данных, если время окажется скачкообразно переведено на несколько лет вперед! |