Assembly Language Tutorial

Valitse ohjesivu:

  • Perusteet — Tietoa C:stä
  • Työkalut
  • Rekisterit
  • Yksinkertaiset ohjeet
  • Esimerkki 1 — SC CDKey:n alkutarkistus
  • Esimerkki 2 – SC CDKey:n alkutarkistus
  • Esimerkki 1 – SC CDKey:n alkutarkistus
  • Esimerkki 2 — SC CDKey Shuffle
  • Esimerkki 2b — SC CDKey Final Decode
  • The Stack
    • Stack Example
  • Functions
  • Esimerkki 3 — Storm.dll SStrChr
  • Assembly Summary
  • Konekoodi
  • Esimerkki 4 — Pinon murskaaminen
  • Pelin murtaminen
  • Esimerkki 5 — Pelin murtaminen
  • Esimerkki 6 — Keygenin kirjoittaminen
  • .dll Injection and Patching
  • Memory Searching
  • Esimerkki 7 — Huijauksen kirjoittaminen Starcraftiin (1.05)
    • Esimerkki 7 Vaihe 1 — Viestien näyttäminen
    • Esimerkki 7 Vaihe 1b — Yläpuolella, w/ func ptrs
    • Esimerkki 7 Loppuosa
  • Esimerkki 8 — IX86:n saaminen.dll-tiedostot
  • 16-bittinen Assembly
  • Esimerkki 9 — Keygen 16-bittiselle pelille
  • Esimerkki 10 — Latausohjelman kirjoittaminen

Tässä osiossa käydään läpi useita tekniikoita, joita krakkerit käyttävät pelien/ohjelmistojen rekisteröintiin. En mainitse cd-murtoja, koska en tiedä, miten niitä tehdään; pikemminkin mainitsen hyökkäykset, jotka yleensä perustuvat avaimeen tai rekisteröintikoodiin.

Yleiset suojaukset

Yleisin suojaus, jota tässä käsitellään, on se, kun ohjelma vaatii rekisteröintiavaimen avaamiseen. Yleensä avain perustuu joko ohjelman antamaan satunnaiseen rekisteröintikoodiin tai syöttämääsi käyttäjätunnukseen.

Luettelen tässä muutamia määritelmiä. Huomaa, että nämä määritelmät ovat minun, eivätkä välttämättä vastaa muiden käyttämiä määritelmiä. Niiden tarkoituksena on vain helpottaa tämän ja seuraavien osioiden ymmärtämistä:

  • Rekisteröintikoodi on ohjelman luoma koodi, josta rekisteröintiavain johdetaan tai jota vastaan rekisteröintiavain tarkistetaan.
  • Rekisteröinnin käyttäjänimi tai pelkkä käyttäjänimi on käyttäjän syöttämä käyttäjänimi. Rekisteröintiavain perustuu tähän käyttäjätunnukseen.
  • Rekisteröintiavain on avain, jota käytetään ohjelman lukituksen avaamiseen. Se voi perustua rekisteröintikoodiin, rekisteröinnin käyttäjätunnukseen tai ei mihinkään.

Kohdan löytäminen

Hyvin ensimmäisessä esimerkissä käydään läpi Starcraftin CDKey-varmennusalgoritmi, mutta annoin algoritmin. Starcraftin on yksinkertaisin verifiointi, avain verifioi itsensä ilman käyttäjätunnusta tai koodia. Kysymys kuuluu, miten löydät algoritmin?

Noh, valitettava vastaus on, että se vaihtelee, eikä se yleensä ole helppoa.

Ensimmäinen askel on tietenkin ohjelman purkaminen. Sen jälkeen krakkerina on yritettävä löytää ohjelmasta heikko kohta. Tässä on useita tekniikoita:

  • Etsi teksti, jossa pyydetään avainta
  • Etsi rekisteröintikoodi muistista ja selvitä, mistä sitä käytetään
  • Syötä koodi, anna sen epäonnistua ja etsi sitten muistista tämä epäonnistunut koodi
  • Etsi jotain uniikkia rekisteröinnissä (värit, teksti, dialogit jne.).
  • Etsi rekisteriavain, joka tallentaa avaimen
  • Etsi tiedosto, joka tallentaa rekisteröintitiedot
  • Etsi virheilmoitus, kun annetaan väärä avain

Viimeinen tekniikka on käyttökelpoisin, jonka olen löytänyt. Parhaiten toimii kuitenkin näiden kaikkien kokeileminen ja kaiken muun kokeileminen, mikä tuntuu sopivan peliin. Seuraavassa esimerkissä havaitsin, että tekstin etsiminen, joka ilmoittaa käyttäjälle, että ohjelmisto on rekisteröimätön, toimi hyvin pelin kannalta, kuten näet myöhemmin. Saatan tehdä toisen esimerkin, jossa etsin avaimen tallentavaa tiedostoa ja sitä, missä se on luotu.

Löytääkseni Starcraftin CDKey-varmentajan aloitin verkkoliikenteestä, Winsock-funktiosta (send() ja recv()). Sieltä palasin takaisin etsimään, mistä lähetetään paketti, joka vahvistaa Starcraft-avaimen Battle.netissä. Se oli paljon työtä, mutta tuohon aikaan opettelin Starcraftin verkkotoimintaa, joten se oli lähinnä sivuvaikutus siitä, mitä olin jo tekemässä. Jos jatkan näiden tutoriaalien kirjoittamista, saatan lopulta päästä niin pitkälle yksityiskohtiin, mutta minulla ei ole vielä suunnitelmia.

Pelin murtaminen

Kun oikea kohta löytyy, pelin murtaminen on usein hyvin helppoa. Tyypillisesti ohjelmassa on seuraava koodi:

 if(keyIsValid) unlock() else displayError()

Sen assembleri näyttäisi seuraavalta:

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:

Kuten käsiteltiin kohdassa konekoodista, vasemmalla olevat tavut voivat olla konekoodin tavuja (tein ne nopeasti referenssilomakkeesta, joten ne voivat olla tai eivät voi olla täysin oikeita. Tätä ohjelmaa voidaan muuttaa muuttamalla pari tavua, jolloin koodi joko hyppää aina tai ei koskaan.

Voidaksemme pakottaa koodin hyppäämään (jolloin näppäin on tässä tapauksessa aina voimassa), jz korvataan jmp:llä (muuttamalla 74 eb:ksi):

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:

Voidaksemme estää koodia hyppäämästä (jolloin näppäin on tässä tapauksessa aina voimassa), jz korvataan parilla nop-käskyllä:

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:

Tekemällä sopiva muutos, ajamalla peli ja kirjoittamalla mikä tahansa koodi. Odotetun tuloksen pitäisi tapahtua!

Seuraava esimerkki näyttää tämän todellisessa pelissä (pelissä, jota en nimeä tässä, ilmeisistä syistä).

Keygenin kirjoittaminen

Jopa parempi kuin pelin kräkkääminen on keygenin kirjoittaminen sitä varten. Käyttäjä syöttää käyttäjätunnuksensa tai rekisteröintikoodinsa, ja keygen tuottaa kelvollisen avaimen.

Yleensä tämä edellyttää, että algoritmi on täysin käänteismallinnettu ja ymmärretty. Sitten siitä tehdään kopio C:llä (tai millä tahansa kielellä), joka tuottaa samat tulokset. Huomaa, että tämän oppikirjan kolme ensimmäistä esimerkkiä tekevät juuri näin: kääntävät assembly-koodin takaisin C:ksi. Joten kuka tahansa, joka on oikeasti noudattanut niitä, pitäisi olla hyvässä asemassa kirjoittamaan keygen, joka tulee myöhemmässä oppikirjassa.

Kysymyksiä

Voitte vapaasti muokata tätä osiota ja lähettää kysymyksiä, teen parhaani vastatakseni niihin. Mutta saatat joutua ottamaan yhteyttä minuun ilmoittaaksesi minulle, että kysymys on olemassa.

Vastaa

Sähköpostiosoitettasi ei julkaista.