Jak załatano Ratchet & Clank 3, czyli brudne sztuczki programistów gier
W czasie niedawnej wyprzedaży na PS Store kupiłem zestaw gier, które pamiętam z PlayStation 2. Była to antologia serii Ratchet & Clank.
Chcąc przypomnieć sobie więcej na ich temat, znalazłem całą wiki poświęconą grom o tych bohaterach i natrafiłem na interesującą informację na temat sposobu, w jaki twórcy (Insomniac Games) naprawili niedziałającą edycję gry Ratchet & Clank: Up Your Arsenal (czyli trzecią z kolei w serii).
Gra wyposażona była w funkcje online - gracze mogli współzawodniczyć ze sobą przez Internet (więcej o graniu przez Internet na PS2 pisałem w zeszłym roku). Gry w tamtych czasach często nie miały funkcji aplikowania łatek (mówiąc brzydko, patchowania). Gdy zachodziła taka potrzeba, w grach na PC ściągało się osobny plik .exe i uruchamiało, najczęściej wskazując na katalog instalacji gry. Konsole nie posiadały tej całej infrastruktury Playstation Store czy Xbox Live, która służy do aktualizacji i ściągania gier.
Gra, która została wysłana do sklepów, również nie miała wbudowanej funkcji aktualizacji.
Gdy przyszła potrzeba zaaplikowania patcha do gry, Insomniac Games musieli znaleźć metodę zrobienia tego bez (co wtedy stosowano) rozsyłania do sklepów płyty z patchem. Zaczęli więc szukać luki we własnym kodzie, o czym opowiedział po latach programista firmy w wypowiedzi dla Game Developer Magazine:
Buffer overflow, czyli przepełnienie bufora, to często wykorzystywana przez hackerów technika nadpisywania regionów w pamięci, których normalnie nie powinniśmy nadpisać.
Jonathan Garrett i jego ekipa nadpisali w ten sposób adres funkcji, która miała stały adres, powodując, że wykonała ona polecenie ściągnięcia aktualizacji gry.
Jednym z wyzwań była konieczność napisania kodu dekodującego, ponieważ funkcja pobierająca EULA zatrzymywała się przy wykryciu bajtu o wartości 0 - co często trafiało się w kodzie. W związku z tym najpierw wysłano funkcję dekodującą (napisaną specjalnie tak, aby kod 0 w niej nie wystąpił), która następnie dekodowała dalszy ciąg przesłanego patcha i uruchamiała go.
Akcja przeprowadzona została z powodzeniem - udało się dodać łatkę wszystkim graczom sieciowym. Od tego czasu każda gra posiada już funkcje aktualizacji, a buffer overflow jest bardzo rzadkim przypadkiem - standardowo sprawdza się w kodzie gier i programów tego typu błędy w trakcie tzw. analizy statycznej kodu. Przypadek Ratcher & Clank 3 jest przykładem partyzanckiej i sprytnej metody aktualizacji, której nie przewidzieli nawet sami twórcy gry.
*Wykorzystałem informacje znalezione w serwisie dla producentów gier GamaSutra oraz w starych numerach Game Developer Magazine.