| Welcome to The Passion Of Code Laboratory!!! | Статьи |
Внедрение в PE-HeaderАвтор: Bill Prisoner / TPOC Что нужно чтобы это сделатьЗнания:1) Язык ассемблера для процессоров Intel 3) Описание некоторых механизмов при программировании под win32. Например механизмы работы экземпляра обьекта FileMappingObject. Это можно взять в работе Iczelion’а Win32 API на сайте www.wasm.ru
Программы:1) HexWorkShop
REspeCTSars/HI-TECH - за пищу для размышлений IntroКак вы знаете PE является основным форматом исполняемых файлов в Win32 платформах. В этой статье объясняется как вставить свой код в исполняемый файл формата PE и сохранить работоспособность последнего. Делать всё будем руками, а код написать при желании не составит проблем. Попутно мы познакомимся с некоторыми тонкостями формата PE. Поехали… Структуры HexWorkShopДавайте для начала откроем файл PE формата что бы внедрить в него зараженную материю. HexWorkShop прекрасно подходит для этого, обладая при этом очень удобной возможностью называемой StructureViewer. Проще говоря эта фича позволяет просматривать предопределённые структуры в двоичном файле. К примеру мы указываем в файле начало PE-заголовка. Если у вас есть шаблон структуры PE, то вы можете просматривать отдельные поля, например IMAGE_FILE_HEADER.Machine. Это довольно удобно и можно не считать смещения. Синтаксис почти такой же как в Си. В следующих версиях девелоперы обещают синтаксис структур эквивалентный Си. Структуры для наших экспериментов берем из winnt.h. Готовый шаблон(*.hsl(HexWorkShop Structure List)) для структуры можно слить отсюда. Внедрение в заголовок. What Is?Сейчас необходимо немного отвлечься и обьяснить суть метода заражения.
Потрошим notepad.exeЗдесь также следует рассказать о проекции файла(mapping) PE EXE в память. Загрузчик делает мэппинг не сразу всего файла, а по частям, т.е. весь заголовок от DOS MZ до конца PE- хидера мэпируется без выравнивания. Так если IMAGE_BASE ЕСТЬ 1000000h то байтики “MZ”(да, да “ZM”!) начнуться именно с 1000000h Если мы внедрили что-то в заголовок, то эти байты будут после заголовков в памяти. Секции же проецируются по параметру SectionAlignment. Т.о. в нашем подопытном Notepad.exe секция .text будет распологаться в памяти по адресу кратному SectionAlignment, а именно 1000h. Т.о. PE EXE файл мэпируется не сразу весь, а по частям - структуры отдельно, секции отдельно. И вот теперь пришло время осуществить вашу давнюю мечту – заразить этот мерзкий notepad.exe(написать свой на Wасме), а вместе с ним и все программы (VX - рулит).
Не забывайте что адрес записывает в соответствии с принципом «младший байт по младшему адресу».
Если прыгаем вверх, то формула будет такая –
Мы вычитаем 5 в формуле (1), потому что это размер машинной команды jmp короткого перехода(в win32 плоская модель!), а если мы прыгаем вверх, то размер jmp – не учитывается. Где непосредственный операнд – есть смещение в текущем сегменте кода(из ДОС терминологии) относительно следующей за jmp команды. Смещение знаковое 32-х разрядное.
AddressOfEntryPoint делаем таким же как и offset начала наших инструкций в файле, т.к. заголовок мэпируется без выравнивания. Сохранияем всё наше творение в файл notepad.exe и радуемся! Мы заразили вручную notepad.exe! Но не тут то было. Проверим его Dr. Web’ом он ругает этот файл как подозрение на WIN.EXE вирус. Убираем указатель на заголовок в AddressOfEntryPointВсе антивирусы считают PE файлы с AddressOfEntryPoint на заголовке подозрительными. Это и понятно. Давайте попробуем этого избежать. Вы можете испугаться того что будет дальше, но не бойтесь, если вы не будете спешить – вы всё поймёте. Если что-то не будет понятно скидывайте вопросы мне на e-mail указанный в конце статьи.
Ну что уловили суть? Если нет, то читайте дальше. У нас есть точка входа в программу – AddressOfEntryPoint. Инструкции для выполнения процессор берёт с этого RVA. Вместо одной из инструкций мы должны вставить команду перехода – jmp на наш кусок кода в заголовке. Процессор после перехода начинает выполнять инструкции вируса. Байты затёртые jmp мы должны сохранить. В данном случае это байты, но просто байты. Они есть инструкции(я) процессору. Instr_From(AddressOfEntryPoint) – это как раз наши затёртые инструкции командой jmp. Чтобы вычислить адреса для команды jmp пользуйтелсь формулами (1) и (2). Затирать надо так чтобы исходная последовательность команд в программе сохранялась, т.е. EIP оставался прежним при возрате из заголовка. Как раз для этого может пригодиться команда nop c опкодом - 90h. Всё что она делает – это увеличивает EIP на единичку. Самое интересное – это как раз и подбирать инструкции по размеру – здесь можно пофантазировать. Можно например использовать связки – inc x;dec x; или что-нибудь в этом духе. При написании кода может возникнуть проблема – как найти начало новой инструкции, для замены нашей инструкцией перехода? Здесь надо делать так: Ищем в коде определённые байты. Первый байт – это код операции. Код операции нужно выбрать такой чтобы по длине искомая инструкция была не меньше нашего джампа. И так как в системе команд процессора с архитектурой IA-32 у каждого сочетания операндов свой опкод, это реально найти. Но может случиться так что мы не сможем найти подходящую для замены инструкцию, тогда такой файл этим методом не заразить. Вот как раз и последнего предложения не придерживаются довольно распростанённые вирусы и «заражают» такие файлы. В итоге PE EXE перестаёт работать. Такие ошибки просто не допустимы для современных вирусных атак! ЗаключениеВ этой статье был рассмотрен один из методов заражения PE EXE файла. Мы добились также чтобы антивирус не замечал факт заражения. Исходный блокнот можно слить отсюда(WinXP). Патченный отсюда. Но тот факт что свободного места не очень много(хотя как посмотреть) ограничивает использование этого метода. Этого хороший способ внедрить загрузчик основного тела вируса. Думаю с кодом вы справитесь сами. А кто не справиться не отчайивайтесь. Возмите какую-нибудь хорошую книжку по асму, зайдите на www.wasm.ru и вперед покорять вершины низкоуровневого программирования. Для отзывов о статье и ваших вопросов мой e-mail – bill_tpoc@mail.ru. Если возникнет какой-нибудь вопрос – пишите, обязательно получите ответ. [C] Bill Prisoner / TPOC | Наши новостиНовые события из жизни нашей лаборатории СтатьиСтатьи и переводы лаборатории TPOC ПрограммыПрограммы лаборатории TPOC РелизыЗдесь мы сообщаем Вам, какие творения скоро появятся СсылкиСсылки на сайты, где можно найти больше информации Наша лабораторияИстория нашей лаборатории и ее члены |
| У вас есть предложения по нашему сайту? Напишите сюда | Любимые сайты вирмейкеров: (WASM) (RSDN) |