Kérdés:
A játék adatstruktúráinak fordított tervezése
puelo
2014-10-20 13:33:52 UTC
view on stackexchange narkive permalink

Jelenleg egy fordított kódmérnöki szemináriumon veszek részt informatika: játékmérnöki tanulmányaim miatt, és az "Adatszerkezetek azonosítása" témakört kaptam. A témavezetőmmel folytatott széles körű beszélgetés után mindketten arra a következtetésre jutottunk, hogy lenne értelme, hogy a témát ötvözöm a játék bináris fájljainak visszafordításával. A teljesítésünk egy 15 oldalas papír és egy kis eszköz, amely megvalósítja azokat a technikákat, amelyekről a cikkben beszélünk. Nem feltétlenül kell új technikát kitalálnunk.

Már kutattam a reverz mérnöki adatstruktúrákról általában, és többnyire olyan eszközökkel álltam elő, amelyek automatikusan visszafordítják az adatstruktúrákat a bináris futtatással szemben (pl. https://www.utdallas.edu/~ zxl111930 / file / Rewards_NDSS10.pdf)

Most a kérdésem a következő: Mi lenne ésszerű programozható eszköz vagy technika, amiről írhatnánk a videojáték-bináris fájlok adatstruktúráinak (például World of Warcraft)? A fenti cikkben említett módszer továbbra is alkalmazható a játék bináris fájljaira, vagy vannak más ismert technikák?

Van némi tapasztalatom a fordított tervezésről, de közel sem vagyok "pro" - szint. Leginkább egy Windows (x64) platformon dolgozom.

A cikk megemlíti a * típusú terjedés * felismerését az alprogramokban. Ezt meglehetősen sikeresen tudtam megvalósítani, hogy felfedezzem egy bonyolult RTS-játék belső szerkezetét. (De segített, hogy a saját szétszerelőmet a semmiből írtam; ezt egyszerűen fel lehetett ragasztani.)
Három válaszokat:
Guntram Blohm supports Monica
2014-10-20 14:45:39 UTC
view on stackexchange narkive permalink

Mellékjegyzet: A WoW vagy bármely hasonló MMORPG valószínűleg rossz célpontja a kutatásának, mert ezek közül sok különböző hackelés, csalás vagy palackozás elleni technikával rendelkezik, amelyek valószínűleg észlelik, amit csinál .

Korántsem vagyok ennek szakértője, de a közelmúltban szétszereltem és megpróbáltam hobbi projektként megérteni egy 20 éves játékot. A futtatható fájl mérete 800 KB, az IDA körülbelül 1750 funkciót észlelt benne, amelyek közül 250 C / C ++ könyvtárfunkció volt. Mondanom sem kell, hogy elég sok időt töltöttem azzal, hogy különböző funkciókat néztem, és ellenőriztem az általuk használt húrokat anélkül, hogy túl sokat értettem volna.

Az áttörést számomra az hozta meg, amikor megtudtam, hogy a fordító hogyan kezelte az osztály felépítését; minden osztály konstruktor meghív egy malloc () szerű függvényt (a méret paraméterként), majd meghívja a szuperosztály konstruktorát, majd inicializálja a metódusokat (nincs megnézhető, mint a modernebb fordítóknál; A fordító minden "függvénymutatót" egyenként inicializál) és osztályváltozókat. A malloc () hívások keresztreferenciája, a lefoglalt osztályok méretének ellenőrzése és a "konstruktor hívja a szuperosztályú konstruktort" láncolatának követése azonnal képet adott a teljes osztályfáról és az egyes osztályok méretéről osztály.

Ezenkívül kaptam egy ötletet arról, hogy melyik függvény melyik alosztályának metódusa volt a fő osztály egyik másik függvényének, ami sok betekintést engedett e funkciók céljába, mivel tudtam, melyik függvény osztály melyik osztályának módszere volt, elég könnyű volt követni a függvény this mutatóját, nyomon követni annak következtetéseit, és megtudni, hogy melyik class elemet használták egész-, dupla- vagy pointertípusként, és mutatók esetén tudd meg, melyik másik osztálytípusra mutattak.

Ez volt az első expozícióm az IDA-nak, így semmit sem tudtam a parancsfájl-készítő képességeiről, és akkor kezdtem el tanulni őket, amikor a dolgok túlságosan ismétlődnek; ha most ugyanezt kellene tennem, valószínűleg sok mindent szkriptelek / automatizálok, amit manuálisan.

Úgy gondolom, hogy ez még könnyebb lehet a modern C ++ fordítókkal, amelyek kiszámítható módon használják a vtable-eket; ellenőrizze, hogy a vtable-k hova vannak rendelve, hogy megtudja, hol osztályoznak példányokat; ellenőrizze a szuperosztály-konstruktor hívásokat, hogy megismerje az osztály hierarchiáját; ellenőrizze a méreteket a malloc / new hívásokban a struktúra / osztály méretének megszerzéséhez; kövesse az this mutatókat az osztály metódusaiban (amelyek a vtables segítségével könnyen azonosíthatók), hogy megtudja, hogyan használják az elemeket. Mindez statikus elemzéssel végezhető el, így nem is kell sokat törődnie azzal, hogy a csalás / hibakeresés elleni technikák hogyan befolyásolhatják az eredményt.

Köszönöm a részletes választ. Mivel inkább statikusan elemezném, mindenképpen utánanézek a vtable-vel való együttműködésnek. Válaszát legkésőbb holnapig "helyesnek" jelölöm meg abban a reményben, hogy talán még kapok még valamilyen információt. Eddig is köszönöm!
Paul
2014-10-20 17:35:06 UTC
view on stackexchange narkive permalink

Ez a válasz csak annak bővítésére szolgál, amit @Guntram Blohm mondott.

Ez a kérdés valóban széles körű választ adni a válaszra, ezért azt a feltételezést fogom tenni, hogy a fordított mérnöki x86 / x64 natív futtatható fájlok Windows rendszeren (nem bájtkódos nyelvek, például Java és .NET). Először is hadd mondjam el, hogy ez nem teljes a módszerekkel, mivel nagyon sokféle dolog függ annyi mindentől. Az alábbiakban felsoroljuk azokat a lehetséges dolgokat, amelyek befolyásolhatják a fordított mérnöki technikákat:

  • Windows verzió (Sok régebbi eszköz csak XP-n fut, ezért van egy virtuális gép-beállításom az XP-hez. De nem minden játékok XP-n futnak)
  • Futtatható architektúra (nem minden hibakereső multi architektúra)
  • Natív vagy bytecode nyelv (A bytecodes dekompilálható)
  • A fordítók egyes fordítók kitesznek metaadatok, amelyek hasznosak lehetnek a fordított tervezéshez. (A PEiD segítségével megtudhatja, hogy mire fordította a futtatható fájlt. Megjegyzés: A csomagolók mégis elfedhetik azt, amit eredetileg összeállítottak.)
  • Védelem, például csomagolók vagy csalásgátlók (túl sok válasz nélkül off-topic Ha új kérdést szeretne feltenni, és szívesen válaszolok rá)

1. módszer: Először végezze el a kutatását, és megtalálhatja a játékmotor SDK, amely az összes adatstruktúrával rendelkezik, és ha van némi módosítás, ellenőrizze a 2. módszert.

2. módszer: Ha egy adott adatstruktúrát akart keresni hogy megtalálja a játékosok egészségét. Ha a Cheat Engine-ben megtalálta egészségét, akkor a Cheat Engine hibakereső segítségével megnézte, mi írja rá.

Tegyük fel, hogy ezt az utasítást mi írtuk az egészségünk értékére:

  MOV [EAX + 32], EBX  

Tudjuk, hogy a +32 az adatstruktúra ellensúlya, amely egészséget rejt magában. Amellyel olyan eszközt használhatna, mint a ReClass, hogy segítse Önt vagy struktúráját a Cheat Engine-ben.

Miután ezt megtette, megváltoztathatja az egyes változóknál tartott értékeket, és megnézheti, hogy ezek vizuálisan befolyásolják-e a játékot. Ha nem sikerül megoldania, akkor az összes regiszterben beállíthatja a bp-t az alapcím-regiszter értékéhez és az összetett töréspont-feltételek eltolásához. Amint eléri a töréspontot, át kell lépnie az összeállítási opkódokon, hogy kipróbálja a címet.

Érdemes ellenőrizni az EAT-t a kitett funkciók vagy adatok esetleges tippjei miatt. is.

Azt javasoljuk, hogy szerezze be magának a következő eszközöket:

  • Cheat Engine
  • IDA PRO
  • PEiD
  • ReClass
Hálás vagyok a válaszáért: Tudom, hogyan lehet manuálisan megtalálni a struktúrákat a játék közben személyesen birtokolt információk alapján (például az egészségügyi példája). Feladatom olyan technikák bemutatása és részleges megvalósítása, amelyek automatikusan elvégzik az ilyen jellegű dolgokat. Van néhány javaslatod erre?
Helyes feltételezésem, hogy a Windows és a reverz mérnöki natív szoftver használata előtt hozzászólásomat szerkesztem.
Oh Bocsánat. Igen, feltételezése igaz!
Attila
2014-10-21 05:46:00 UTC
view on stackexchange narkive permalink

Ha más megközelítést fontolóra vesz, azaz statikusan elemzi az adatformátumokat bináris végrehajtás nélkül, azt javaslom, hogy nézze meg ezt a blogbejegyzést, amely leírja az "ismeretlen bináris formátumok vizsgálatának módszereit" vagy fájl, fájlrészlet vagy memóriakiíratás. "



Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...