Gradius
> P.S. К слову, в exe-шнике "Raptor" также есть отладочная инфа, что делает
> процесс реверса более приятным и осмысленным!
Интересно, а на объявленный местный конкурс 2D шутеров такие сделанные игры допускаются?
(вроде ничто этому не препятствует :)
Gradius
> в конце exe-шника игры была отладочная информация. Имена всех глобальных функций игры и почти все имена глобальных переменных - восстановлены мной без проблем.
Читер. Настоящие мужики декомпилируют без символов.
Настоящие мужики декомпилируют без символов.
И рыдают как дети, когда читают результат :)
baga
Я 4 игры зареверсил до неплохого состояния. Около 2 лет на игру, если неспеша
Потрясающая работа! Было интересно читать хронику процесса переноса DOS-программы на новые платформы.
Хотя можно заметить, что итоговые исходники после реверса ничем не отличаются от обфусцированных.
Что насчет dosbox как рантайм библиотеки? Подключил его к своему приложению, закинул блоб старой игры в память, получится еще быстрее ("Я ищу быстрые и системные методы!").
Ради интереса скачал сборку open-watcom v2, с помощью утилиты wdump распечатал отладочную информацию в тексте: wdump.exe -d -Dx tube\MAIN.EXE >dbglog.txt
в результате видим, что в символах имеются даже локальные символы (аргументы?).
strang3r
> Что насчет dosbox как рантайм библиотеки? Подключил его к своему приложению,
> закинул блоб старой игры в память, получится еще быстрее ("Я ищу быстрые и
> системные методы!").
ДОС-бокс кушает много памяти, ну и это эмуляция ещё. Мои консоли не потянут его. Мне было интересно получить "Tube" как нативное приложение для консолей.
strang3r
> Ради интереса скачал сборку open-watcom v2, с помощью утилиты wdump распечатал
> отладочную информацию в тексте: wdump.exe -d -Dx tube\MAIN.EXE >dbglog.txt
> в результате видим, что в символах имеются даже локальные символы (аргументы?).
Да, так оно и есть. Тоже хотел по началу получить число и типы аргументов, но потом понял, что будет великий головняк с парсингом данных и решил ограничиться только именами функций и глобальными преременными(надеясь в то время - непогрешимостью декомпилятора. Впоследствии скорректировав вручную его недочёты, раскуривая АСМ).
Gradius
но потом понял, что будет великий головняк с парсингом данных и решил ограничиться только именами функций и глобальными преременными
Там особо углубляться и не нужно, достаточно смотреть на значение BP_OFFSET_XXX, где xxx может быть byte , word. Если число с положит. значением - то это смещение параметра в стеке, если с отриц. значением, то переменная функции - получаем его абсолют. значение и в IDA смотрим в списке стековых переменных по данному смещению.
Можно было еще сделать разбивку кода на модули.
В конце дампа после wdump можно найти список регионов памяти загруженной программы с информацией, к какому модулю относится эта переменная или функция.
Например, интересующая меня функция trig, которая на гитхабе выглядит довольно страшной, относится к модулю с id = 15 (poly.asm) . Это дает нам информацию о том, что из функции хорошо структурированного кода можно и не получить, так как это было написано на ассемблере. По ассемблерным функциям в отлад. символах минимум информации - только название публичных символов видимо, в отличие от Cишных собратьев.
С помощью программы LinqPad выполняем простенький скрипт для выцепления названий модулей.
var dbginfotxt = @"С:\tmp\ow\tube_dbginfo.txt"; var lines = File.ReadAllLines(dbginfotxt); foreach(var line in lines){ var m = Regex.Match(line, @"\d+\)\s+Name: \s+.+?$"); if(m.Success){ Console.WriteLine(m.Value.ToString()); } }
Код содержит некую soslib - возможно аббревиатура sound output system, занимающей 1/7 числа модулей.
Много модулей в виде 1 функция - 1 модуль (fseek, ftell, chktty etc).
Общий размер кода в бинарнике ~ 200 кб - в которых по прикидкам примерно треть-половина - это разные обвязки вокруг системы, рантайм библиотека.
strang3r
> Код содержит некую soslib - возможно аббревиатура sound output system,
> занимающей 1/7 числа модулей.
Про SOS я уже писал в этой теме. Это закрытая либа. Сайт разработчика умер. В интеренет ищутся сишные хедеры этой библиотеки и бинарные либы с драйверами.
Я не реверсил код воспроизведения музыки и звуков. Потому что это и не нужно. Гораздо проще было написать свой код микшера звука, а плеер музыки HMI взял с гитхаба. Об этом я тоже здесь писал.
strang3r
> Много модулей в виде 1 функция - 1 модуль (fseek, ftell, chktty etc).
Это даже не трогал. Просто завёл на libc. Плюс заменил open, read, write,... на более привычные fopen, fread, fwrite.
---
Кстати, в последней версии Tube (Tube64), я снёс придурошный аллокатор памяти и заменил его на всеми привычные malloc/free:
Gradius
Про SOS я уже писал в этой теме. Это закрытая либа.
Гораздо проще было написать свой код микшера звука, а плеер музыки HMI взял с гитхаба. Об этом я тоже здесь писал.
Это даже не трогал. Просто завёл на libc. Плюс заменил open, read, write,... на более привычные fopen, fread, fwrite.
Согласен, библиотечные функции незачем реверсить окромя случая, когда они модифицированные. Как я и говорил раньше, работа по портированию выполнена отлично по соотношению затраченное время-итоговый результат.
Но если смотреть чисто с утилитарной т.з., например модификации кода, то указанная в шапке цель "восстановление исходного кода игры" находится на начальном этапе(частично деобфусцированные исходники).
Ладно, не буду больше обламывать малину, все таки в рунете редко встречаются такого масштаба работы в паблике. Дорогу осилит идущий.
strang3r
> Но если смотреть чисто с утилитарной т.з., например модификации кода, то
> указанная в шапке цель "восстановление исходного кода игры" находится на
> начальном этапе(частично деобфусцированные исходники).
Шапка шапкой, а в нуль-посте обозначена конечная цель, которая выполнена. Процитирую:
Gradius
> Обозначу сразу поле исследования: рекомпиляция (воссоздание исходного кода на
> C/C++ с целью портирования игр на Win32 и свои платформы) старых DOS-игр,
> работающих в защищённом(32-битном) режиме с помощью досэкстендера (типа DOS4GW)
> и написанные на Watcom C 9+.
https://gamedev.ru/flame/forum/?id=262348&m=5419300#m0
Для меня было главное заставить полученный код компилироваться под разные платформы.
Задача тотального восстановления структур данных не ставилась, так как не предполагается, что этот код будет кто-то в дальнейшем сопровождать. Пускай этим занимаются те, кому это нужно.
Gradius
> Про SOS я уже писал в этой теме. Это закрытая либа. Сайт разработчика умер. В
> интеренет ищутся сишные хедеры этой библиотеки и бинарные либы с драйверами.
Кстати, недавно нашёл отреверсенный код HMI-плеера, который играет музыку в Tube и других знаменитых играх:
https://github.com/nukeykt/HMIPlay
Но с ним не работал, так как ранее ввёл в эксплуатацию другой код HMI-плеера: