LINUX.ORG.RU
ФорумTalks

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

 , , , ,


3

5

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

Не знаю как оно сейчас, но с т.з. логики, надо указать ОС, т.к. принципиально ловить системные вызовы. Для винды давным-давно была IDA, но лет десять назад были какие-то мутки с попыткой ее коммерциализировать… Подозреваю, что она до сих пор является одним из основных инструментов под винду…

soomrack ★★★★★
()

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

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

А логику восстановить из декомпилированного кода на C или ассемблерного листинга - нужны огромные финансовые и временные затраты, дешевле с нуля разработать.

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

Есть, но 20 лет назад, когда я чуть-чуть этим интересовался, смысла в IDA для линукса особо не было, т.к. большого преимущества перед стандартными средствами она не давала.

soomrack ★★★★★
()

да нинасколько, фарш нельзя перекрутить обратно в мясо. Только вручную по кусочкам собирать

mittorn ★★★★★
()

Какой функционал достен, могут ли, например, быть распознаны виртуальные функции и вызовы?

А какая иноформация в бинаре доступна? от этого очень много зависит, но содержимое vtable зависит от vptr и у тебя в лучем случае будет сишная структура для базового vtable. К сожалению даже с дебаговой инофрмацией точный тип может быть недоступен

mittorn ★★★★★
()

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

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

Какой функционал достен, могут ли, например, быть распознаны виртуальные функции и вызовы?

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

firkax ★★★★★
()

Насколько проста компиляция дисассемблированного и отредактированного исходника?

Нифига не проста. Эта фича для упрощения реверс-инженеринга, а не повторной компиляции.
Лучше опиши какой функционал тебе нужен, может там dll/so подгрузить рядом проще и вклиниться в пару функций.

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

у тебя в лучшем случае будет сишная структура для базового vtable.

Вы очень оптимистичны. После того что с кодом делает оптимизатор (inlines, dead branches and virtuals elimination) Вам в принципе будет трудно сказать был ли в оригинальных сорсах вызов virtual, или гвоздями к какому-то конкретному классу прибит.

По перспективам я солидарен с господином @C: больше чем на исправление нескольких констант и, может быть, пары условных переходов - я бы не рассчитывал.

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

опиши какой функционал тебе нужен

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

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

были какие-то мутки с попыткой ее коммерциализировать…

Эм? IDA Pro всегда была платной и проприетарной и более того – монополистом на рынке. Собственно потому лет пять назад вышла наверное единственная ей альтернатива – Ghidra от АНБ.

20 лет назад, когда я чуть-чуть этим интересовался,

20 лет назад вероятнее всего не было всяких там Hex-Rays.

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

Возможно будет легче отреверсить и переписать с необходимой функциональностью.

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

Это очень тяжело сделать даже при наличии исходников. Для примера возьмите исходники opera presto и попробуйте переписать под многопоток.

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

IDA Pro всегда была платной и проприетарной и более того – монополистом на рынке.

Но до того времени она очень спокойно смотрела на свои пиратские версии, типа аудитория растет и т.п. А потом вдруг решил прикрыть это все.

20 лет назад нифига не было, хотя уже не 20, а 25, когда я этим интересовался… Тогда мы (школьники и студенты) пользовали иду и ватком для обхода запроса ключа, кажется, у winrar и пр…

soomrack ★★★★★
()

Насколько хорошо на сегодняшний день это работает?

Не работает.

i-rinat ★★★★★
()
Ответ на: комментарий от beastie

тот же Sourcer

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

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

тогда может тебе стоит не о рекомпиляции задумываться, а о хуках?

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

Тогда мы (школьники и студенты) пользовали иду и ватком для обхода запроса ключа, кажется, у winrar

Ну, если школьники, то ещё можно понять, но вообще зачем этой чушью заниматься? Рар никогда не урезал функционал в зависимости от наличия ключа. А вообще такие штуки любым дизассемблером делаются, исходники в виде Си (те что сгенерированы, а не настоящие) задачу не особо облегчают.

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

Да, это был обычный пример для изучения как оно че там делается. С подробными инструкциями и объяснениями.

soomrack ★★★★★
()

Может тебе нужен metasploit?

Kroz ★★★★★
()

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

Сейчас надо ещё и подписи переподписывать ;-)

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

никто никогда полностью не компилировал дизассемблированный код.

4.2. Да, не без долгого и муторного допилинга, но всё-таки.

token_polyak ★★★★★
()
Последнее исправление: token_polyak (всего исправлений: 2)
Ответ на: комментарий от vbcnthfkmnth123

Это очень тяжело сделать даже при наличии исходников. Для примера возьмите исходники opera presto и попробуйте переписать под многопоток.

Да хотя бы просто откомпилировать. Без виртуалки с windows98 поначалу и пытаться не стоит

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

Согласен. Во времена, когда .com файлы были размером 8-16 Кб - очень даже дизассемблировали и перекомпилировали.

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

Эм? IDA Pro всегда была платной и проприетарной и более того – монополистом на рынке. Собственно потому лет пять назад вышла наверное единственная ей альтернатива – Ghidra от АНБ.

После чего IDA Pro резко улучшила отношение к пользователям :)

20 лет назад вероятнее всего не было всяких там Hex-Rays.

Компания Hex-Rays формально основана в 2005 году. Если не ошибаюсь, Hex-Rays как экспериментальная надстройка над IDA для преобразования ассемблера в C++ появился на несколько лет раньше.

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

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

Так никто не делает.

Именно так в 2000-х сделали неофициальный порт игры X-COM из DOS DPMI под Windows CE. Но да, успешных проектов — единицы.

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

IDA есть и для линукса.

Долгое время у неё был только консольный интерфейс, причём глючный и падучий. Сейчас на Qt, но когда я пробовал, что-то там не заработало (то ли скрипты на Питоне, то ли эмулятор — не помню). Могли с тех пор исправить.

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

Не знаю как оно сейчас, но с т.з. логики, надо указать ОС, т.к. принципиально ловить системные вызовы. Для винды давным-давно была IDA, но лет десять назад были какие-то мутки с попыткой ее коммерциализировать… Подозреваю, что она до сих пор является одним из основных инструментов под винду…

Ближе к 20 уже. А 10-15 лет назад было совсем жёстко — могли отказаться продавать потому, что правообладатель заподозрит тебя в желании раздавать бинарники :) И демо-версии стали совсем нефункциональными.

IDA Pro всегда была платной и проприетарной и более того – монополистом на рынке.

Но до того времени она очень спокойно смотрела на свои пиратские версии, типа аудитория растет и т.п. А потом вдруг решил прикрыть это все.

20 лет назад нифига не было, хотя уже не 20, а 25, когда я этим интересовался… Тогда мы (школьники и студенты) пользовали иду и ватком для обхода запроса ключа, кажется, у winrar и пр…

Возможно, не 20 лет назад, а ближе к 30? В 2004-5 годах начали активно коммерциализировать Hex-Rays, а заодно и на всё остальное гайки закрутили.

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

question4 ★★★★★
()

Дизасмы для изучения кода только по сути предназначены. Как ты пишешь, последний раз у меня такое прокатывало с .com файлами под DOS. Буквально, отдизасмил какую-то утилитку через бесплатный Sourcer, поправил асмовый исходник, тасмом собрал обратно - работает.

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

могли отказаться продавать потому, что правообладатель заподозрит тебя в желании раздавать бинарники :) И демо-версии стали совсем нефункциональными.

Во, точно!

Возможно, не 20 лет назад, а ближе к 30? В 2004-5 годах начали активно коммерциализировать Hex-Rays, а заодно и на всё остальное гайки закрутили.

Может ближе к 30. Очень давно это было, я уже не помню в каком классе этим интересовался. Наверное, где-то около 96 г., т.к. в университете было уже не до этого, да и в 11м классе – тоже.

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

да нинасколько, фарш нельзя перекрутить обратно в мясо. Только вручную по кусочкам собирать

Ну не скажите, мясо — это умудриться получить на исходном языке, что ТС-у не требуется. Потому можно считать что требуется некоторый переводчик из бинарного кода в тектовый. Если обратный переводчик снова создаст байт-в-байт тот же бинарник, то таки дизасемблер типа провернул назад, вне зависимости от сгенеренного бреда. Если модификация будет в тех кусках, где бреда минимально, то исходная задача будет решена. Но разбирать тонны бреда, конечно, сизифов труд.

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

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

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

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

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

Это не дизассемблированный код, а написанный вручную, с использованием дизассемблера как базы разумеется.

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

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

Ну вот не работало оно так с чем-то сложнее .com-ков. В лучшем случае тасм это успешно собирал в .exe, но .exe не работало потом как задумано или крэшилось при запуске. В hiew байты менять - ну такое, хотелось всёж полноценно программу редактировать, пусть и на асме. Может сейчас конечно как-то по-другому дело обстоит.

HexRay вот доставил, дотнетовские программы отлично разбирал. Обратно конечно эту псевдо-сишку не соберёшь, зато прекрасно видно что внутри происходит.

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

Не совсем, вообще асм не всегда 1 в 1 соответствует оп.кодам, а бинарник далеко не на 100% состоит только из оп.кодов, но в целом да, метод открыл поправил работает, я в последний раз radare2 использовал, а вернее Cutter, и всё получилось

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

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

В hiew байты менять - ну такое, хотелось всёж полноценно программу редактировать, пусть и на асме.

Так в hiew и показывается программа на асме. Зачем её в текстовом виде вообще сохранять, если этот текстовый вид генерится на лету?

HexRay вот доставил, дотнетовские программы отлично разбирал. Обратно конечно эту псевдо-сишку не соберёшь, зато прекрасно видно что внутри происходит.

Дотнет это что-то похожее на джаву и подозреваю что и с декомпиляцией там всё то же самое. А джаву разобрать как раз не проблема, и там всё компилируется назад, исходник восстанавливается практически один в один, только имена переменных теряются. Только у джавы обычно свои декомпиляторы.

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

Зачем её в текстовом виде вообще сохранять, если этот текстовый вид генерится на лету?

Если байт-в-байт править, это работает. А если тебе кусок кода в середину дополнительно вставить надо? Там же все смещения поедут сразу.

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

Cutter уже несколько лет работает на Rizin. И поддерживает декомпиляцию с использованием немного модифицированного движка Ghidra - rz-ghidra.

По теме вопроса - в общем случае задача бинарной статической рекомпиляции не решаема, ввиду трудности отличия указателей от чисел, данных от кода до самого процесса запуска. На StackExchange Computer Science неоплохо описаны основные проблемы.

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