V. Операция
Снова открываем наш файл в Оле.

Поднимаемся наверх (до конца – на две строчки

) Жмём пробел, находясь на самой первой строчке, и пишем
. Узнаёте? Да-да, это та самая исходная
EntryPoint, вернее (
EntryPoint + ImageBase) (далее
OEP), где
ImageBase тоже можно посмотреть в PE-заголовке, но вообще-то он всегда равен
400000h =) . Вот этот далёкий прыжок и съел первые 5 байт секции. Можно это сделать и в конце, конечно, но легче сразу записать сюда прыжок на
OEP, а потом уже не задумываться и после выполнения кода прыгать в начало секции, а не где-то записанное число… Проверим – работает ли программа? Для этого из
EP – то место, где сейчас остановлена программа, прыгаем на
OEP, то есть в начало секции (чтобы попасть на место, где сейчас остановлена программа, можно нажать правую кнопку ->
Go to ->
Origin или просто “
*” на NumPad’е. И вообще, она выделена синим цветом. Ладно, не буду больше ничего рассказывать про Олю, ибо и так много всего написано. Хотя бы справка...). Пишем в
EP:
. Повторяю: щёлкаем на строчке, нажимаем пробел, пишем команду, нажимаем “Enter”.
Запускаем программу (F9). Она работает!!! Закрываем форму, а в Оле – “
Ctrl+F2”: перезагружаем (нет, не компьютер =) ) программу. А! Наш прыжок на
OEP пропал! Ну ладно, восстановим его (либо вводим заново, либо, так как Оля сохраняет изменения в файле, то открываем Patches:
Выделяем первый и единственный пункт и нажимаем пробел – всё вернулось =) ).
А теперь начинаем кодить! Пустой прыжок сразу на
OEP, сделанный для проверки, нам уже не нужен, поэтому начинаем писать поверх него. Пытаемся создать файл с помощью
CreateFileA: параметры мы, разумеется, не помним, поэтому пишем несколько раз
, а потом
. А теперь то, ради чего мы меняли
BaseOfCode: жмём “
Ctrl-A”, и Оля анализирует наш код. Если бы мы
BaseOfCode не трогали, то и Оля бы отказалась анализировать нашу секцию.
Вот справа указаны все параметры. Нам нужны только
mode, access и filename, остальное для примера не важно. Идём куда-нибудь вниз, например на
461000, и, нажав (Ctrl+E), записываем туда
“a.txt” и 0-символ, означающий конец строки:
«ОК»… Если у вас вместо “a.txt” появились какие-то жуткие команды, то выделяем их, нажимаем
правую кнопку->Analysis->During next analysis…->ASCII text; Ctrl+A. Вот, так лучше:
Запоминаем адрес
461000, и идём наверх, и записываем поверх того что там есть (и, когда не жалко, нажимаем
ctrl+A):
Кстати, можно писать выражения типа “
push CREATE_ALWAYS” и “
push GENERIC_WRITE” – Оля их понимает. Далее по
F8 доходим до
46001E. В EAX – число, не равное FFFFFFFF, то есть функция успешно выполнена. В EAX –
handle открытого файла. Всё, закрываем его (CloseHandle) -пока на этом остановимся – и прыгаем на
OEP:
Трассируем по F8 до прыжка: eax = 1. Всё работает. А сейчас, давайте сохраним изменения в exe’шнике. Выделяем всё изменённое (это делается так же, как и в любом текстовом редакторе – с помощью Shift и стрелок или мышки), не забывая про 461000 с “a.txt”. А точно! Мы же не влезем в размер секции в файле! Слишком далеко мы поставили “a.txt”! Ладно, перенесём его на чуть пораньше: на
460600, а там удалим (или аналогично через “
Patches”, или выделяем,
правая кнопка -> Binary -> Fill with 00’s) и поправим код (
выделяем команду push 461000 -> пробел -> push 460600).
Снова выделяем всё изменённое. Далее: либо [
правая кнопка -> Copy to executable -> Selection], либо [
правая кнопка -> binary -> copy; правая кнопка -> view -> executable file; откроется окошко с выделенным текстом; в нём: правая кнопка -> binary -> paste]. Тем самым мы заменили оригинальные байты в файле на то, что мы написали. Закрываем окошко, Оля нам предлагает сохраниться – сохраняемся, например в
target_.exe. Так, у нас в папке уже есть какой-то a.txt. Удаляем его и запускаем программу. Вау! Она запускается, работает, и… даже файл создаётся!