Войти
ФлеймФорумПрограммирование

Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++) (13 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 18 9 10 11 12 13
#180
(Правка: 9:01) 8:59, 21 сен. 2021

Gradius
> P.S. К слову, в exe-шнике "Raptor" также есть отладочная инфа, что делает
> процесс реверса более приятным и осмысленным!
Интересно, а на объявленный местный конкурс 2D шутеров такие сделанные игры допускаются?
(вроде ничто этому не препятствует :)


#181
23:06, 21 сен. 2021

Gradius
> в конце exe-шника игры была отладочная информация. Имена всех глобальных функций игры и почти все имена глобальных переменных - восстановлены мной без проблем.
Читер. Настоящие мужики декомпилируют без символов.

#182
0:23, 22 сен. 2021
Настоящие мужики декомпилируют без символов.

И рыдают как дети, когда читают результат :)
#183
22:36, 22 сен. 2021

baga
Я 4 игры зареверсил до неплохого состояния. Около 2 лет на игру, если неспеша

#184
2:16, 1 окт. 2021

Потрясающая работа! Было интересно читать хронику процесса переноса DOS-программы на новые платформы.
Хотя можно заметить, что итоговые исходники после реверса ничем не отличаются от обфусцированных.
Что насчет dosbox как рантайм библиотеки? Подключил его к своему приложению, закинул блоб старой игры в память, получится еще быстрее ("Я ищу быстрые и системные методы!").

#185
2:56, 1 окт. 2021

Ради интереса скачал сборку open-watcom v2, с помощью утилиты wdump распечатал отладочную информацию в тексте: wdump.exe -d -Dx tube\MAIN.EXE >dbglog.txt
в результате видим, что в символах имеются даже локальные символы (аргументы?).
tube_dbginfo.png | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)

#186
(Правка: 3:54) 3:52, 2 окт. 2021

strang3r
> Что насчет dosbox как рантайм библиотеки? Подключил его к своему приложению,
> закинул блоб старой игры в память, получится еще быстрее ("Я ищу быстрые и
> системные методы!").

ДОС-бокс кушает много памяти, ну и это эмуляция ещё.  Мои консоли не потянут его. Мне было интересно получить "Tube" как нативное приложение для консолей.

strang3r
> Ради интереса скачал сборку open-watcom v2, с помощью утилиты wdump распечатал
> отладочную информацию в тексте: wdump.exe -d -Dx tube\MAIN.EXE >dbglog.txt
> в результате видим, что в символах имеются даже локальные символы (аргументы?).

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

#187
16:05, 2 окт. 2021

Gradius

но потом понял, что будет великий головняк с парсингом данных и решил ограничиться только именами функций и глобальными преременными

Там особо углубляться и не нужно, достаточно смотреть на значение BP_OFFSET_XXX, где xxx может быть byte , word. Если число с положит. значением - то это смещение параметра в стеке, если с отриц. значением, то переменная функции - получаем его абсолют. значение и в IDA смотрим в списке стековых переменных по данному смещению.
tube_localvars | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)

#188
(Правка: 16:23) 16:20, 2 окт. 2021

Можно было еще сделать разбивку кода на модули.
В конце дампа после wdump можно найти список регионов памяти загруженной программы с информацией, к какому модулю относится эта переменная или функция.
Например, интересующая меня функция trig, которая на гитхабе выглядит довольно страшной, относится к модулю с id = 15 (poly.asm) . Это дает нам информацию о том, что из функции хорошо структурированного кода можно и не получить, так как это было написано на ассемблере. По ассемблерным функциям в отлад. символах минимум информации - только название публичных символов видимо, в отличие от Cишных собратьев.
tube_moduleInfo2 | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)
tube_moduleInfo | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)

#189
16:34, 2 окт. 2021
tube_moduleInfo3 | Дизассемблер IDA Pro 7.5 для восстановления исходного кода игры (C/C++)
#190
17:32, 2 окт. 2021

С помощью программы 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 кб - в которых по прикидкам примерно треть-половина - это разные обвязки вокруг системы, рантайм библиотека.

modules

#191
(Правка: 3:44) 2:46, 3 окт. 2021

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:

https://github.com/rep-stosw/tube64

#192
16:33, 3 окт. 2021

Gradius

Про SOS я уже писал в этой теме. Это закрытая либа. 
 Гораздо проще было написать свой код микшера звука, а плеер музыки HMI взял с гитхаба. Об этом я тоже здесь писал.
Это даже не трогал. Просто завёл на libc. Плюс заменил open, read, write,...  на более привычные fopen, fread, fwrite.
Согласен, библиотечные функции незачем реверсить окромя случая, когда они модифицированные. Как я и говорил раньше, работа по портированию выполнена отлично по соотношению затраченное время-итоговый результат.
Но если  смотреть чисто с утилитарной т.з., например модификации кода, то указанная в шапке цель "восстановление исходного кода игры" находится на начальном этапе(частично деобфусцированные исходники).
Ладно, не буду больше обламывать малину, все таки в рунете редко встречаются такого масштаба работы в паблике. Дорогу осилит идущий.
#193
2:21, 4 окт. 2021

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

Шапка шапкой, а в нуль-посте обозначена конечная цель, которая выполнена.  Процитирую:

Gradius
> Обозначу сразу поле исследования: рекомпиляция (воссоздание исходного кода на
> C/C++ с целью портирования игр на Win32 и свои платформы) старых DOS-игр,
> работающих в защищённом(32-битном) режиме с помощью досэкстендера (типа DOS4GW)
> и написанные на Watcom C 9+.

https://gamedev.ru/flame/forum/?id=262348&m=5419300#m0

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

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

#194
2:47, 4 окт. 2021

Gradius
> Про SOS я уже писал в этой теме. Это закрытая либа. Сайт разработчика умер. В
> интеренет ищутся сишные хедеры этой библиотеки и бинарные либы с драйверами.

Кстати, недавно нашёл отреверсенный код HMI-плеера, который играет музыку в Tube и других знаменитых играх:

https://github.com/nukeykt/HMIPlay

Но с ним не работал, так как ранее ввёл в эксплуатацию другой код HMI-плеера:

https://github.com/arbruijn/hmpopl-em

Страницы: 18 9 10 11 12 13
ФлеймФорумПрограммирование