1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.

Как внедрить код в exe-файл (Перевод статьи Iman Karim)

  1. Название: Как внедрить код в exe-файл
    Автор: Iman Karim
    Мыло: [email protected]
    Страница: http://www2.inf.fh-bonn-rhein-sieg.de/~ikarim2s/

    *** ВСЕ НАПИСАННОЕ ИСПОЛЬЗОВАТЬ ТОЛЬКО В ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЯХ! ***

    -Инструментарий-
    OLLYDBG
    Приложение, в которое будем вставлять свой код.
    Это будет NOTEPAD.EXE.
    Желательно сделать копию файла.
    Это все ;)

    -Начало-
    Наша цель - вклеить свой код в Notepad.EXE .
    Мы вклеим простой MessageBox на запуск Блокнота.
    Запустим Блокнот, и убедимся, что он запускается нормально.

    [​IMG]


    Если ты уверен, что это оригинальный Notepad.exe, открой его в Olly.
    Появится следующее окошко:

    [​IMG]

    Для того, чтобы вставлять свой код, нам нужно место для этого в коде программы.
    В ехе-файлах бывает много CodeCaves. Это байты (DB 00).
    Тебе нужно просто прокрутить код программы немного ниже начала, и ты узришь CodeCave:

    [​IMG]

    Красным прямоугольником выделен кусок с CodeCave'ами? ;)
    Сюда ты можешь вставить любой код, и твоя программа не будет вылелать.
    Если ты знаешь API-функцию для вызова MessageBox просто пропусти эти строчки.

    Это все, что нужно знать о MessageBox.
    Давайте же сделаем что-нибудь с помощью CodeCaves.
    Для того, чтобы использовать MessageBox, нам нужно создать текст, который мы будем выводить в
    MessageBox. На следующей картинке я выделил пару строк с CodeCaves и
    показал меню BinaryEdit для тебя (оно нам пригодится).

    [​IMG]

    Если ты нажал Binary=>Edit или (CTRL+E) ты увидишь следующее окно.
    Просто заполни верхнее поле так же, как и я.

    [​IMG]

    Нажми OK, и ты увидишь модифицированный код (выделен красным):

    [​IMG]

    Нажми теперь CTRL+A, чтобы переанализировать код.

    [​IMG]

    OK! Теперь, если ты хочешь сделать заголовок сообщения другим, продублируй эту строчку
    (это как второй параметр вызова процедуры).

    -Немного ассемблера-

    Пришло время и для ASMа ;)
    Вот хороший пример!
    Эти строчки, введенные в Олли будут выглядеть так:
    [​IMG]

    Видишь стрелку?! ЭТО ОЧЕНЬ ВАЖНО!
    Ведь если мы просто запустим программу, то ничего не произойдет. Почему?
    Потому что наша маленькая процедура еще нигде не вызывается!
    Нужно выписать адрес ее начала, т.е. адрес "PUSH 0", т.к. нам нужно сделать прыжок
    на нашу процедуру и вернуться назад ;)
    Отлично. Теперь вернись на начало программы (кнопка С на панели инструментов Олли, либо как на рисунке).
    [​IMG]

    Теперь мы на самой первой строчке, которая будет выполняться.
    Вы же еще помните, что наша цель - вставка своего кода? :)
    Тогда мы продолжим!
    Выделите пару строк с начала и скопируйте их в буфер обмена.

    [​IMG]

    Вставьте их в любой текстовый реактор - они нам еще пригодятся.
    Снова вернись на начало программы.
    (На картинке выше это PUSH 70).
    Двойной щелчок по этой строке отобразит нам следующее окно.
    В него нужно ввести "JMP <адрес PUSH 0, который мы записывали ранее>"

    [​IMG]

    Нажми кнопку Assemble и код программы снова изменится, т.е. изменения выделятся красным.
    [​IMG]

    Посмотри на красный прямоугольник! На этот адрес нам нужно перепрыгнуть по завершении нашего кода.
    Но если мы перепрыгнем сюда после инъекции, программа выполнится будто бы без нее :)
    Поэтому есть еще одна штука, которую нужно сделать!
    Сравни новое начало программы со старым, что мы копировали в текстовый редактор.
    Ты увидишь, что две строчки переписались! Но нам нужны они для нормальной работы
    программы без ошибок. Найди строки, которые перезаписались.
    В моем случае это был следующий код:
    Щелкни по первой строчке кода (наш JMP) и нажми ENTER.
    Ты попадешь на вставленный код вызова MessageBox!
    После CALL MessageBoxA нам нужно будет вставить эти две строчки И прыгнуть назад!

    [​IMG]

    ВОТ И ВСЕ!
    (Проверить, правильно ли работает прыжок легко - Нажать на нем ENTER!)
    Чтобы сохранить наш "модифицированный" Блокнот, выполни действия как на картинке:

    [​IMG]

    Затем нажми Copy All. В появившемся окне нужно нажать правой кнопкой мыши,
    выбрать пункт меню Save File и сохранить под новым именем. Запустите файл:

    [​IMG]

    По нажатию ОК запустится Блокнот ;)

    -Напоследок-
    НЕ НАПРЯГАЙТЕ дебаггер вставкой шеллов, и прочего зловредного кода!

    Автор: Iman Karim.
    Перевод статьи: Владимир Мефисто


    ЗАМЕЧАНИЕ К СТАТЬЕ ОТ Dr. MefistO

     
    4 пользователям это понравилось.
  2. KaeraK
    CALL MessageBoxA - не правильно.
    цитата с wasm.ru
    ...соответственно програмулина не запустится.

    Правильнее будет сделать вызов через таблицу импорта.
    [​IMG]
    В моем случае CALL 40122C
     
    1 человеку нравится это.
  3. Спасибо!

    Но тогда представь вирус, который прописывает в ехешник вызов мессыджа. Как ему прочитать адрес процедуры в таблице импорта? При том ехешник может быть любым случайным.
     
  4. KaeraK
    Сейчас вот начал более подробно рассматривать "тему" с таблицами импорта, функциями, и пр., через пару часов неудачной практики с добавлением функции в ТИ, возник вопрос:
    Вот предположим у нас есть EXE, и мне требуется "добавить" к нему MessageBoxA, НО, в USER32 функции MessageBoxA, в данной программе - нету => решение: эту функцию нужно импортировать. Как?: IIDKing, lordPE, StudPE ("ImportTable"), ImpREC и пр., в общем ничего не получается.. подобный метод, читал в статье Модификация исполняемых PE-файлов, но функция не вызывается.. как правильно такое реализовать? Не со стороны "заражения" вирусом, а просто, модификация ВРУЧНУЮ.
    Буду очень признателен за подсказку :)
     
  5. Hex0rez0n,
    CFF Explorer может внедрять процедуры в таблицу импорта приложения.
    В разделе Import Adder можно добавить свою процедуру нажатием всего пары кнопок.

     
    1 человеку нравится это.
  6. Кстати, классный метод. Нужно будет попробовать написать автоматический вставляльщик процедуры в импорт, и вызов ее. Это будет проба первого своего вируса)