Как внедрить свой код в программу

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Необходимо обновить браузер или попробовать использовать другой.

Внедрение кода в ехе-файл в конец секции c добавлением API-функций. Часть 6

Дата публикации 5 апр 2019 | Редактировалось 17 май 2019

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

Python в .EXE ► КАК?

Затем откомпилировать такую программу, а потом открыть ее ехе-файл в отладчике и проанализировать их использование. После чего можно приступать и к внедрению своей программы в чужой код. В учебных целях в качестве чужой программы тоже будет применяться написанная нами программа.
При использовании отладчика x64Dbg нет необходимости вызывать, затем анализировать таблицу импорта адресов внедряемых функций, и вставлять эти адреса вместо названий функций, что сильно упрощает алгоритм внедрения.

Внедрение кода с добавлением API-функций
Предположим, что существует программа, написанная в среде masm64с использованием команд SSE, которая вычисляет математическое уравнение. В эту программу необходимо внедрить свое сообщение функцией MessageBoxбез изменения функционала. Внедрение кода с изменением функционала было выполнено в предыдущей главе.
Рассмотрим основную программу (программа 5.1), в которую внедрим функцию MessageBoxс соответствующим сообщением.

Программа 5.1.Числа a,b,c,d> заданные массивом и имеют размерность Real8. Вычислить уравнение d/bsqrt(a) + a

title Рысованый А . Н .
; masm64. Числа заданные массивом
; и имеют размерность Real8. Вычислить уравнение d/b sqrt(a) + a
include win64a . inc ; подключаемые библиотеки
mas1 real8 16 ., 2 ., 4 ., 16 . ; a, b, c, d
tit1 db «masm64. Результат вычисления уравнения на SSE2» , 0
buf1 dq ? , 0 ; буфер вывода сообщения
ifmt db «masm64. Массив a, b, c, d := 16., 2., 4., 16.» , 10 , 10 ,
«Уравнение d/b sqrt(a) + a. Результат: %d » , 10 , 10 ,
9 , «Сайт: http://blogs.kpi.kharkov.ua/v2/asm/» , 0
. code ; уравнение d/b sqrt(a) + a
WinMain proc
sub rsp , 28h ; cтек: 28h=32d+8; 8 — возврат
mov rbp , rsp
movsd xmm1 , mas1 [ 0 ] ; xmm1 — a — переслать двойное слово
movsd xmm2 , mas1 [ 8 ] ; xmm2 — b
movsd xmm3 , mas1 [ 16 ] ; xmm3 — c
movsd xmm4 , mas1 [ 24 ] ; xmm3 — d
divsd xmm4 , xmm2 ; d/b
sqrtsd xmm5 , xmm1 ; sqrt(a)
mulsd xmm4 , xmm5 ; d/b x sqrt(a)
addsd xmm4 , xmm1 ; d/b x sqrt(a) + a
cvttsd2si eax , xmm4 ;
movsxd r15 , eax
invoke wsprintf , addr buf1 , addr ifmt , r15
invoke MessageBox , 0 , addr buf1 , addr tit1 , MB_ICONINFORMATION
invoke RtlExitUserProcess , 0
WinMain endp

Результатом выполнения программы является окно сообщения.

upload_2019-4-5_16-14-2.png

Определим объем в байтах свободного места в секции кода. Для этой цели воспользуемся программой-анализатором LotdPE. Выполним последовательность действий:
Определим объем в байтах свободного места в секции кода. Для этой цели воспользуемся программой-анализатором LotdPE. Выполним последовательность действий:

  • в программе нажать на клавишу меню PE Editor и выбрать исследуемый ехе-файл;
  • в появившемся окне нажать клавишу меню Sections;
  • выбрать секцию, где расположен текст программы (это секция text), нажать правую клавишу мышки и выбрать пункт меню hex edit section;
  • в появившемся окне memory buffer выбранная секция выделится темным цветом. В конце секции свободные ячейки будут заполнены нулями. Их необходимо просто посчитать.

upload_2019-4-5_16-14-24.png

Для подсчета количества байтов свободных ячеек памяти в секции кода необходимо из начального адреса следующей секции вычесть первую свободную ячейку после окончания кода:
600h – 477h = 188h = 393 байтов.
Для внедрения функции с ее параметрами необходимо точно знать, как эти параметры отображаются синтаксически в отладчике и применять их точно так же. В основной программе уже присутствует функция MessageBox. Поэтому, писать в качестве примера отдельную программу с этой функцией уже нет необходимости: будем использовать параметры этой функции в ехе-файле, анализировать и изменять их под собственные адреса ячеек памяти.
Открываем ехе-файл этой программы в отладчике x64Dbg. При анализе кода в отладчике x64Dbg сначала необходимо продумать свои действия: где удобнее поставить новую функцию MessageBoxи в какой последовательности она должна вывести окно сообщения.
Внешний вид основной программы представлен на рис.

Читайте также:
Программа попутчик на авто

Проанализируем программу в отладчике.
В нашем самом простом случае необходимо осуществить внедрение функции с ее параметрами в существующий код. Для этого надо в программе освободить место. Внедрить новую функцию MessageBox можно в начале программы, в середине или уже в самом конце. Алгоритм внедрения при выборе любого места не поменяется. Поменяется только последовательность вывода сообщений программой.
Выбираем для внедрения кода начало программы. Первые две команды перемещать нельзя, т.к они подготавливают программу к выполнению – выравнивают стек (при использовании среды masm64от Mikl___). Значит – меняем третью строчку. Необходимо перенести эту команду из третьей строчки на свободное место после окончания программы. Последней строкой программы является функция RtlExitUserProcess.
Затем на освободившееся место ставим команду jmp с адресом перехода на адрес расположения перенесенной команды.
После – вставляем параметры функции MessageBoxи вызов (команда call) этой функции.
Последней командой после вызова функции MessageBoxснова будет команда jmp, но с адресом возврата на нетронутую строчку кода после вставленной первой команды jmp в начале программы.

И так, команда jmpс адресом перехода имеет размерность 2 байта.
Перенесем третью строчку кода и тем самым освободим место под команду jmp. В третьей строчке программы находится команда, которая занимает 8 байт памяти:

00007FF7100F1007 F2:0F100D F11F0000 movsd xmm1,qword ptr ds:[7FF7100F3000]

Поэтому, перенесем эту команду в конец файла, а на ее место – команду jmpс адресом, который соответствует новому месту расположения после окончания программы. А оставшиеся байты заполним автоматически командами NOP.
После команды jmp вставляем функцию MessageBox, скопировав эту функцию в нашей же программе со старыми значениями параметров (теми же адресами ячеек):

Источник: wasm.in

Внедрить свой код в чужую программу!

img

team

Собственно,есть некоторые старые программы-давно заброшенные разработчиками и с закрытым сайтом и

могу ли я не просто поменять несколько команд ассемблера(что обычно делают «крэкеры») а внедрить свой код?FeelsOkayMan.png?1553740655

Написать свою dll’ку и в нужный момент вызывать её или добавить секцию и запихать туда весь свой код.

CoolCat.png?1553740558

Сработает ли это или нет?roflanPominki.png

P.S Давно об этом думал и незнал стоит ли создавать тему.FeelsBadMan.png

P.P.S Я пока не умею программировать а могу только поменять несколько команд ассемблера,так что вопрос теоретический(пока).

Но это крайне интересно и хотелось бы знать получится ли.pepecool.png

img

02 Oct 2019 в 14:36 #2

02 Oct 2019 в 14:38 #3

justsmile.png?1553740538

Ну так для начала тебе нужно научиться программировать на С/С++/С# или еще чтото, и создать свою dll.

А пока ты не умеешь, тебе эта тема бесполезна

02 Oct 2019 в 14:39 #4

без исходников оч сложно что-то большое внедрить

02 Oct 2019 в 14:41 #5

img

02 Oct 2019 в 15:04 #6

k4rj2 сказал(а):↑

justsmile.png?1553740538

Ну так для начала тебе нужно научиться программировать на С/С++/С# или еще чтото, и создать свою dll.

А пока ты не умеешь, тебе эта тема бесполезна

Нажмите, чтобы раскрыть.

CoolNut.png

Я примерно так это представляю:

1)Отслеживаю какие API использует приложение.

2)Нахожу тот который неправильно работает.

Читайте также:
Укажите ложное высказывание команды в программе отделяются друг

3). (что-то с ним делаю)

4)Пихаю где-то jmp к моему коду и jmp на возврат.

PepeCry.png

Вот со вторым,третьим вариантом проблема,я плохо представляю что искать и как.

02 Oct 2019 в 15:21 #7

KeksovName сказал(а):↑

Я примерно так это представляюCoolNut.png:

1)Отслеживаю какие API использует приложение.

2)Нахожу тот который неправильно работает.

3). (что-то с ним делаю)

4)Пихаю где-то jmp к моему коду и jmp на возврат.

4)Всё работает.

Вот со вторым,третьим вариантом проблема,я плохо представляю что искать и как.PepeCry.png

Нажмите, чтобы раскрыть.

Ну, в целом да. В конце файла пишешь код, который нужно тебе выполнить и где-либо заменяешь jmp или call (ну, все зависит от того что тебе надо) на нужный тебе.

02 Oct 2019 в 15:40 #8

KeksovName сказал(а):↑

Я примерно так это представляюCoolNut.png:

1)Отслеживаю какие API использует приложение.

2)Нахожу тот который неправильно работает.

3). (что-то с ним делаю)

4)Пихаю где-то jmp к моему коду и jmp на возврат.

4)Всё работает.

Вот со вторым,третьим вариантом проблема,я плохо представляю что искать и как.PepeCry.png

Нажмите, чтобы раскрыть.

хз что такое jmp, что значит отслеживаешь апи?

для начала вникни, что такое api)

02 Oct 2019 в 15:44 #9

k4rj2 сказал(а):↑

хз что такое jmp

Нажмите, чтобы раскрыть.

img

02 Oct 2019 в 15:44 #10

k4rj2 сказал(а):↑

хз что такое jmp, что значит отслеживаешь апи?

для начала вникни, что такое api)

Нажмите, чтобы раскрыть.

Так в чём я не прав,поконкретней?

PepeGlasses.png?1553628094

Есть мониторы API,показывают какое использует приложение.

02 Oct 2019 в 15:45 #11

Конечно можешь, или тебя беспокоят авторские права?

02 Oct 2019 в 16:01 #12

KeksovName сказал(а):↑

Я пока не умею программировать

Нажмите, чтобы раскрыть.

всё понятно. ответ нет. не можешь. ответ дан. Тему тупую можно клозать

02 Oct 2019 в 16:07 #13

lexani4321 сказал(а):↑
Нажмите, чтобы раскрыть.

я шо знаю чтоле) на моей платформе это ключевое слово зарезервировано и не используется)

img

02 Oct 2019 в 16:07 #14

future_tech сказал(а):↑

Конечно можешь, или тебя беспокоят авторские права?

Нажмите, чтобы раскрыть.

Меня беспокоит что программа отвалиться и окончательно сломается из-за моего

AnimeWhatever.png?1550498590

нубского внедрённого кода.

Был бы хоть один tutorial где дописывали и внедряли куски кода в программу но его нету.

02 Oct 2019 в 16:15 #15

KeksovName сказал(а):↑

Был бы хоть один tutorial где дописывали и внедряли куски кода в программу но его нету.

Нажмите, чтобы раскрыть.

img

02 Oct 2019 в 16:43 #16

lexani4321 сказал(а):↑

Ну на.

Нажмите, чтобы раскрыть.

justsmile.png?1553740538

Спасибо

05 Oct 2019 в 23:44 #17

KeksovName сказал(а):↑

могу ли я не просто поменять несколько команд ассемблера(что обычно делают «крэкеры») а внедрить свой код?FeelsOkayMan.png?1553740655

Написать свою dll’ку и в нужный момент вызывать её или добавить секцию и запихать туда весь свой код.CoolCat.png?1553740558

Нажмите, чтобы раскрыть.

Просто вписать произвольное число своих инструкций в нужное тебе место адресного пространства постороннего процесса, конечно, получится, но это нарушит дальнейшую адресацию и целостность стека, что сразу же крашнет целевой процесс. Внедрение кода происходит немного иначе, вот самый примитивный (в плане реализации и обнаружения), но рабочий варик для любого x86 процесса:

Находишь адрес, с которого необходимо осуществить переход к твоему коду

Меняешь первый байт по этому адресу на значение 0xe9 (опкод инструкции jmp)

Меняешь следующие 4 байта на адрес начала твоего кода (адрес для jmp офк относительный, вычисляется как «куда — откуда — 5»), где 5 — длинна инструкции безусловного прехода (1 — сам jmp, 4 — относительный адрес).

После своего кода выполняешь оригинальные 5 байт, которые ты перезаписал джампом

Затем возвращаешься (опять при помощи jmp) на адрес, с которого ты прыгал, но со смещением +5.

Также нужно помнить, что не всегда получится заменить 5 байт, не разорвав какую-нибудь инструкцию. Это все проверяется дебаггером и при необходимости фиксится нопами.

Читайте также:
Что такое программа молодой семье доступное жилье

KeksovName сказал(а):↑

P.P.S Я пока не умею программировать а могу только поменять несколько команд ассемблера,так что вопрос теоретический(пока).

Источник: dota2.ru

Внедрение шелл-кода в исполняемый PE файл вручную.Reverse engineering для самых маленьких(часть 4).

Сегодня мы рассмотрим несколько способов внедрения шелл-кода в исполняемый файл под Windows (Portable Executable). Конечно это будет не совсем прям ручное внедрение, мы будем пользоваться редактор двоичных файлов Hiew( простонародье Хью ). Так же нам потребуется сам шелл-код в формате bin, в данном примере этот код запускается Калькулятор в Windows. Ну и файл жертва, в нашем случае этот.

Шелл-код — это двоичный исполняемый код, который выполняет определенную задачу еще его называют Пейлоад (payloads; полезная нагрузка).

В преведущей статье мы разобрались как устроен исполняемый файл .EXE (PE). Если кратко, из заголовка и секций. Давайте разберем с вам несколько простых способов внедрить код:

  • Внедрение в свободное место секции.
  • Расширение секции.
  • Добавление новой секции.

Внедрение в свободное место.

Запуская программу операционная система создает процес и выделяет ей виртуальную оперативную память куда загружается программа. Виртуальная в том смысле что это изолированный участок оперативной памяти имеющий свое адресное пространство.

Память имеет постраничную организаций, то есть блоками определенного размера ( в Windows это вроде 4 килобайта), все не занятое пространство страницы заполняется Null байтами. Так же у этит страниц есть атрибуты ( чтение , запись , исполнение). Например константы удобно хранить в странице с атрибутом только на чтение, они точно не поменяются, так о на заботиться операционная система. Собственно эти атрибуты есть у секций в исполняемом фале, какая в какую страницу будет записана.

Что бы посмотреть атрибуты нажимаем F8затем F6выбираем секцию и жмем F2.

И опять же из за страничной организации памяти есть выравнивание, даже если данные занимают у нас 20 байт, все равно будет выделена страница памяти( Выравнивание памяти). Так же есть выравнивание файла, данные в секции занимают 20 байт. Но физически в файл компилятор добавит Null байты до параметра выравнивания.

Вот в это свободное место мы и добавим наш шелл-код. Для этого выделяем участок в нулями скажем с адреса 2A70.

Что бы выделить участок кода нажмите Shift + *, после выделения опять же Shift + *.

Затем нужно вернуть маркер на начало выделенного участка и скопипастить из файла код комбинацией Ctrl + F2.

  • Теперь нужно изменить точку запуска файла на наш внедренный участок. Заходим в заголовок (F8) нажимаем F3и редактируем поле Entry Point, не забываем сохранить изменения кнопкой F9.

  • Готово. Не забудьте отключить антивирус, он очень не любит такие вещи и теперь будет ругаться на ваш файл. Давайте отправим на VirusTotal )))

    Добавление новой секции.

    Свободное место бывает не всегда. Часто программа плотно упакована и у нас просто нету места куда можно добавить код ( особенно если он достаточно большой). самое простой вариант это добавить новую секцию.

    Первым делом добавляем в конец файла 4086 байт, если вы помните это файловое смещение секции в файле (0x1000)

    Для добавления нажмите Shift+F3.

    Затем заходим в заголовок (F8), секции (F6) и добавляем новый заголовок (F4). Дальше нам нужно отредактировать его название и данные о размере, атрибутах, памяти.

  • Но размер файла изменился , теперь нам надо указать новые данные в заголовке.

    Такой вариант не понравился больше VirusTotal.

    Расширение секции.

    С расширение секции все немного сложней, нам придется редактировать все секции. Так как атрибуты секций изменяться. Алгоритм думаю уже понятен.

    Добавляем байты в секцию равное файловому смещению, редактируем данные заголовков, меняем размер файл ,меняем точку входа программы если нужно.

  • Ошибка в тексте? Выделите её и нажмите «Ctrl + Enter»

    Источник: xn--90aeniddllys.xn--p1ai

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    EFT-Soft.ru