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.