LINUX.ORG.RU

Masm2c + libdosbox - тулкит для обратной разработки DOS-игр

 , ,

Masm2c + libdosbox - тулкит для обратной разработки DOS-игр

6

2

Вышла первая публичная версия (0.9.6) тулкита для обратной разработки 16 битных DOS-игр: Masm2c и libdosbox.

Допустим, вы решили переписать движок старой любимой игры под ДОС или специализированного DOS-софта. Кроме того что реверс-инжиниринг сложен, задачу усложняет еще и то, что используется сегментная модель памяти (адресация за раз только 64 КБайт памяти одним сегментным регистром), прямой доступ к старому железу.

Если у вас есть бинарник с движком игры, тулкит позволяет сконвертировать его в работающий переносимый код на C++. Каждая инструкция x86 заменяется аналогичной функцией на С++ (native code). Libdosbox используется для эмуляции видео, звуковых устройств и для проверки конвертации каждой инструкции x86. Получается что-то среднее между декомпиляцией и дизассемблированием.

Как результат, далее вы можете переписывать игру используя современные утилиты: gdb, и т.д. Декомпиляция — в отдалённых планах.

Исходники составных частей проекта:
https://github.com/xor2003/masm2c (GPLv3)
https://github.com/xor2003/libdosbox (GPLv2)

Аналогичный инструмент — Spice86. Такие инструменты как Ghidra и reko не выдают рабочий код.

Целью проекта является улучшение игровых движков, а не нарушение авторских прав.

>>> Подробности



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 9)
Ответ на: комментарий от eternal_sorrow

Да по ощущениям, тренд идет на переход на более свободные лицензии , MIT, например. По крайней мере, в данной области, о которой диет речь в данном посте. GPL , как бы помягче выразиться, отдает душком. Это как собака на сене.

Tinker
()
Последнее исправление: Tinker (всего исправлений: 1)

Спасибо за скрин. Stunts, ностальгия прям

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

Загрузить драйвер в UMA.

Но зачем? Ведь драйвер — это код, а

За 640 килобайт можно запулить только данные, код нельзя

Драйвер - не совсем обычная программ

В случае LOADHIGH — самая обычная. Лет 28 назад делал эмулятор мыши клавишами на цифровой клавиатуре в самом обычном турбопаскале, компилируя в самый обычный экзешник, перехватывая int 33h и делая себя резидентом через int 21h.

UMA - в 16-и битном адресном пространстве.

Но всё ещё выше 640к. Такие дела.

gremlin_the_red ★★★★★
()

Для программы ведущей исключительно вычислительную деятельность сгодится? т.е. консольный бинарник читающий\пишущий файлы.

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

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

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

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

А какая задача?

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

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

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

Спасибо за помощь, погляжу как окошко времени будет :) Проект записал, забыть не должен %)

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

Да по ощущениям, тренд идет на переход на более свободные лицензии , MIT, например. По крайней мере, в данной области, о которой диет речь в данном посте. GPL , как бы помягче выразиться, отдает душком. Это как собака на сене.

Это соевый тренд, тащемта

Mold 1.0 (комментарий)

Crocodoom ★★★★★
()

Странно, если я в отсутствии соседей буду инжирить замок, ничего значит не будет, можно, да?

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

Да с тобой после такого забоятся пить четкие пацанчики типа меня.

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

можно сначала запросить исходники у владельцев

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

[code] start: R(STI); // 12 sti R(CLD); // 13 cld R(PUSH(seg_offset(_data))); // 14 push _data R(POP(ds)); // 15 pop ds R(MOV(ah, 9)); // 16 mov ah,9 R(MOV(dx, offset(_data,_msg))); // 17 mov dx,offset _msg R(_INT(0x21)); // 18 int 21h R(MOV(ax, 0x4c00)); // 20 mov ax,4c00h R(_INT(0x21)); // 21 int 21h

struct Memory m = { {0}, // padding {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // segment _data {‘H’,‘e’,‘l’,‘l’,‘o’,’ ‘,‘W’,‘o’,‘r’,‘l’,‘d’,’!‘,’\n’,‘\r’,‘$’}, // _msg … [code]

речь идет о подобном коде? Если да, то главный плюс то, что код собирается и его можно отлаживать.

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

Эту бы энергию, да в мирных целях...

Насильно мил не будешь (c) старая русская пословица

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

GPL - несвободная лицензия, имхо. Свободные лицензии - это те, которые требуют только ставить плашку об авторстве кода в исходниках и упоминать в credits конечного продукта. GPL победив дракона(EEE), сам стал драконом. Или по крайней мере, дубиной в руках гигантов.

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

Здесь есть очень интересный и принципиальный нюанс.

Пермиссивные лицензии типа MIT дают больше свободы тем, кто этот код получил

GPL же даёт больше свободы автору кода

Подумайте над этим 🙂

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

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

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

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

Так его же давно на движок третьекваки портировали же. Зачем его в досе запускать?

ivanlex ★★★★★
()

Только сейчас начинаю въезжать. То есть, прога может достать код и mhdd / victoria для DOS-версии?

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

Например, да. И если исходники открыты - их тоже можно сконвертить

xor2003
() автор топика
Ответ на: комментарий от Tinker

MIT/BSD/public domain удобно для тех кто не собирается дальше делиться кодом, и нажиться на чужих разработках - например крупные компании. GPL - для тех кто хочет чтобы код развивался и не закрывался. В моем случае я немного использовал код других проектов на GPL, и я бы тогда нарушил их лицензию.

xor2003
() автор топика

А кто-нибудь помнит как в Stunts закрыть гараж? Там нужно было какие-то кнопки нажать или как-то ключ применить. Если выехал из гаража и не закрыл его, гонка не начинается.

Кастую pekmop1024

Xintrea ★★★★★
()
Последнее исправление: Xintrea (всего исправлений: 2)

По теме: что-то я не понял, что делают эти инструменты.

Как я понял, инструменты выполняются следующие действия:

Первая часть: берется DOS-бинарник, парсится заголовок, данные из файла раскладываются по секциям. Секции с машинным кодом преобразуются по опкодам инструкций в Си-код. Каждая машинная инструкция преобразуется в одну строку Си-кода, обычно это установка переменных, эмулирующих регистры CS и EIP, и вызов функции R() (видимо от слова run). Внутри функции R() вызываются всякие функции типа AND() / CALL() / CMP(), повторяющие действия опкода.

Вторая часть: реализация переходов с помощью if-ов, switch-ей и goto.

Третья часть: парсинг секций данных и представление их в виде Си кода. Происходит автоматическая разбивка данных на массивы.

Если все это так, то вопрос: какой в этом смысл? По сути, создается слой эмуляции работы процессора. В таком коде смысла мало, это всего лишь повтор ассемблерных инструкций.

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

Xintrea ★★★★★
()

Кстати, не заметил упоминания об одной важной особенности времён MS-DOS. Но которая может всю малину испортить, если не знать.

Это то, что тогда очень любили упаковывать *.exe всякими упаковщиками. Pklite, Exepacker, upx, кучи их были, в том числе часто для защиты.

Если не распаковать перед анализом, толку от результата будет мало, даже если сильно повезёт и заработает.

Были универсальные распаковщики, например, cup386. Часто для распаковки использовали антивирусы, те во временные файлы распаковывали.

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

более свободные лицензии

Я хотел переспросить «свободные для кого», но ТС ниже уже ответил.

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

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

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

Распаковать обычно не проблема. В основном игры используют стандартные Pklite, Exepacker, diet.

xor2003
() автор топика
Ответ на: комментарий от Xintrea

Не совсем так. Сейчас для первичного анализа используется IDA. В будущем вероятно перееду на Ghidra. IDA находит переменные и дает им названия. Эмулятор libdosbox собирает потерянную информацию в процессе выполнения: значения сегментных регистров, размеры и расположение переменных, самомодифицирующийся код. А так же самое главное - эмулятор запускает каждую инструкцию под интерпретатором и сравнивает ее с С-шным кодом, чтобы обнаружить неточности трансляции. Это компенсирует кривизну того что выдает IDA и транслятор. Это основная фишка проекта, дает точность трансляции и за пару дней. А еще IDA не декомпилирует 16 битный код. Я сейчас планирую переделать транслятор чтобы он выдавал более высокоуровневый код. Например используя SMT. Можно странслированный код компилировать в 32/64 бита x86 либо .NET и потом декомпилировать, чтобы удалить лишний код (работу с флагами) и получить высокоуровневый код.

Так что мы получаем тоже самое что дает IDA + проверку исполнением. А еще сгенерированный код можно исполнять, отлаживать в gdb, вставлять трассировки, легко заменять код

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

В планах переход на Ghidra, если надо. Либо можно использовать аналогичный проект Spice86 (использующий Ghidra). У них красивый код на выходе, но сыроватый эмулятор. В любом случае сгенерированный код никак с IDA не связан.

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

Но заявлять, что пермиссивные лицензии «свободнее», чем GPL, забыв уточнить, что речь в основном про свободу паразитов на чужом труде — это жульничество.

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

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

Взяли и автоматизировали сотню Rust разработчиков. :)

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

Зачем улучшать движок которому 30+ лет?

Очевидно, чтобы пофиксить фичи и добавить баги

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

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

Ясно.

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

Ибо ваша аналогия в высшей степени некорректна: собака это сено не сажала, не удобряла, не косила, и в стог не собирала

Аналогия корректная. GPL - это собака(сторож) на сене (код). Или ты программиста считаешь собакой?

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

Знаете примеры использования декомпилятора на python? Angr или еще что? Z3 можно, но не совсем для этого

xor2003
() автор топика
Ответ на: комментарий от hobbit

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

Да. В этом и заключается стихия жизни, борьба за место под солнцем. Деньги - currency, это же «текущее», чья то сконвертированная энергия, время, кровь и пот. Если эти деньги добыты честным способом, то почему вы считаете, что проприетарная разработка приносит зло? Программист GPL тратит здесь и сейчас энергию, время, пот и слезы. А проприетарщик уже потратил их раньше, и у него на руках деньги.

«Мани-мани - это тоже, что улыбка на лице Улыбаются в ладонях и звенят, блестят на солнце» (Mr Credo)

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