LINUX.ORG.RU

Хочу недодекокомпилятор в сишечку

 , , ,


2

1

В попытках поиска смысла жизни, захотелось перепройти/отреверсить все игры. Скажем, на входе у нас есть байткод от 6502/Z80 или чего-то такого. Сделать самодельный дизассемблер не представляет проблем, благо даташитов полно, а вот разбираться с джампами кто и куда - несколько сложно, хотелось бы какие-то конструкции вида if/while для удобочитаемости и более приятной медитации. Да, я в курсе, что в общем виде это не возможно, но у меня нету работы и я никому не нужен. В принципе это умеет ИДА и подобные штуки. Но подобные штуки не умеют в декомпиляцию 6502/Z80.

Можно было бы попробовать составить граф переходов, это относительно несложно, но что дальше? Была идея оттранслировать байткод в некий абстрактный код (хоть JVM) и поверх этого прицепить свой «абстрактный декомпилятор» (так как процессоры разные и может быть будут другие), но нехватает грамотности. Была идея прицепить сверху Процион, но у него и так порой рвет крышу от некорректных графов. Фернфловер, насколько мне известно, так и остался закрытым изделием, хотя именно эту задачу он решал.

Особенно приветствуются различные PDF по написанию дизассемблеров, декомпиляторов и всего такого.

Вообще, мне еще Dangerous Dave 3 пройти надо, но в меня постоянно прилетают ножи. Это нехорошо, это надо исправить. Но это х86 и пока на это у меня нехватает квалификации, так что это на будущее.

ruzisufaka ()

В принципе это умеет ИДА и подобные штуки. Но подобные штуки не умеют в декомпиляцию 6502/Z80.

А на zx-pk.ru считают, что ida умеет в z80. Врут наверное.

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

Когда я смотрел последний раз, бесплатный легальный вариант IDA умел только 32-битный x86. Декомпилятора там тоже в комплекте не было.

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

Когда я смотрел последний раз, бесплатный легальный вариант IDA умел только 32-битный x86. Декомпилятора там тоже в комплекте не было.

А кто говорит о бесплатном варианте?

andreyu ★★★★★ ()

radare2. Режим псевдокода.

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

А на zx-pk.ru считают, что ida умеет в z80. Врут наверное.

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

Другое дело, встроенный декомпилятор, который даже х86 не всегда кушает, в частности 16-битный код ему скормить просто так не получится. И даже если специально для него скомпилять 32-битный код из того же асм-исходника, то оно будет долго говорить «ой, что-то со стеком непонятное, давай ты мне поможешь?», после чего можно долго бегать по пушам-попам и расставлять размеры стека. Если нигде не ошибиться, то раза с 3-го даже что-то высирает, но толку от этого не много (в конце оказывается, что где-то всеже ошибся и кучи кода просто НЕТ). И только недавно эта штука научилась декомпилять АРМ-код. Думаю, про поддержку Z80 говорить не надо? Я вот даже дампы памяти не смог загрузить в ИДУ корректно, так как видите ли, области РОМ и РАМ не должны пересекаться, а если у тебя все одним куском - страдай!

Алсо, я как-то давно регался еще на zx.pk.ru, пока он существовал, недавно хотел излить своей боли на zx-pk.ru, но не смог зарегистрироваться. Пришлось просто вслух высказать все что я думаю о этом сайте и его сообществе.

ruzisufaka ()
Ответ на: комментарий от Stil

radare2. Режим псевдокода.

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

ruzisufaka ()

Ты не думаешь о том, что в те времена игры реально писались в том числе и на голом асме? А это значит, что в некоторых ситуациях эквивалентной трансляции в Си может просто не существовать (то есть алгоритм для перевода на Си по сути надо переписать, а это уже ИИ какой-то нужен).

KivApple ★★★★★ ()

Фернфловер, насколько мне известно, так и остался закрытым изделием, хотя именно эту задачу он решал.

https://github.com/fesh0r/fernflower

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

Ты не думаешь о том, что в те времена игры реально писались в том числе и на голом асме?

И что? Я даже уверен в этом. Об этом даже написано в первом посте.

Но я уверен, что в 99% случаев мы можем подобрать похожую конструкцию на сишечке. Даже если просто найти базовые блоки кода (с одним входом и выходом) и завернуть их в скобки - уже хорошо. Найти подсчет выражения для условия и завернуть в иф - еще лучше. Это будет гораздо лучше разглядывания аскиарта с квадратиками или вообще стрелочек вроде https://img.wonderhowto.com/img/46/95/63582290276530/0/reverse-engineering-wi...

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

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

Его разрабатывал один человек. Продали его JetBrains или же добровольно по разрешению включили в состав IDEA, спрашивай у него:

https://habrahabr.ru/users/Stiver/

Судя по

https://habrahabr.ru/post/176825/#comment_7313847

Купили и уже потом открыли.

У меня кстати Fernflower захлёбывался в // $FF: Couldn't be decompiled, а JD отрабатывал отлично.

Декомпиляция Java (комментарий)

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

Еще бы понять, что это должно значить в контексте «IDA умеет в z80»?

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

Умеет в дизассемблирование или в декомпиляцию z80?

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

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

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

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

Другое дело, встроенный декомпилятор, который даже х86 не всегда кушает,
И только недавно эта штука научилась декомпилять АРМ-код.

Казалось бы, при чем тут z80.

Я вот даже дампы памяти не смог загрузить в ИДУ

А я не умею управлясь самолетом. Видимо самолет говно.

Алсо, я как-то давно регался еще на zx.pk.ru, пока он существовал, недавно хотел излить своей боли на zx-pk.ru, но не смог зарегистрироваться.

Он и сейчас существует и весьма активен. Процедура регистрации достаточно проста, но с премодерацией. Если для вас регистрация на сайте оказалась проблемной, то неудивительно, что и настройка ida для вас недоступна.

Пришлось просто вслух высказать все что я думаю о этом сайте и его сообществе.

Наверное для этого владелец ресурса и ввел премодерацию.

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

Лично я ничего конкретного не ожидаю, всего лишь задал вопрос.

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

Думаю, про поддержку Z80 говорить не надо?

То есть тебе нужен HexRays, но для Z80/MOS6502? Но для этих платформ ведь не было сишки.

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

Лично я ничего конкретного не ожидаю, всего лишь задал вопрос.

Что бы я мог ответить на ваш вопрос, мне нужен ответ на мой вопрос «В чем отличие дизассемблирования от декомпиляции для z80?»

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

Но для этих платформ ведь не было сишки.

Для спектрума, если мне память не изменяет, был какой-то си-компилятор.
Сходу нашел такой - http://www.worldofspectrum.org/infoseekid.cgi?id=0008252
Но сам я им не пользовался, видел какой-то другой компилятор.
Ресурсов на спектурме было слишком мало, что бы использовать высокоуровневый язык для написания приложений и игр.

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

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

Шел 2017-й год, технический прогресс шел семимильными шагами...

Казалось бы, при чем тут z80.

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

А я не умею управлясь самолетом. Видимо самолет говно.

Потому велосипед лучше

Он и сейчас существует и весьма активен

А меня zx.pk.ru редиректит на zx-pk.ru

Наверное для этого владелец ресурса и ввел премодерацию.

Думаю, вы в курсе, что я думаю о таких владельцах и ресурсах. Потому я туда и не пишу. Я тут вообще на одном ресурсе нашел пунктик в правилах «хамство», больше туда не зайду, мне нечего делать в подобных гадюшниках, где мое мнение сначала будет одобряться, а потом обсуждаться 3.5 старожилами, мнения которых меня уже не интересует.

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

То есть тебе нужен HexRays, но для Z80/MOS6502? Но для этих платформ ведь не было сишки.

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

Ну и если идти на принцип, то в худшем варианте мы можем каждую инструкцию оттранслировать в набор команд вида emulated_ldir(from,to,size), а то и вообще сделать просто построчную трансляцию вида emulated_ldir(current_hl,current_de,current_bc); не залезая даже в анализ регистров, останется прицепить маленький рантайм и можно такое даже пересобрать. Останется написать эмуляцию железа и играть! В общем, если очень захотеть, то сишку можно сделать из всего.

Впрочем, глядя на Фернфловер, думаю делать трансляцию в JVM, синтаксис такой же, большой разницы не вижу, а нормальные декомпиляторы греют душу.

ruzisufaka ()

radeco — декомпилятор на основе radare2

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

Книжка отличная, только сегодня обновлялась. За задачник спасибо, но разные крякми кажутся более интересными, так как часто предполагают решение и его объяснение.

ruzisufaka ()

ассемблер высокого уровня — HLA, PL/M

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

radeco — декомпилятор на основе radare2

Разбираться с Растом лениво, но я правильно понимаю, что оно генерит графы через графвиз? Это я и без него умею, хотя по https://repo.zenk-security.com/Conferences/ZeroNights/18-kochkov.pdf почти то, что я и ищу, но примеров не видно. Зато по запросу Радеко нашлось https://xakep.ru/2016/01/27/esil-radeco-il/ - буду изучать представленное, тут много всего разного, спасибо!

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

да, ESIL это тоже такой «ассемблер высокого уровня».

anonymous ()
Ответ на: комментарий от ruzisufaka

18-kochkov.pdf почти то, что я и ищу, но примеров не видно

по ссылке оттуда нашлось: openREIL

anonymous ()

Под MOS6502 какая платформа подразумевается - commodore или nes/famicom? У первых основная сложность - загрузчики/подгрузчики и использование ресурсов дисковода (там память и еще один 6502, которые могут использоваться для вычислений), у вторых - куча всякой аппаратной фигни, которую из листинга тоже не увидеть и не не понять.

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

CaptainFarrell ()
Ответ на: комментарий от anonymous

книжка по реверсингу

О. Спасибо анончик, буду читать.

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

Под MOS6502 какая платформа подразумевается - commodore или nes/famicom?

Нес, основная идея - играть в игры.

которую из листинга тоже не увидеть и не не понять.

Ну допустим, что игрушка идет в эмуляторе корректно. Остановить эмуль и увидеть указатель «где мы» можно в любом приличном эмуле, равно как и за несколько кликов дойти до игрового цикла. Если помечать исполняемые инструкции, то можно найти интересующий код достаточно быстро (это умеют далеко не все эмули), так что локализовать нужное можно относительно просто (проверка коллизиций, отрисовка карт, переходы между уровнями). Остается как-то вырезать интересующий кусочек и проанализировать.

ruzisufaka ()
Ответ на: комментарий от anonymous

про PL/M

журнал «Downgrade» # 19 за 2016 год:

стр. 40, статья «КРОССКОМПИЛЯТОРЫ ДЛЯ IINTEL 8080»:

Всё плохо?

Мы просмотрели все основные решения компиляторов и ничего не нашли, что, действи‐ тельно всё так плохо? Почти. Я тоже сначала впал в уныние и разуверился в жизни, но по‐ том прочитал, что сама ОС CP/M была написана не на ассемблере, а на языке PL/M. Хм, написа‐ но, что язык был разработан специально для микрокомпьютеров, в отличие от других язы‐ ков, которые разрабатывали для больших ра‐ бочих станций. Все силы были брошены на поиск его компилятора для i8080. Постепенно находилось о нём все больше и больше инфор‐ мации, и в итоге на одном непримечательном сайте был найден исходник оригинального компилятора PL/M 1974 (!) года в виде исход‐ ника на Фортране, который был сконвертиро‐ ван в Си и скомпилирован современным компилятором для Windows. Эта была хорошая новость, но недолго. Компилятор был очень старым (1974 год же), стандарты и методы ра‐ боты сильно отличались от современных.

[...]

Это лучшее зна‐ чение из всех, было решено взять этот язык на вооружение и развивать его.

PL/M Super Compiler

Однако в данном трансляторе было несколько недостатков:

‐ Программа должна быть написана большими буквами.

‐ Не было модульности — вся программа должна быть одним большим исходником.

‐ Отсутствовали ассемблерные вставки.

‐ Точка с запятой в конце каждой строки.

Немного подумав, было решено сделать для компилятора обёртку, которая будет лише‐ на этих недостатков. В итоге должен получить‐ ся Super PL/M Compiler. :‐)

В качестве скриптового языка я выбрал Lua. Этот язык очень маленький (интерпрета‐ тор весит 200 КБ), простой, быстрый и имеет богатый функционал.

Для примера, вот программа, где исполь‐ зуются большинство функций данного компи‐ лятора:

putstr: procedure (uk)
declare uk address
goto printstra
end
asm
printstra:
mov h,b
mov l,c
jmp 0f818h
endasm
call putstr(.(‘HELLOWORLD’,0))

Здесь используются как средства самого PL/M, так и Super PL/M Compiler. Мы делаем ас‐ семблерную вставку, где вызываем подпро‐ грамму БИОСа компьютера «Апогей‐БК‐01ц» для печати строки. Конструкция .(‘HELLO WORLD’,0) означает разместить в памяти стро‐ ку HELLO WORLD (с нулём в конце) и возвратить на неё адрес. Далее этот адрес мы передаём в процедуру putstr, которая передаёт управле‐ ние ассемблерной вставке. Далее надо знать особенности компилятора. Если у процедуры один параметр типа address, то он помещается в регистровую пару bc, а подпрограмма БИОСа для вывода строки требует параметры в hl. Мы переносим параметры в нужные регистры, и передаём управление системной процедуре, которая уже печатает строку.

Что дальше?

Данная сборка имеет очень большой по‐ тенциал, с помощью неё можно написать хоро‐ шие программы, игры, и притом не сложно. Язык PL/M очень простой, в нём мало конструкций, но они очень ёмкие и позволяют делать интересные приёмы. А если добавить к нему современные средства сборки, добавить ассемблер, то получится вообще супер! На данный момент система ещё находится в разработке, отлавливаются баги и пишется библиотека — пока для компьютера «Апогей БК‐01ц», а далее – и для других компьютеров. Также я планирую написать для журнала цикл статей, посвящённых программированию на этом языке – от самых азов до сложных приёмов, будут написаны небольшие програм‐ мы.

Пока всё! Удачи и до новых встреч! Прим. ред.: упомянутые в статье компиляторы и утилиты можно скачать здесь: http://dgmag.in/N19/8080/i8080comp.zip

anonymous ()
Ответ на: комментарий от ruzisufaka

Да, причем в будущем может быть для чего-то еще. Была сишка или нет - не так уж и важно, меня вполне устроит псевдокод с циклами и условиями

вот какой-то такой вот «ассемблер высокого уровня» типа PL/M взять, и в него декомпилировать.

anonymous ()
Ответ на: комментарий от ruzisufaka

А меня zx.pk.ru редиректит на zx-pk.ru

Хочу недодекокомпилятор в сишечку (комментарий)

Думаю, вы в курсе, что я думаю о таких владельцах и ресурсах.

Судя по вашим сообщениям, вы вообще не умеете думать.

Потому я туда и не пишу.

Ну все, теперь владелец ресурса очень переживает по этому поводу.

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

ассемблер высокого уровня — HLA, PL/M

Протащился от возможности изобретать DSL и кодогенерации, очень круто. Спасибо, реально было интересно и полезно познакомиться. Только у меня обратная задача, развернуть уже все это в высокоуровневые конструкции, лол.

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

макросы же есть

макросы же

и высокоуровневые конструкции

не, ну тебе что, STL там нужен? :-)

по идее, для этой обратной задачи можно испольовать какую-то среду «грамотного программирования» (literate programming), которая бы наоборот, из исходников, размеченных комментами типа //block_begin GUID ... //block_end GUID вытаскивала бы из исходников в откомментированные «блоки кода» (то есть, операция, обратная tangle). и чтобы потом метаязыком шаблонов «грамотного программирования» (шаблонизатор с возможностью подстановки шаблона по имени, с параметрами «блока кода» — метапеременными) наворачивать какую угодно гибкую башню макросов вида DSL.

типа progdoc, xprogdoc

cм. мануал ,пример — только тут надо «блоки кода» вида //block_begin GUID ... //block_end GUID , то есть, вида //BEGIN GUID-name .. //END GUID-name

см. про reverse literate programming: [url=]http://ssw.jku.at/Research/Papers/Kna96.html pdf active texts, типа такого,такого (funnelweb вместо progdoc)

при этом, конечно нужно как-то тестировать что результат сборки/разборки не изменился.

в общем, какой-то MetaCASE получается.

в общем случае там будет и abstract interpretation, и symbolic execution (то, куда движется radare2/ESIL/декомпиляторы).

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

отсюда и program slicing, SMT солверы и прочее — вот это вот всё.

anonymous ()
Ответ на: комментарий от ruzisufaka

ещё в fasm есть fasmg, в котором можно изобретать макросы (например 10500 разных ассемблеров в нём реализовано разными макросами, DSL)

как-то так, переписывая на LitProg DSL типа progdoc и дописывая нужные высокоуровневые конструкции макросами, то есть метамоделями (нужными, опять же) и двигаться в нужном направлении.

anonymous ()
Ответ на: комментарий от ruzisufaka

Вообще, мне еще Dangerous Dave 3 пройти надо, но в меня постоянно прилетают ножи. Это нехорошо, это надо исправить. Но это х86 и пока на это у меня нехватает квалификации, так что это на будущее.

Оффтоп: я когда-то с читами прошёл (scanmem/art-money). Нервов не хватило сдыхать постоянно. Несмотря на долгие года дэнди-задротства.

chinarulezz ★★★★★ ()
Ответ на: реализации PL/M от anonymous

cpm-source-v3.zip/CPM_source/1,1/hello.plm

/*
 * SIMPLE HELLO WORLD EXAMPLE
 *
 * USE TRICK LEARNED FROM GARY KILDALL TO AVOID REBOOT
 * AND JUST RETURN TO THE CCP INSTEAD.
 */

0FAH:	/* ORIGIN OF THIS PROGRAM FOR CP/M */

DECLARE STACKPOINTER LITERALLY 'STACKPTR';

DECLARE BDOS$PRINT LITERALLY '9';	/* BDOS FUNCTION PRINT STRING */

DECLARE CR LITERALLY '13';		/* ASCII CARRIAGE RETURN */
DECLARE LF LITERALLY '10';		/* ASCII LINEFEED */

/* SET UP STACKPOINTER IN THE LOCAL AREA */
DECLARE STACK(16) ADDRESS, SP ADDRESS;

DECLARE HELLO$STRING DATA ('HELLO WORLD',CR,LF,'$');

HELLO: PROCEDURE BYTE;

    /*
     * PROCEDURE TO CALL BDOS FUNCTIONS
     */
    BDOS: PROCEDURE(FUNC,PARM);
        DECLARE FUNC BYTE;
        DECLARE PARM ADDRESS;
        DECLARE BDOS$JUMP LITERALLY '3206H';
        GO TO BDOS$JUMP;
    END BDOS;

    /*
     * MAIN PROGRAM, PRINT STRING TO CONSOLE AND TERMINATE
     */
    SP = STACKPOINTER; STACKPOINTER = .STACK(LENGTH(STACK));
    CALL BDOS(BDOS$PRINT,.HELLO$STRING);
    STACKPOINTER = SP;
    RETURN 0;

END HELLO;

EOF

выглядит проще, чем ассемблер Z80. и прозрачно отображается на него.

anonymous ()
Ответ на: комментарий от chinarulezz

Оффтоп: я когда-то с читами прошёл (scanmem/art-money). Нервов не хватило сдыхать постоянно. Несмотря на долгие года дэнди-задротства.

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

ruzisufaka ()
Ответ на: комментарий от anonymous

читай этот диплом

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

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

Надо freeze'нуть/заморозить эти участки памяти для изменений.

chinarulezz ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.