Внедрение дополнительного кода в исполняемый файл

Содержание

Слайд 2

Требуемый инструментарий

ОТЛАДЧИК ИСПОЛНЯЕМОГО КОДА
OLLY DEBUGGER

РЕДАКТОР ЗАГОЛОВКА ИСПОЛНЯЕМОГО ФАЙЛА ФОРМАТА PE
LORD PE, PE

Требуемый инструментарий ОТЛАДЧИК ИСПОЛНЯЕМОГО КОДА OLLY DEBUGGER РЕДАКТОР ЗАГОЛОВКА ИСПОЛНЯЕМОГО ФАЙЛА ФОРМАТА
TOOLS И ДР.

ШЕСТНАДЦАТИРИЧНЫЙ РЕДАКТОР
FLEX HEX, WIN HEX И ДР.

ОБЪЕКТ ВОЗДЕЙСТВИЯ
ИСПОЛНЯЕМЫЙ ФАЙЛ

Слайд 3

Алгоритм действий

Создаем проект в среде программирования с пустой графической формой.
Внедряем свой код

Алгоритм действий Создаем проект в среде программирования с пустой графической формой. Внедряем
в созданный проект. Код должен исполняться при запуске графического пользовательского приложения (пустая форма).

Слайд 4

Варианты внедрения кода

Открытие созданного приложения в Olly Debugger.

Варианты внедрения кода Открытие созданного приложения в Olly Debugger.

Слайд 5

Варианты внедрения кода

Запись кода в память процесса.
Запись кода в новую секцию (данных

Варианты внедрения кода Запись кода в память процесса. Запись кода в новую
или кода), которая создается дополнительно.

Обоснование:
Места в существующей секции кода мало (RawSize – размер в исполняемом файле), а размер процесса в памяти гораздо больше (VirtualSize) => VirtualSize >> RawSize.

Слайд 6

Открываем модифицируемый файл в Lord PE или PE tools.

Открываем модифицируемый файл в Lord PE или PE tools.

Слайд 7

2. Открываем раздел Section.

2. Открываем раздел Section.

Слайд 8

3. Добавляем заголовок секции (Section).

3. Добавляем заголовок секции (Section).

Слайд 9

4. Редактируем заголовок секции (Section).

В поле Name вводим какое-нибудь название секции, например

4. Редактируем заголовок секции (Section). В поле Name вводим какое-нибудь название секции,
“.code”;
Поля VirtualAddress и RawOffset не трогаем – это адреса секции в памяти и в файле соответственно, вычисляются как
VirtualAddress = ((VirtualAddress(предыдущая секция) + VirtualSize(предыдущая секция) – 1) div VirtualAlign) + 1) * VirtualAlign;
RawOffset = ((VirtualAddress(предыдущая секция) + VirtualSize(предыдущая секция) – 1) div FileAlign) + 1) * FileAlign;
Их LordPE считает автоматом, и менять их не надо!

Слайд 10

Расчитываем поля VirtualSize и RawSize
RawSize - размер секции в файле = 1000

Расчитываем поля VirtualSize и RawSize RawSize - размер секции в файле =
(4кб – достаточно для нашего кода).
VirtualSize - размер секции в памяти = 4000 (16кб – писать в память не только код, но и данные, чтобы не создавать новую секцию).

4. Редактируем заголовок секции (Section).

Слайд 11

5. Редактируем флаги секции. Нажимаем на кнопку рядом с полем Flags:

Отмечаем (ставим

5. Редактируем флаги секции. Нажимаем на кнопку рядом с полем Flags: Отмечаем
галочку):
Что-то в секции можно выполнять
Из неё можно читать
В неё можно писать
В ней есть код
В ней есть инициализированные данные
В ней есть неинициализированные данные

Слайд 12

6. Запомнить и записать значения VirtualOffset (RVA) и RawOffset, EntryPoint, BaseOfCode

7. Пишем

6. Запомнить и записать значения VirtualOffset (RVA) и RawOffset, EntryPoint, BaseOfCode 7.
вместо BaseOfCode значение RVA и вместо EntryPoint значение RVA нашей секции + 5.

Слайд 13

8. Нажимаем Save и «OK». Запускаем файл. Он не запускается…
Секцию объявили, а

8. Нажимаем Save и «OK». Запускаем файл. Он не запускается… Секцию объявили,
записать – не записали!

9. Открываем файл во FlexHex и переходим в самый конец файла. Теперь ищем то место, где будет новая секция. А она начинается с запомненного нами RawOffset (назовём его Raw = 59E00).
Если последний существующий байт файла имеет адрес, отличный от (Raw-1), то забиваем нулями всё место от конца файла до этого числа (Щёлкаем после последнего байта в файле, далее Edit->Insert Zero Block; Block Size = Raw - адрес последнего байта - 1.
Иначе щёлкаем на пустой квадратик по адресу Raw, далее Edit->Insert Zero Block; Block Size = размер нашей секции, RawSize, то есть 1000h.