La modification de la mémoire

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Leplayze

Frite...euse (jeu de mot)
V
Ancien staff
Dec 4, 2009
12,649
5
1,303
30
www.youtube.com
merci a bouh2 pour ce magnifique tutoriel

La memoire
Bonjour,

Avant de commencer à faire un hack il faut comprend 2-3 notions.
L'exploitation la plus facile et la plus utilisé dans le hack de wow est la modification de mémoire.
I. Introduction
Ce qu'il faut savoir c'est que dans votre ordinateur il y a plusieurs niveaux de stockage de donnés :

Le registre (très rapide) : c'est une mémoire directement situé dans le processeur (on le retrouve dans l'ASM)
La mémoire cache : une liaison entre registre et mémoire vive
La mémoire vive : c'est de celle-ci à laquelle on s'intéresse
Le disque dur : là on sauvegarde toute les donnés.

Vous l'avez compris la mémoire vive est toute les donnés stocké dans les programmes par des variables par exemple.
La mémoire est organisé, chaque processus à son espace de mémoire. Chaque donnés est en enregistrer dans des adresses (pour qu'on les retrouve).

II. Adresses

Les adresses sont juste un nombre, par exemple à l'adresse 50242 j'ai la valeur 34.
Les variables d'un programme sont codés sur plusieurs adresses car il n'y a pas assez de place dans une seule adresses, donc finalement selon le type de valeur on choisi le nombre d'adresses à lire.
Exemple pour lire un nombre entier (dit int ou integer) prend 4 adresses donc l'adresse 50242 à 50246 contient 5640.

En faites réellement les valeurs sont binaires, au lieu de trouver 34 à l'adresse 50242 on trouvera 100010 que l'ordinateur traduira pour nous =)

En ce qui concerne les adresses on parlera d'hexadécimal. Je ne peux pas expliquer l'hexadécimal, c'est trop compliqué mais on ne dira pas à l'adresse 50242 mais C442 (la calculatrice en mode scientifique permet de convertir decimal en hexa).

Note : Pour montrer qu'une valeur est héxadécimal on ajoute '0x' ou 'h' (en basic) devant la valeur. Soit 0xC442 ou hC442. C'est juste pour mieux se comprendre car 5432 et 0x5432 n'est pas la même chose

III. Les valeurs


Comme je l'ai dit les valeurs sont des écritures binaires (0 ou 1) qui représente un nombre. Mais aussi des nombres décimales, des lettres, des mots ... En faites tout ce qui existe :)
Tout cela dépend de l'encodage, pour les lettres une lettre correspond à un nombre. Par exemple 91 correspond à 'a'.

IV. Exploiter la mémoire

Maintenant on sait comment marche la mémoire, il faudrait savoir la modifier et la lire mais d'un programme différent.

Windows n'est pas si idiot que ça et demande le mode admin (sous vista) et le mode debug pour lire librement la mémoire.

Une fois fait il faut dire quel processus il faut lire, chaque processus, à son lancement, a un nombre appelée PID qui sert à différencier chaque processus.
On va s'en servir pour ouvrir le processus et ainsi modifier la mémoire.

Maintenant on a plus qu'a lire ou écrire les adresses avec des fonctions inclus dans des includes AutoIt.

V. Schéma récapitulatif

Voici un schéma qui reprend tout ce que j'ai dit :

schemammoire.png

VI. Pointeur et Offset

On va toujours rencontrer ceci dans WoW : les pointeurs.
C'est une notion dure à expliquer mais je vais l'expliquer brièvement :
Un pointeur est comme une variable, donc prend une place dans la mémoire, mais est une exception car il contient non pas une valeur mais une adresse.
On va dire que le pointeur à l'adresse 0x02436 et qu'il contient l'adresse 0x3624 alors que l'adresse 0x3624 contient la valeur 10.

Voici comment le représenter :

[0x2436] = 10
0x3624 = 10

En effet les [ ] disent : "l'adresse contenu dans x est" donc on traduit [0x2436] par "l'adresse contenu dans 0x2436 est 0x3624"
Le '=' dit 'la valeur contenu dans x est" donc on traduit 0x3624 par "la valeur contenu dans 0x3624 est 10"

On finale on obtient : "la valeur contenu dans l'adresse contenu dans 0x2436 est 10".

Maintenant on va corser le tout en ajoutant les offsets.
Une adresse serait comme une page d'un livre (le livre est le programme), l'offset est une ligne de la page.
L'offset est en faites un nombre que l'on ajoute à une adresse pour trouver une valeur. Au contraire d'un pointeur celui-ci sert à trouver une valeur dans un tableau ou une structure.

Dans WoW tout les Objets(Joueur, PNJ, GameObject, Cadavre ...) sont basés sur les mêmes structures pour simplifier les choses.
On va dire que l'objet 'PNJ' à coter de mon perso est contenu à l'adresse 0x002340 alors que l'autre l'objet 'PNJ' derrière moi se situe à l'adresse 0x004230 (Je vous montre bien que tout les objets que je vois sont à des adresses différentes qui change constamment mais qui sont basés sur la même structure)

Note : Les deux adresses sont normalement des pointeurs mais je simplifie

On dit que l'offset 0x10 donne les points de vie de la structure.

0x002340 + 0x10 = Points de vie du 1er PNJ
0x004230 + 0x10 = Points de vie du 2e PNJ

Si on traduit par la phrase du dessus : "la valeur dans l'adresse 0x002350 (0x002340 + 0x10) est les points de vie du 1er PNJ
Pour lire l'offset d'une adresse on ajoute juste l'adresse et l'offset.

Pour résumé le pointeur est lu par la fonction qui lit la mémoire et on prend l'adresse qui la contenait. L'offset est un nombre que l'on additionne à une adresse pour en avoir une autre.

VII. Exemple concret

Cette exemple est plus que concret car c'est réellement comme ça que ça se déroule.
On va juste lire les points de vie du perso. En 3.0.9

Tout d'abords on doit trouver l'objet qui contient notre perso, ou 'PlayerBase'.

Playerbase = [[[0x127F13C] + 0x30] + 0x28]

0x127F13C est l'adresse statique du joueur, elle ne change pas, c'est un pointeur
0x30 et 0x28 sont 2 Offsets
(Je ne détaille pas leur fonction c'est inutile)

L'offset qui donne la vie du joueur est 0xFF4

Playerbase + 0xFF4 = vie du joueur

Tout simplement =)

Voilà si vous avez des remarques dites le ici

Bonne chance ;)