Руководство по написанию вирусов
Вирусно ориентировачное руководство по написанию VxD
Это руководство дает только первоначальное ознакомление с программированием
VxD. Чтобы полностью получить представление о предмете разговора, вам нужно
нечто большее чем просто этот файл.
Что такое VxD?
--------------
Ну что-ж, начнем с того, что нам в нем интересно... VxD это 32-битный кусок
кода, который выполняется в защищенном режиме с привилегиями Кольца0 (ring0).
Все это сделано потому,что они имеют дело с системными ресурсами (такими как
драйверы железа и инсталлированные прогаммы). Я надеюсь, что с этого момента,
не остается сомнений в том, что именно нам в этом интересно? Написание VxD,
контролирующего программы (конечно-же!). Для достижения этого мы рассмотрим то
место в ОС, где мы можем нанести наибольший ущерб - файловую систему.
С чего начать?
--------------
Перед началом, вы должны заполучить несколько утилит. Эти программы доступны в
Микрософт Девелопмент Нетворк (MSDN) и в нескольких других местах. Они вам
точно понадобятся, если вы интересуетесь написанием VxD.
- Microsoft Macro Assembler (я использую 6.11c).
- Linear-Executable Linker (я использую 1.00.058).
- ADDHDR.EXE и MAPSYM32.EXE из Microsoft SDK
Так как первые вирусы для Win98, написанные как VxD, уже начали бродить
вокруг, я обнаружил что больше количество народа ищет .INC файлы, которые
необходимы для компиляции всего этого дела. Вам будут нужны следующие файлы
из SDK:
- VMM.INC : в этом файле вы найдете макросы и определения сервисов VMM
- DEBUG.INC : только если вам нужна отладка
- SHELL.INC : этот файл определяет сервисы, которые дают доступ ко многим
функциям Windoze, таким как MessageBox.
- IFS.INC и
- IFSMGR.INC: интересны вамЁ только если вы хотите потрахаться с файловой
системой Windows95.
Ссылки на все эти inc-файлы должны стоять в исходнике между директивами .xlist
и .list
Написание VxD
-------------
Написание VxD - будет делом несравнимо легким, если мы возьмем обобщенный
пример, и будем добавлять наш код там, где нам надо. Давайте разобьем нашу
работу на несколько стадий. Так мы сможем инсталлировать и тестировать вирус,
как только закончим работу с очередным куском.
Сперва начнем с обобщенного VxD - который содержит сегмент, VxD и определения
контрольных процессов. Позднее добавим процедуру инициализации в real-mode,
которая (как мы увидим) будет всем известной проверкой на резидентую копию.
Затем добавим инициализацию VxD и перехват обращений к файлам. И, под конец -
допишем все остальные процедуры VxD.
Сегменты VxD
------------
Внутри VxD мы можем найти пять разных типов серментов. Каждый из них имеет
свои собственные характеристики. Для того, чтобы обьявить эти сегменты мы
можем использовать следующий макрос:
- VxD_CODE_SEG и VxD_CODE_ENDS: еще зовется _LTEXT, - кодовый сегмент
защищенного режима. Обьявление этого сегмента обязательно.
- VxD_DATA_SEG и VxD_DATA_ENDS: так же зовется _LDATA, определяет
сегмент данных для глобального использования в VxD. Его так-же
нужно обьявлять.
- VxD_ICODE_SEG и VxD_ICODE_ENDS: еще зовется _ITEXT. Эти два макроса
определяют начало и конец сегмента инициализации в прот-моде. Этот
сегмент необязателен и освобождается, как только инициализация
завершена (после получения сообщения Init_Complete).
- VxD_IDATA_SEG и VxD_IDATA_ENDS: еще зовется _IDATA, здесь мы можем
хранить все необходимые для инициализации данные, которые будут
отброшены как только мы получим сообщение Init_Complete. Использование
этого сегмента необязательно.
- VxD_REAL_INIT_SEG и VxD_REAL_INIT_ENDS: необязательный сегмент, который
имеет так-же имя _RTEXT, содержит процедуру, которую Менеджер Виртуальной
Машины (VMM - Virtual Machine Manager) будет вызывать перед загрузкой
всех остальных частей VxD. Этот сегмент освобождается как только
процедура произведет возврат управления.
Все эти сегменты, за исключением _RTEXT (инициализации в реальном режиме) -
сегменты защищенного режима с flat моделью памяти. Это означаетЁ что все
смещения - 32-битные и нам надо использовать макрос "offset32" везде, где
мы раньше писали "offset". Теперь CS, DS, ES и SS не могут изменяться, но
вместо них мы можем использовать FS и GS.
Обьявление VxD
--------------
Для того, чтобы обьявить наш VxD мы будем юзать следующий макрос:
Declare_Virtual_Device имя, старшая версия, младшая версия, контольная
процедура, ID устройства, порядок инициализации, обработчик V86 API,
обработчик прот-модного API
Ебится седце перестало.. На первый взгляд это выглядит страшновато, но
позвольте мне написать пример, который изменит это первое впечатление. Мы
обьявим VxD с именем ViRuS, который будет версией 1.0 нашего вируса.
Declare_Virtual_Device ViRuS,1,0,VxD_Control,Undefined_Device_ID,,,
Как видите, я не испрользовал последние параметры, потому как нам (пока?) не
интересно предоставлять API для других программ, или использовать
Читать далее...