Assembly Language Tutorial

Vyberte si prosím výukovou stránku:

  • Základy — Informace o jazyce C
  • Nástroje
  • Registry
  • Jednoduché instrukce
  • Příklad 1 — Počáteční ověření SC CDKey
  • Příklad 2.- SC CDKey Shuffle
  • Příklad 2b — SC CDKey Final Decode
  • Zásobník
    • Příklad zásobníku
  • Funkce
  • Příklad 3 — Storm.dll SStrChr
  • Shrnutí assembleru
  • Strojový kód
  • Příklad 4 — Rozbití zásobníku
  • Rozbití hry
  • Příklad 5 — Rozbití hry
  • Příklad 6 — Zápis keygenu
  • .dll Injection and Patching
  • Prohledávání paměti
  • Příklad 7 — Napsání cheatu pro Starcraft (1.05)
    • Příklad 7 Krok 1 — Zobrazení zpráv
    • Příklad 7 Krok 1b — Výše, s/ func ptrs
    • Příklad 7 Závěrečný
  • Příklad 8 — Získání IX86.dll souborů
  • 16bitové sestavení
  • Příklad 9 — Keygen pro 16bitovou hru
  • Příklad 10 — Napsání zavaděče

V této části probereme několik technik používaných crackery k registraci her/softwaru. Nezmiňuji se o crackování CD, protože to neumím; spíše se zmíním o útocích, které jsou obecně založeny na klíči nebo registračním kódu.

Běžná ochrana

Nejběžnější ochranou, o které je zde řeč, je situace, kdy program vyžaduje k odemčení registrační klíč. Obvykle je klíč založen buď na náhodném registračním kódu poskytnutém programem, nebo na základě zadaného uživatelského jména.

Uvedu zde několik definic. Všimněte si, že tyto definice jsou moje a nebudou nutně odpovídat definicím, které používají ostatní. Jsou pouze pro snazší pochopení této a následujících částí:

  • Registrační kód je kód vygenerovaný programem, od kterého se odvozuje nebo podle kterého se kontroluje registrační klíč.
  • Registrační uživatelské jméno nebo jen uživatelské jméno je uživatelské jméno, které zadává uživatel. Registrační klíč je založen na tomto uživatelském jménu.
  • Registrační klíč je klíč, který se používá k odemknutí programu. Může být založen na registračním kódu, na registračním uživatelském jménu nebo nemusí být založen vůbec na ničem.

Nalezení místa

Úplně první příklad probírá algoritmus ověřování CDKey ve Starcraftu, ale poskytl jsem algoritmus. Starcraftův je nejjednodušší druh ověření, klíč se ověřuje sám bez uživatelského jména nebo kódu. Otázka zní: „Jak ten algoritmus zjistíte?“

No, bohužel odpověď zní: je to různé a obecně to není snadné.

Prvním krokem je samozřejmě rozebrání programu. Poté se jako cracker musíte pokusit najít slabé místo v programu. Zde je několik technik:

  • Hledejte text vyzývající k zadání klíče
  • Hledejte registrační kód v paměti a zjistěte, kde se k němu přistupuje
  • Zadejte kód, nechte ho selhat a pak hledejte v paměti tento neúspěšný kód
  • Hledejte cokoli jedinečného na registraci (barvy, text, dialogy atd.).
  • Vyhledat klíč v registru, který ukládá klíč
  • Vyhledat soubor, který ukládá informace o registraci
  • Vyhledat chybové hlášení při zadání špatného klíče

Poslední technika je nejužitečnější, jak jsem zjistil. Nejlépe však funguje vyzkoušení všech a vyzkoušení čehokoli jiného, co se zdá být pro hru vhodné. V příkladu v další části jsem zjistil, že pro hru dobře funguje hledání textu informujícího uživatele o tom, že software je neregistrovaný, jak uvidíte později. Možná udělám druhý příklad, kde budu hledat soubor, ve kterém je uložen klíč, a kde byl vytvořen.

Pro nalezení ověřovače CDKey ve Starcraftu jsem začal síťovým provozem, a to u funkce Winsock (send() a recv()). Odtud jsem zpětně hledal, kam se posílá paket, který ověřuje klíč Starcraft pomocí služby Battle.net. Bylo to hodně práce, ale v té době jsem se učil o síťové aktivitě Starcraftu, takže to byl většinou vedlejší efekt toho, co jsem už dělal. Pokud budu pokračovat v psaní těchto návodů, možná se nakonec dostanu do takových detailů, ale zatím to nemám v plánu.

Prolomení hry

Po nalezení správného místa je prolomení hry často velmi snadné. Obvykle bude mít program následující kód:

 if(keyIsValid) unlock() else displayError()

Amplet pro něj bude vypadat takto:

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:

Jak bylo řečeno v části o strojovém kódu, bajty vlevo mohou být bajty strojového kódu (dělal jsem je rychle z referenčního listu, takže mohou, ale nemusí být přesně správné. Tento program lze upravit změnou několika bajtů, které mohou buď přinutit kód skákat vždy, nebo neskákat nikdy.

Chcete-li kód přinutit ke skoku (což v tomto případě způsobí, že klávesa bude platit vždy), nahradíte jz instrukcí jmp (změnou 74 na eb):

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:

Chcete-li kódu zabránit ve skoku (což v tomto případě způsobí, že klávesa bude platit vždy), nahradíte jz dvojicí instrukcí nop:

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:

Provedete příslušnou změnu, spustíte hru a zadáte libovolný kód. Měl by se dostavit očekávaný výsledek!

Následující příklad to ukáže na skutečné hře (na hře, kterou zde z pochopitelných důvodů nebudu jmenovat).

Napsání keygenu

Ještě lepší než cracknout hru je napsat pro ni keygen. Uživatel zadá své uživatelské jméno nebo registrační kód a keygen vypíše platný klíč.

Všeobecně to vyžaduje, aby byl algoritmus plně reverzně inženýrsky zpracován a pochopen. Pak se vytvoří jeho kopie v jazyce C (nebo jiném jazyce), která dává stejné výsledky. Všimněte si, že první tři příklady v tomto tutoriálu dělají právě toto: převádějí kód assembleru zpět do jazyka C. Takže každý, kdo se jimi skutečně řídil, by měl být v dobré pozici pro napsání keygenu, který přijde na řadu v pozdějším tutoriálu.

Dotazy

Neváhejte tuto sekci upravovat a psát dotazy, budu se snažit na ně odpovídat. Možná mě ale budete muset kontaktovat, abych věděl, že nějaký dotaz existuje.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.