LINUX.ORG.RU
ФорумTalks

Состояние дисассемблинга сегодня

 , , , ,


3

5

Есть желание добавить некий функционал в x86 экзешник размером в несколько мегабайт, путем его дисассемблирования и повторной компиляции. Насколько хорошо на сегодняшний день это работает? Насколько проста компиляция дисассемблированного и отредактированного исходника? Какой функционал достен, могут ли, например, быть распознаны виртуальные функции и вызовы?

Ответ на: комментарий от yu-boot

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

firkax ★★★★★
()
Ответ на: комментарий от Patifon_Kakao

Во влажных фантазиях

просто в качестве мозгового штурма почему бы это не сделать во влажном контейнере? поиграйся с выводами в файл\сокет, обложи этот бинарь какими-то api. мне кажется это реальнее чем побитовое препаривание.

flant ★★★★
()

путем его дисассемблирования и повторной компиляции

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

a1ba ★★
()
Ответ на: комментарий от EXL

Эм? IDA Pro всегда была платной и проприетарной

проприетарной - безусловно. Но помимо Pro есть бесплатная Free версия, которая только для x86, с ограничениями и декомпиляцией в облаке.

seiken ★★★★★
()
Ответ на: комментарий от firkax

Нет, я имею в виду, что именно капитальная работа возможна, хотя и сложна. И попытки ограничиться меньшим в итоге всё равно выльются в перелопачивание всего бинарника.

question4 ★★★★★
()
Ответ на: комментарий от question4

Ну тогда я не знаю зачем ты это написал.

Я ответил автору, что «декомпилируем, исправим и скомпилируем назад» никто не делает.

Ты отвечаешь мне «нет, вот в 2000-х именно так сделали» и пишешь про совсем другое (долгую работу по реверсу).

firkax ★★★★★
()
Ответ на: комментарий от mittorn

Но в котлетку можно добавить мазика, кетчупа, сыра и так далее. Т.е. как и прежде, это на уровне связки ida/ghidra/r2 и чего-то типа hiew.

hatred ★★★
()
Ответ на: комментарий от firkax

Нет, я говорю, что малыми усилиями не обойтись.

question4 ★★★★★
()
Ответ на: комментарий от dnb

Спасибо за ссылку, соберу и потыкаю на досуге.

sparkie ★★★★★
()
13 октября 2024 г.

Есть желание добавить некий функционал в x86 экзешник размером в несколько мегабайт

Такое возможно.

путем его дисассемблирования и повторной компиляции.

Но не так. Можно зато делать бинарные патчи.

Был один блогпост с рассказом о том как это проворачивать в cutter.

https://cutter.re/5-ways-to-patch-binaries-with-cutter

Artsi0m
()

Это делается не совсем так. Делается бинарный патч по нужному адресу.

vbr ★★★★
()
Ответ на: комментарий от firkax

асм и бинарник как раз взаимно однозначно друг в друга превращаются

Далеко не всегда. Команды кодируются переменным числом байтом, т.е. тебе надо как минимум знать где команда начинается. Компилятору ничего не решает всунуть между командами данные, если он знает, что туда перехода не будет, а дизассемблер эти данные попытается распознать и у него всё уедет. При ассемблировании одна команда может кодироваться в байты по-разному и если изначально дизассемблер ошибся, то после ассемблирования получится уже не то. Эвристики конечно там есть, но то такое. Думаю, для любого нетривиального проекта это дохлый номер.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от Patifon_Kakao

Во влажных фантазиях хотелось бы запустить кое-что в несколько потоков, добавить сетевое взаимодействие.

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

annulen ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)