Welcome to The Passion Of Code Laboratory!!!Статьи

Внедрение в PE-Header

Автор: Bill Prisoner / TPOC

Что нужно чтобы это сделать

Знания:

1) Язык ассемблера для процессоров Intel

2) Описание формата PE. Безусловно лучшим описанием является глава из книги Мэта Питрека «Секреты системного программирования для Windows 95». Скачать это можно с http://www.rsdn.ru

3) Описание некоторых механизмов при программировании под win32. Например механизмы работы экземпляра обьекта FileMappingObject. Это можно взять в работе Iczelion’а Win32 API на сайте www.wasm.ru


Вы должны непременно знать поля структур PE заголовка по их именам, потому что в статье я буду ссылаться к ним без предварительного обьяснения. Изложение материала ведется достаточно кратко. Если вы хотите понять этот метод заражения, то наиболее эффективным способом будет просматривать структуры файла и делать выводы вместе с этой статьёй. Также вам поможет отладчик, гле вы можете посмотреть как мэппируется PE файл, а также ваши машииные инструкции(см. далее).

Программы:

1) HexWorkShop


2) Turbo Debugger 32

REspeCT

Sars/HI-TECH - за пищу для размышлений

DayDream – за всё.

Intro

Как вы знаете PE является основным форматом исполняемых файлов в Win32 платформах. В этой статье объясняется как вставить свой код в исполняемый файл формата PE и сохранить работоспособность последнего. Делать всё будем руками, а код написать при желании не составит проблем. Попутно мы познакомимся с некоторыми тонкостями формата PE. Поехали…

Структуры HexWorkShop

Давайте для начала откроем файл PE формата что бы внедрить в него зараженную материю. HexWorkShop прекрасно подходит для этого, обладая при этом очень удобной возможностью называемой StructureViewer. Проще говоря эта фича позволяет просматривать предопределённые структуры в двоичном файле. К примеру мы указываем в файле начало PE-заголовка. Если у вас есть шаблон структуры PE, то вы можете просматривать отдельные поля, например IMAGE_FILE_HEADER.Machine. Это довольно удобно и можно не считать смещения. Синтаксис почти такой же как в Си. В следующих версиях девелоперы обещают синтаксис структур эквивалентный Си. Структуры для наших экспериментов берем из winnt.h. Готовый шаблон(*.hsl(HexWorkShop Structure List)) для структуры можно слить отсюда.

Внедрение в заголовок. What Is?

Сейчас необходимо немного отвлечься и обьяснить суть метода заражения.

В файле формата PE по порядку идут следующие структуры

DOS-MZ

DOS-STUB

PE-HEADER

SectionTable

Section1

Section2

….

Section N












 


Cоль вот в чем – между SectionTable и первой секцией всегда остается свободное место, это связано с выравниваем секций в файле(параметр FileAlignment). Туда мы можем внедрить свой код. Что бы это понять лучше - в HexWorkShop смотрим где начинается первая секция, а перед этим нули – это и есть вещь без иммунитета. Иногда в файле может встретиться таблица bound импорта после SectionTable. Мы можем записывать свой код либо от конца таблицы секций, либо от конца таблицы bound импорта. Есть ли bount-импорт или нет мы можем узнать из массива IMAGE_DATA_DIRECTORY. Он идёт 11-м элементом в массиве. Если RVA и Size равны нулю, то bound-импорта нет. Более подробно об этом и других методах заражения читайте в статье “Основные методы заражения PE EXE” by Sars/HI-TECH откуда и пошло моё творение.

Потрошим 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 - рулит).

В заголовок я пишу просто команду перехода на нормальную точку входа, но вы можете написать любые инструкции, например загрузить какой-нибудь другой модуль. Что бы вызывать API функции нам надо знать их адреса в памяти. Это можно сделать разными способами. Например искать адреса в таблице экспорта kernel.

Подробно об этом можно почитать в «Путеводителе по написанию вирусов для win32” by Billy Belcebu(привет Испания!). Важно понять что в заголовок вы будете внедрять машинной код, так что обзаведитесь OPкодами команд от Intel или ещё где-нибудь.

Опкод команды перехода(относительный near переход с 32 разрядным смещением):

E9 адреc

Не забывайте что адрес записывает в соответствии с принципом «младший байт по младшему адресу».

Вот формула для вычисления адреса для jmp вниз:

AddressOfEntryPoint-offset(смещение в файле команды jmp)-5.             (1)

Если прыгаем вверх, то формула будет такая –

offset(смещение в файле начала наших инструкций)-X                                       (2),
где X – RVA следующей за jmp инструкции.

Мы вычитаем 5 в формуле (1), потому что это размер машинной команды jmp короткого перехода(в win32 плоская модель!), а если мы прыгаем вверх, то размер jmp – не учитывается. Где непосредственный операнд – есть смещение в текущем сегменте кода(из ДОС терминологии) относительно следующей за jmp команды. Смещение знаковое 32-х разрядное.
По этой формуле адрес=6ae0h-3fah-5=66e1h
Переворачиваем теперь это значение, получается e1660000. В итоге опкод – e9e1660000.
Далее меняем AddressOfEntryPoint. В этом параметре распологается RVA(Relative Virtual Address). Я надеюсь вам не надо обьяснять что такое RVA, для всех кто не знает – выполните это:

jmp $+offset(spisok_literaturi)

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 перестаёт работать. Такие ошибки просто не допустимы для современных вирусных атак!

Вы наверно заметили, что на схеме jmp ставиться как раз по адресу AddressOfEntryPoint, но это как вы понимаете не обязательно, самое главное управление передалось коду вируса. Новый notepad.exe готов. Проверяем наш новый файлик Dr. Web’ом – всё чисто!

Заключение

В этой статье был рассмотрен один из методов заражения PE EXE файла. Мы добились также чтобы антивирус не замечал факт заражения. Исходный блокнот можно слить отсюда(WinXP). Патченный отсюда. Но тот факт что свободного места не очень много(хотя как посмотреть) ограничивает использование этого метода. Этого хороший способ внедрить загрузчик основного тела вируса. Думаю с кодом вы справитесь сами. А кто не справиться не отчайивайтесь. Возмите какую-нибудь хорошую книжку по асму, зайдите на www.wasm.ru и вперед покорять вершины низкоуровневого программирования. Для отзывов о статье и ваших вопросов мой e-mail – bill_tpoc@mail.ru. Если возникнет какой-нибудь вопрос – пишите, обязательно получите ответ.
 

[C] Bill Prisoner / TPOC

Наши новости

Новые события из жизни нашей лаборатории

Статьи

Статьи и переводы лаборатории TPOC

Программы

Программы лаборатории TPOC

Релизы

Здесь мы сообщаем Вам, какие творения скоро появятся

Ссылки

Ссылки на сайты, где можно найти больше информации

Наша лаборатория

История нашей лаборатории и ее члены

Дата последнего обновления: 25 июля 2005 года
У вас есть предложения по нашему сайту?
Напишите сюда
Любимые сайты вирмейкеров:
(WASM)   (RSDN)