Tutoriel en langage assembleur

Veuillez choisir une page de tutoriel :

  • Fondamentaux — Informations sur le C
  • Outils
  • Registres
  • Instructions simples
  • Exemple 1 — Vérification initiale de la SC CDKey
  • Exemple 2 -…- SC CDKey Shuffle
  • Exemple 2b — SC CDKey Final Decode
  • The Stack
    • Stack Example
  • Functions
  • Example 3 — Storm.dll SStrChr
  • Résumé de l’assemblage
  • Code machine
  • Exemple 4 — Détruire la pile
  • Craquer un jeu
  • Exemple 5 — Craquer un jeu
  • Exemple 6 — Écrire un keygen
  • .dll Injection et Patching
  • Recherche de mémoire
  • Exemple 7 — Ecrire un cheat pour Starcraft (1.05)
    • Exemple 7 Etape 1 — Affichage des messages
    • Exemple 7 Etape 1b — Ci-dessus, avec func ptrs
    • Exemple 7 Final
  • Exemple 8 — Obtenir IX86.dll files
  • 16-bit Assembly
  • Exemple 9 — Keygen pour un jeu 16-bit
  • Exemple 10 — Writing a loader

Cette section passera en revue plusieurs techniques utilisées par les crackers pour enregistrer des jeux/logiciels. Je ne mentionne pas les cd-cracks, car je ne sais pas comment les faire ; je mentionne plutôt les attaques qui sont généralement basées sur une clé ou un code d’enregistrement.

Protections courantes

La protection la plus courante, et celle dont il est question ici, est lorsqu’un programme nécessite une clé d’enregistrement pour se déverrouiller. Habituellement, la clé est basée soit sur un code d’enregistrement aléatoire fourni par le programme, soit sur le nom d’utilisateur que vous entrez.

Je vais énumérer quelques définitions ici. Notez que ces définitions sont les miennes, et ne correspondront pas nécessairement aux définitions que d’autres utilisent. Elles servent simplement à faciliter la compréhension de cette section et des sections suivantes :

  • Un code d’enregistrement est un code généré par un programme, dont la clé d’enregistrement est dérivée ou vérifiée.
  • Un nom d’utilisateur d’enregistrement ou simplement nom d’utilisateur est un nom d’utilisateur qu’un utilisateur saisit. La clé d’enregistrement est basée sur ce nom d’utilisateur.
  • Une clé d’enregistrement est la clé utilisée pour déverrouiller un programme. Elle peut être basée sur un code d’enregistrement, sur un nom d’utilisateur d’enregistrement, ou basée sur rien du tout.

Finding the Spot

Le tout premier exemple passe en revue l’algorithme de vérification de CDKey de Starcraft, mais j’ai fourni l’algorithme. Celui de Starcraft est le type de vérification le plus simple, la clé se vérifie elle-même sans nom d’utilisateur ni code. La question est, comment trouver l’algorithme ?

Eh bien, la réponse malheureuse est, cela varie, et ce n’est généralement pas facile.

La première étape est évidemment de désassembler le programme. Après cela, en tant que craqueur, vous devez essayer de trouver un point faible dans le programme. Voici plusieurs techniques :

  • Rechercher le texte demandant la clé
  • Rechercher le code d’enregistrement en mémoire, et trouver où on y accède
  • Entrer un code, le faire échouer, puis rechercher en mémoire ce code qui a échoué
  • Rechercher tout ce qui est unique dans l’enregistrement (couleurs, texte, dialogues, etc).
  • Rechercher la clé de registre qui stocke la clé
  • Rechercher un fichier qui stocke les informations d’enregistrement
  • Rechercher le message d’erreur quand une mauvaise clé est donnée

La dernière technique est la plus utile, j’ai trouvé. Cependant, les essayer toutes, et essayer toute autre chose qui semble convenir au jeu fonctionne mieux. Dans l’exemple de la section suivante, j’ai trouvé que la recherche du texte informant l’utilisateur que le logiciel n’est pas enregistré fonctionnait bien pour le jeu, comme vous le verrez plus tard. Je peux faire un deuxième exemple où j’ai cherché le fichier qui stocke la clé, et où il a été créé.

Pour trouver le vérificateur de CDKey de Starcraft, j’ai commencé par le trafic réseau, au niveau de la fonction Winsock (send() et recv()). A partir de là, j’ai fait marche arrière pour trouver où est envoyé le paquet qui valide la clé de Starcraft avec Battle.net. C’était beaucoup de travail, mais à l’époque j’étais en train d’apprendre l’activité réseau de Starcraft, donc c’était surtout un effet secondaire de ce que je faisais déjà. Si je continue à écrire ces tutoriels, je pourrais éventuellement entrer dans autant de détails, mais je n’en ai pas encore l’intention.

Cracking the Game

Une fois le bon endroit trouvé, craquer un jeu est souvent très facile. Typiquement, un programme aura le code suivant:

 if(keyIsValid) unlock() else displayError()

L’assemblage pour cela ressemblerait à:

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:

Comme discuté dans la section sur le code machine, les octets à gauche peuvent être les octets du code machine (je les ai fait rapidement à partir d’une feuille de référence, donc ils peuvent ou non être exactement corrects. Ce programme peut être modifié en changeant quelques octets, ce qui peut soit forcer le code à sauter toujours ou à ne jamais sauter.

Pour forcer le code à sauter (ce qui, dans ce cas, rendra la clé toujours valide), le jz est remplacé par un jmp (en changeant 74 en 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:

Pour empêcher le code de sauter (ce qui, dans ce cas, rendra la clé toujours valide), le jz est remplacé par une paire d’instructions 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:

Faites le changement approprié, lancez le jeu, et tapez n’importe quel code. Le résultat attendu devrait se produire !

L’exemple suivant montrera cela sur un jeu réel (sur un jeu que je ne nommerai pas ici, pour des raisons évidentes).

Écrire un keygen

Encore mieux que de craquer un jeu est d’écrire un keygen pour celui-ci. L’utilisateur entre son nom d’utilisateur ou son code d’enregistrement, et le keygen sort une clé valide.

Généralement, cela nécessite que l’algorithme soit entièrement rétroconçu et compris. Ensuite, une copie de celui-ci est faite en C (ou tout autre langage) qui produit les mêmes résultats. Notez que les trois premiers exemples de ce tutoriel font justement cela : retransformer le code assembleur en C. Ainsi, quiconque les a effectivement suivis devrait être en bonne position pour écrire un keygen, ce qui viendra dans un tutoriel ultérieur.

Questions

N’hésitez pas à éditer cette section et à poster des questions, je ferai de mon mieux pour y répondre. Mais vous devrez peut-être me contacter pour me faire savoir qu’une question existe.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.