Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #48, НОЯБРЬ 2004 г.

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

Задает текущее системное время, не требуя прав администратора, что делает ее самой деструктивной командной из всех представленных. Представь, что произойдет с документооборотом и базой данных, если время окажется скачкообразно переведено на несколько лет вперед!

Назад на стр. 048-016-4  Содержание  Вперед на стр. 048-016-6