2010-01-25:

Syndicate Wars Port - a reverse-engineering tale

reverse engineering:re:assembler:games:gamedev:x86:asm:windows:linux:macosx:c:syndicate wars
Syndicate Wars jest grą z roku 1996, stworzoną przez, nieistniejące już zresztą, studio Bullfrog. Gra została napisana w C (Watcom) pod DOS extender DOS4GW i oczywiście przestała działać (natywnie, pomijam rozwiązania typu emulatory) wraz z pojawieniem się współczesnych systemów operacyjnych typu Windows z serii NT. Kilka lat temu Unavowed, będący wiernym fanem tej produkcji, zaproponował mi stworzenie portu tej gry na współczesne OSy, takie jak GNU/Linux czy Windows. Port miał polegać na dekompilacji pliku wykonywalnego gry, zlokalizowaniu wszystkich funkcji standardowej biblioteki C, zależności względem DOS4GW i funkcji I/O (dźwięk, klawiatura, grafika, myszka, etc), wymienieniu ich na natywne libc oraz libSDL/OpenAL (czasem przy pomocy pewnych wrapperów, czy wręcz konwerterów), oraz ponowną rekompilacje do plików wykonywalnych. Dzisiejszego wieczoru udało nam (bo to Unavowed był wyraźnym liderem tego projektu) się ów projekt ukończyć, oraz opublikować, i to nie tylko na zakładane systemu GNU/Linux oraz Windows, ale i dodatkowo na Mac OS X!

Link do strony projektu (są tam screenshoty, video, oraz download'y):
http://swars.vexillium.org/

I jeszcze trochę "mediów":

GNU Screenshot 1GNU Screenshot 2Mac OS Screenshot 1



Zapraszam do komentowania :)
Jeśli chodzi o stronę techniczną projektu, to opiszę ją w kolejnym poście.

Comments:

2010-01-25 01:59:29 = Komeniusz
{
---
configure: error: Sorry, this Syndicate Wars port will only run on i386 processors
---

Ale cóż... I tak gratuluję i pozdrawiam ;D
}
2010-01-25 09:12:22 = Jurgi Filodendryta
{
Perełkowa robota, gratulacje. Może i inne klasyczne gry dałoby/chciałoby się tak…? Ale, mam jeszcze jedno pytanie, ciekawi mnie, jak wygląda sprawa legalności tego przedsięwzięcia?
}
2010-01-25 10:28:26 = Gynvael Coldwind
{
@Komeniusz
Hehe jak pisałem wyżej, była to disassemblacja->rekompilacja, a nie przepisywanie kodu na C, więc niestety jest to zależne od platformy. Tak więc i386 wymagane ;>
Anyway thx :)

@Jurgi
Thx :)
Co do innych gier - może kiedyś. DOSBox daje radę, a to jest na prawdę maaasaaa roboty... :)
Co do legalności, to jest to faktycznie bardzo ciekawy przypadek. Zgodnie z tym co mi wiadomo, to nasz patch jest jak najbardziej legalny, ponieważ patch sam w sobie nie łamie praw autorskich (na patch składają się nasze wrappery czy też konwertery i kilka funkcji dodających/zmieniających pewną funkcjonalność, jak i oczywiście funkcje inicjalizacyjne). Owszem, powstał on korzystając z wiedzy zdobytej przy użyciu technik RE, natomiast to nie jest przetłumaczony kod assemblera na C (co by było łamaniem praw autorskich), a jedynie zestaw hooków i zmian w kodzie (gdzie i hooki i zmiany kodzie są naszym dziełem), które nie powstało na bazie gry, a jedynie jest do niej dopasowane, więc nie łamią praw autorskich. Dodatkowo licencja gry nie zabrania reverse-engineeringu (zresztą nawet nie wiem czy by mogła).
Jeżeli chodzi o dystrybuowanie zestawu patch+dissassembling pliku wykonywalnego, to to faktycznie jest kwestionowalne, ponieważ prawa autorskie do tej drugiej części zestawu ma Bullfrog (nieistniejący już), lub też firma która ich wykupiła (EA). Tutaj odrobinę naciągamy strunę, natomiast zestaw jest udostępniony w dobrej wierze, dla osób które zakupiły oryginał gry (który jest wymagany do uruchomienia Syndicate Wars Port) i które nie mogą jej uruchomić na współczesnych systemach operacyjnych. Jeżeli właściciele praw autorskich dadzą nam znać, że im się to nie podoba, to zdejmiemy disassembling ze strony, a dystrybuować będziemy jedynie patch (co jest mniej wygodne dla klientów Bullfrog, ponieważ będą musieli sami skompilować sobie port).
Tak więc, we shall see ;>

}
2010-01-25 11:36:16 = Krzysztof Kotowicz
{
W Polsce to legalne (w skrócie - zmieniasz program, na kóry masz licencję, żeby działał z innymi programami). Więcej - posiadacz praw nie może Ci tego zabronić:

http://pl.wikisource.org/wiki/Prawo_autorskie_(ustawa)

Art. 75.
2. Nie wymaga zezwolenia uprawnionego:
(...)
2) obserwowanie, badanie i testowanie funkcjonowania programu komputerowego w celu poznania jego idei i zasad przez osobę posiadającą prawo korzystania z egzemplarza programu komputerowego, jeżeli, będąc do tych czynności upoważniona, dokonuje ona tego w trakcie wprowadzania, wyświetlania, stosowania, przekazywania lub przechowywania programu komputerowego,
3) zwielokrotnianie kodu lub tłumaczenie jego formy w rozumieniu art. 74 ust. 4 pkt 1 i 2, jeżeli jest to niezbędne do uzyskania informacji koniecznych do osiągnięcia współdziałania niezależnie stworzonego programu komputerowego z innymi programami komputerowymi, o ile zostaną spełnione następującewarunki:

a) czynności te dokonywane są przez licencjobiorcę lub inną osobę uprawnioną do korzystania z egzemplarza programu komputerowego bądź przez inną osobę działającą na ich rzecz,
b) informacje niezbędne do osiągnięcia współdziałania nie były uprzednio łatwo dostępne dla osób, o których mowa pod lit. a),
c) czynności te odnoszą się do tych części oryginalnego programu komputerowego, które są niezbędne do osiągnięcia współdziałania.
3. Informacje, o których mowa w ust. 2 pkt 3, nie mogą być:

1) wykorzystane do innych celów niż osiągnięcie współdziałania niezależnie stworzonego programu komputerowego,
2) przekazane innym osobom, chyba że jest to niezbędne do osiągnięcia współdziałania niezależnie stworzonego programu komputerowego,
3) wykorzystane do rozwijania, wytwarzania lub wprowadzania do obrotu programu komputerowego o istotnie podobnej formie wyrażenia lub do innych czynności naruszających prawa autorskie.

Art. 76.
Postanowienia umów sprzeczne z art. 75 ust. 2 i 3 są nieważne.
}
2010-01-25 22:25:11 = Gynvael Coldwind
{
@Krzysztof Kotowicz
Dzięki! ;> Przyda się ;>
}
2010-01-25 23:28:17 = Yarek
{
Zawsze zadziwiali mnie ludzie robiący takie cuda O_O
Ostatnio pocinam we "Frontier: first encounters", który oczywiście nie chce działać na współczesnych, kompatybilnych wstecz systemach :P Na szczęście powstały już odpowiednie dodatki umożliwiające grę ;)
Mam nadzieję, że to nie ostania gra którą bierzecie na warsztat ;)
Stare gry rządzą ;)
}
2010-01-25 23:35:49 = Yarek
{
Edit/

dopiero zajrzałem na waszą stronkę poświęconą projektowi, he he widzę, że już z patchem do wyżej wymienionego frontiera zapoznaliście się ;)
}
2010-01-26 13:10:12 = Riddlemaster
{
Gratulacje! Ciekawy projekt :)
}
2010-01-26 18:01:27 = mefistotelis
{
Bardzo się cieszę, że komuś starczyło determinacji na takie cudo.

Sam bawię się trochę grami Bullfroga, ale przepisuję kod do C/C++.

Być może w projekcie pomoże wam ten kod:
https://sourceforge.net/projects/holomenu/
Przy jego pomocy można dużą część menu kompilować z C.

Pomocny może też być:
http://keeper.lubie.org/html/dk_keeperfx_dwnld.php
DK wyszło rok po SW i wiele rzeczy (obsługa grafiki, myszki, plików, renderowanie wielokątów) jest tam niemal identyczne; coś więcej na ten temat napisałem tutaj:
http://pl.wikipedia.org/wiki/Bullfrog_engine
Jestem pewien że będziemy w kontakcie.

Pozdrawiam i powodzenia!
}
2010-01-27 22:18:28 = Unavowed
{
mefistotelis:
Dzięki za linki i za umieszczenie linka do naszego portu na syndicate.lubie.org. Rzeczywiście, wygląda to ciekawie i myślę że w miarę łatwo można by pewną część przenieść do C. Największą zaletą przepisania gry w C byłoby uwolnienie jej od x86, ale do tego trzeba by przepisać całość i byłby to olbrzymi projekt. Raczej nie mamy z Gynvaelem tyle wolnego czasu, żeby się w to angażować, ale fajnie, że coraz więcej materiałów jest dostępnych na temat Syndicate Wars, może znajdzie się ktoś chętny do przejęcia pałeczki.

Nie wiedziałem wcześniej o projekcie przepisania DK; widzę że wykonałeś już masę pracy. Trzymam kciuki za jego ukończenie i czekam na dzień, kiedy będę mógł sobie go zainstalować przez apt-get na amd64! ;-)
}
2010-01-28 01:20:00 = Gynvael Coldwind
{
@Yarek
:)
Co do innych gier, to się okaże - póki co planów takich nie ma, ale nigdy nic nie wiadomo :)

@Riddlemaster
Dzięki :)

@mefistotelis
Thx za linki, i dzięki za podlinkowanie nas na syndicate.lubie.org (pierwszorzędna strona btw, nie raz zdarzyło mi się ją odwiedzić :)!
Co do kontaktu, to jestem jak najbardziej za :)
}
2010-01-28 21:05:31 = Jurgi Wyśmiewca
{
Zdaję sobie sprawę, ile to jest roboty (właśnie dlatego sam nie zostałem koderem, hahaha). Czekam (i zachęcam) na opublikowanie szczegółowego opisu, jak tego dokonałeś, jeśli nie ty, może kto inny się skusi na odnawianie dawnych, kultowych gier. Jeszcze raz wyrazy uznania i pokłony.
}
2010-01-29 08:43:34 = SEO blog
{
To była super gra, z niesamowitym klimatem. Dużo w ty grywałem :)
}
2010-02-02 00:04:06 = quetzalcoatl
{
Po prostu szok. Raz, że akurat SW (już myślałem, że historia zapomniala SW i UFO :) ), dwa, że faktycznie znaleźliście czas na to. Brawo!
}
2010-02-02 15:16:43 = Gynvael Coldwind
{
@Jurgi
Hehe thx :)
Co do opisu, jest on już po angielskojęzycznej stronie lustra. Natomiast po PL pojawi się w innej formie.

@SEO blog
Popieram :)
(btw, pozycjonujesz się, czy SEO blog to Twój nick ? ;p)

@quetzalcoatl
Thx :)
}
2010-02-06 12:58:47 = mefistotelis
{
Jakiego narzędzia użyliście do wygenerowania kodu ASM w AT&T syntax?

Czy generował go bezpośrednio disassembler, czy może już po dezasemblacji zrobiliście konwersję?
}
2010-02-06 14:54:34 = Gynvael Coldwind
{
@mefistotelis
Unavowed napisał disassembler (oparty o engine z binutils) który generował kompilowalny kod AT&T, tak więc konwersja nie była już konieczna :)
}
2011-02-17 10:24:51 = Jan_Niezbedny
{
Genialna robota, szacuneczek :)
}

Add a comment:

Nick:
URL (optional):
Math captcha: 9 ∗ 10 + 7 =