Kérlek, válassz egy oktatóoldalt:
- Alapok — Információk a C-ről
- Eszközök
- Regiszterek
- Egyszerű utasítások
- Példa 1 — SC CDKey kezdeti ellenőrzése
- Példa 2 – SC CDKey kezdeti ellenőrzése
- Példa 2.- SC CDKey keverése
- Példa 2b — SC CDKey végső dekódolása
- A Stack
- Stack példa
- Funkciók
- Példa 3 — Vihar.dll SStrChr
- Assembly Summary
- Gépi kód
- Példa 4 — A Stack szétverése
- Egy játék feltörése
- Példa 5 — Egy játék feltörése
- Példa 6 — Keygen írása
- .dll Injection and Patching
- Memory Searching
- Example 7 — Writing a cheat for Starcraft (1.05)
- Example 7 Step 1 — Displaying Messages
- Example 7 Step 1b — Above, w/ func ptrs
- Example 7 Final
- Example 8 — Getting IX86.dll fájlok
- 16 bites Assembly
- Példa 9 — Keygen egy 16 bites játékhoz
- Példa 10 — Betöltő írása
Ez a szakasz több, a crackerek által a játékok/szoftverek regisztrálására használt technikát fog áttekinteni. Nem említem a cd-töréseket, mert azokhoz nem értek, inkább olyan támadásokat említek, amelyek általában egy kulcson vagy regisztrációs kódon alapulnak.
Gyakori védelmek
A leggyakoribb és itt tárgyalt védelem az, amikor egy program feloldásához regisztrációs kulcsra van szükség. Általában a kulcs vagy a program által megadott véletlenszerű regisztrációs kódon, vagy az Ön által megadott felhasználónéven alapul.
Itt felsorolok néhány definíciót. Vegye figyelembe, hogy ezek a definíciók az enyémek, és nem feltétlenül fognak megfelelni a mások által használt definícióknak. Egyszerűen csak azért vannak, hogy megkönnyítsék ennek és a további szakaszoknak a megértését:
- A regisztrációs kód egy program által generált kód, amelyből a regisztrációs kulcsot levezetik, vagy amely alapján ellenőrzik.
- A regisztrációs felhasználónév vagy egyszerűen csak felhasználónév a felhasználó által megadott felhasználónév. A regisztrációs kulcs ezen a felhasználónéven alapul.
- A regisztrációs kulcs a program feloldásához használt kulcs. Ez alapulhat egy regisztrációs kódon, egy regisztrációs felhasználónéven vagy egyáltalán semmin.
A hely megtalálása
A legelső példa a Starcraft CDKey ellenőrző algoritmusán megy keresztül, de az algoritmust én adtam meg. A Starcrafté a legegyszerűbb fajta verifikáció, a kulcs felhasználónév és kód nélkül verifikálja magát. A kérdés az, hogy hogyan találod meg az algoritmust?
Nos, a sajnálatos válasz az, hogy változó, és általában nem könnyű.
Az első lépés nyilvánvalóan a program szétszedése. Utána, mint cracker, meg kell próbálnod megtalálni a program gyenge pontját. Íme néhány technika:
- Keresd meg a kulcsot kérő szöveget
- Keresd meg a regisztrációs kódot a memóriában, és derítsd ki, hol érhető el
- Adj meg egy kódot, sikertelenül, majd keresd meg a memóriában a sikertelen kódot
- Keress bármi egyedit a regisztrációban (színek, szöveg, párbeszédpanelek stb.).
- Keresd meg a kulcsot tároló registry kulcsot
- Keresd meg a regisztrációs információkat tároló fájlt
- Keresd meg a hibaüzenetet, ha rossz kulcsot adsz meg
Az utolsó technika a leghasznosabb, amit találtam. Viszont az összeset kipróbálni, és minden mást kipróbálni, ami a játéknak megfelelőnek tűnik, működik a legjobban. A következő fejezetben szereplő példában azt találtam, hogy a felhasználónak azt a szöveget keresve, amely arról tájékoztatja a felhasználót, hogy a szoftver nem regisztrált, jól működött a játék, ahogy később látni fogod. Lehet, hogy csinálok egy második példát, ahol a kulcsot tároló fájlt keresem, és azt, hogy hol hozták létre.
A Starcraft CDKey ellenőrzőjének megtalálásához a hálózati forgalommal kezdtem, a Winsock függvénynél (send() és recv()). Onnan visszaléptem, hogy megtaláljam, hová küldik a csomagot, amely a Starcraft kulcsot a Battle.net-tel hitelesíti. Ez rengeteg munka volt, de akkoriban éppen a Starcraft hálózati tevékenységét tanultam, így ez leginkább csak mellékhatása volt annak, amit már csináltam. Ha továbbra is írom ezeket az útmutatókat, lehet, hogy végül belemegyek ilyen részletekbe, de egyelőre nem tervezem.
A játék feltörése
Amint megtaláljuk a megfelelő helyet, a játék feltörése gyakran nagyon egyszerű. Tipikusan egy programnak a következő kódja van:
if(keyIsValid) unlock() else displayError()
Az ehhez tartozó assembly így nézne ki:
85 xx test keyIsValid, keyIsValid74 06 jz errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
Amint azt a gépi kódról szóló részben tárgyaltuk, a bal oldali bájtok lehetnek a gépi kód bájtjai (gyorsan csináltam őket egy referencia lapról, így lehet, hogy pontosan helyesek, de lehet, hogy nem. Ez a program néhány bájt megváltoztatásával módosítható, ami vagy arra kényszerítheti a kódot, hogy mindig vagy soha ne ugorjon.
Hogy a kódot ugrásra kényszerítsük (ami ebben az esetben a billentyűt mindig érvényessé teszi), a jz-t jmp-vel helyettesítjük (a 74-et eb-re változtatva):
85 xx test keyIsValid, keyIsValideb 06 jmp errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
Hogy a kódot ne ugorjon (ami ebben az esetben a billentyűt mindig érvényessé teszi), a jz-t egy pár nop utasítással helyettesítjük:
85 xx test keyIsValid, keyIsValid90 nop90 nope8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
Tegyük meg a megfelelő változtatást, futtassuk a játékot, és írjunk be bármilyen kódot. A várt eredménynek be kell következnie!
A következő példában ezt egy valós játékon mutatjuk be (egy olyan játékon, amelyet itt nyilvánvaló okokból nem nevezek meg).
Kulcsprogram írása
A játék feltörésénél is jobb egy játékhoz kulcsprogramot írni. A felhasználó megadja a felhasználónevét vagy a regisztrációs kódját, és a keygen kiad egy érvényes kulcsot.
Ez általában megköveteli, hogy az algoritmust teljesen visszafejtsük és megértsük. Ezután elkészítik a másolatát C-ben (vagy bármilyen nyelven), ami ugyanazt az eredményt produkálja. Vegyük észre, hogy az első három példa ebben a bemutatóban pontosan ezt teszi: az assembly kódot visszafordítja C-re. Tehát bárki, aki ténylegesen követte őket, jó helyzetben lesz ahhoz, hogy megírjon egy keygen-t, ami egy későbbi bemutatóban következik.
Kérdések
Bátran szerkesszétek ezt a részt, és tegyetek fel kérdéseket, igyekszem majd válaszolni rájuk. De lehet, hogy kapcsolatba kell lépned velem, hogy tudasd velem, hogy kérdésed van.