Kérdés:
Reverse engineering a VC++ video game
sasho648
2013-07-13 23:39:56 UTC
view on stackexchange narkive permalink

Tehát ismerem az x86 gépi nyelvet és a C ++ / C nyelvet. Az elmúlt hetekben elköteleztem magam a Windows belső és különösen a PE formátum megtanulása mellett. Célom a Tomb Raider A sötétség angyala forráskód fájlok letöltése. Ez egy 10 évvel ezelőtt (2003) megjelent 3d videojáték, amely mind C, mind C ++ nyelven íródott. A kódot mind a VC ++ 6.0, mind az Intel C ++ 7.1 verzióval állították össze. A fájlok, amelyekből megpróbálom kitalálni a kezdeti forráskódot, PE formátumú futtatható fájlok, amelyekhez tartozik a nyilvános szimbólumokkal ellátott ProgramDataBase fájl (v2.0). Nevük TRAOD, TRAOD_P3 és TRAOD_P4 (a fájlkiterjesztést (.exe.PDB nélkül), mivel az elsőt a vc ++, a másikat pedig az ic ++ - val fordítják le Pentium 3 és Pentium 4 célprocesszorokhoz.

Az IDA Pro segítségével megnyitottam a futtatható fájlokat és feltérképeztem az PDB szimbólumait. Aztán lefordítottam a gép utasításait a C ++ ekvivalenseikre, és egy nagy gyorsítótár fájlba tettem őket. Ezután a dbh.exe fájlt használtam a függvények megfeleltetési forrásfájljaikba való feltérképezéséhez (mert az PDB fájlokban a nyilvános funkciók forrássorának információi voltak). De mielőtt a következő függvényre léptem, a teszt futtatható verziójában összeállítottam a vc ++ vagy az ic ++ funkcióval, amely ezt a függvényt tartalmazta, majd összehasonlítottam az eredményeket az eredetivel (mármint a célfüggvény gépi kódegyenértékének összehasonlítását mind a teszt exe -mmel, mind a játékkal egy). De akkor azt gondoltam, hogy ez nem annyira hatékony, mert sok más folyamatot nem vesznek figyelembe. Úgy értem, hogy a PDB fájl sokkal több információt tartalmaz, mint a dbh program kiírása és a PE fájl is. A PE fájlformátumról szóló cikkekben azt mondják, hogy az .OBJ fájlhoz hasonlóan hasonlít arra, hogy mely fájlokat használja a linker az exe előállításához. Szóval jobb ötlet átnézni az .OBJ fájlokat, majd kitalálni a forráskódot, vagy csak együtt dolgozni az exe-vel? Azt is elolvastam, hogy az .OBJ fájlok PE-ből történő előállításához szükség van néhány szimbólumra, és nekem vannak az PDB fájlból, úgyhogy szerintem ez az átalakítás lehetséges. Akkor is, ha van más ötlete a játék dekompilálására, ossza meg őket - ezt nagyon szeretném elérni.

SZERKESZTÉS: Egy dokumentumot is keresek, de .PDB formátumban (v2.0) és kb. a VC ++ 6.0 .OBJ és .LIB fájlokat készített.

A gépkód futtatható fájlok dekompilálásáról és arról, hogy ez miért nem könnyű feladat, olvassa el [ezt a kérdést] (http://reverseengineering.stackexchange.com/questions/311/why-are-machine-code-decompilers-less-capable- mint például a clr-hez).
Három válaszokat:
Jason Geffner
2013-07-14 00:20:57 UTC
view on stackexchange narkive permalink

Tekintettel arra, hogy még nem rendelkeznek .obj fájlokkal, nincs értelme megkísérelni az .obj fájlokat az .exe és a .pdb fájlokból előállítani, majd a generált .obj fájlokat visszamérni. Ha ezt tenné, akkor az .obj fájlokban nem lenne olyan információ, amely még nem szerepelne az .exe vagy .pdb fájlokban. Mint ilyen, jobb, ha csak az .exe és .pdb fájlokkal dolgozik.

Ami a kód visszafejtését illeti, a Hex-Rays nagyon hasznos, ha megpróbál megfordítani. mérnök x86 kódot vissza a C / C ++ forráskódra.

Köszönöm a választ, de nem lenne egyszerűbb és szervezettebb az egyes .obj fájlok dekompilálása. Úgy értem, hogy a futtatható fájlt nem csak .obj fájlok, hanem .lib fájlok is létrehozzák. Vannak olyan .obj fájlok is, amelyek szerepelnek az alkalmazáshoz használt API-ban. Tehát, ha közvetlenül a futtathatóval dolgozom, meg kell különböztetnem, hogy mi a felhasználó által készített kód, és mi az, ami már kódolt API funkció.
Tehát már rendelkezik az .obj fájlokkal?
Nem, de azt hiszem, képes lennék kinyerni őket (fájlneveik az EKT-fájlban vannak tárolva, és gyanítom, hogy a PE fájlban is szerepel a részük, de sajnos nem találok jó magyarázatot a formátumára - a Az egyik előzetes költségvetési tervezet). Azt akarom mondani, hogy a futtatható fájl kis részeinek dekódolása és tesztelése sokkal könnyebb lehet, mint egy teljes teszt futtatható fájl összeállítása.
Tehát úgy hangzik, mintha most azt kérdezné, hogyan lehet információkat kivonni az EKT-fájlokból. Valószínűleg jobb, ha új kérdést kezdesz, mivel az eredeti kérdésedre már megválaszolták. FWIW azonban itt találhatja meg az EKT-ból kivonható értékeket: http://msdn.microsoft.com/en-us/library/4sy4ebfw.aspx
PSS
2013-07-14 01:50:29 UTC
view on stackexchange narkive permalink

Ha meg akarja változtatni a játékot, akkor a játék elkészítésének elsajátításához nagy valószínűséggel a C / C ++ fájlokat (legalábbis a főbb összetevőket) újra létrehozza. Attól tartok, hogy semmilyen módon nem lehet visszavonni valamit és teljesen megérteni a belső működést anélkül, hogy szilárdan ragaszkodnánk a szereléshez. Számos eszköz segítheti munkáját. Van néhány nagy hibakereső, amelyeket használhat: OllyDBG és Immunity Debugger. Nyilvánvalóan létezik Hex-Rays, amely több terméket kínál. Van IDA, amely kiváló multiprocesszoros szétszerelő. Az IDA-nak két változata van: ingyenes és kereskedelmi változat. Van még Hex-Rays Decompiler

Sajnálom, de nincs új információ számomra. Egyébként köszönöm a választ.
David Hoelzer
2013-07-14 02:52:15 UTC
view on stackexchange narkive permalink

Ha valóban érdekli a PE formátum megismertetése, mindenképpen meg kell tekintenie az itt elérhető referenciákat: http://blog.dkbza.org/2012/08/pe-file-format- graphs.html

Ezek az ábrák csodálatosan teljesek, és óriási előrelépést jelentenek egy ismeretlen fájl PE formátumú elemzésében, még akkor is, ha a fejléceket megváltoztatták, hogy megakadályozzák RE.

Hmm furcsa magyarázat. Egyébként szeretnék néhány dokumentációt a .PDB fájlformátumról (v2.0), kivéve a "Windows 2000 dokumentálatlan titkok" könyvet, ahol már olvastam a leírását, de sajnos nem teljes (Sehol nincs megadva, mi az első stream valójában képviseli.). Szeretnék még többet megtudni a VC ++ 6.0 által előállított .OBJ és .LIB fájlokról. Köszönöm.


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...