lire et ecrire la memoire

    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 tuto


Lire et ecrire la mémoire

Bonjour,

Suite au premier tutoriel sur la mémoire je vais prendre suite avec la pratique.
On ne va pas toute de suite créer un hack pour WoW mais déjà manier la mémoire juste avec le jeu du démineur ;)

I. Includes

Tout d'abords on ne va pas utiliser l'include de base Memory.au3 d'AutoIt mais une include spécialement conçu de façon à l'exploitation de la mémoire pure.
On va donc utiliser NomadMemory
Lien :Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

Note : Il faut extraire le RAR dans votre dossier ./include de votre dossier AutoIt

Cette include dispose de peu de fonctions mais est très simple d'utilisation, d'où mon choix.

II. Avant programmation

Ce que l'on va faire c'est juste lire la valeur du temps du démineur et la changer. J'ai pris le démineur car on ne s'aventure par dans les pointeurs et les offsets de wow et toute sa structure.
Donc avec Cheat Engine on peux faire une recherche et on trouve que l'adresse qui contient la valeur du temps est : winmine.exe+579C c'est à dire 0x100579C en général (sauf si vous avez fait des modifications spéciales sur votre PC xD car "l'imagebase" est toujours égale à 0x100000 donc on fait 0x579C + 0x100000)

III. Lire la mémoire

Vous vous souvenez dans le tutoriel précédent je vous ai dit que Windows n'accepte l'exploration de la mémoire que si vous avez le mode debug.

Donc au début du code on va mettre :

PHP:
#Include <NomadMemory.au3> ; pour ouvrir l'include

SetPrivilege("SeDebugPrivilege", 1) ;pour mettre le mode debug et pour pouvoir lire la mémoire (1 pour l'activer 0 pour le désactiver)

Puis il faut dire au programme à quel processus il faut "ouvrir" la mémoire.
Pour cela on utiliser _MemoryOpen qui prend comme argument le PID du processus, un nombre unique par processus qui permet de les distinguer.
Pour le trouver on utilise WinGetProcess([Nom de la fenêtre])

PHP:
$Processus = _MemoryOpen(WinGetProcess("Démineur"))

A présent on peut lire la mémoire avec la fonction _MemoryRead qui a 3 arguments :
  1. Adresse : l'adresse à laquelle on lit la mémoire
  2. Le Handle du processus: Adresse retourné par _MemoryOpen
  3. Le type de valeur: la valeur désigné pour savoir si on veut lire une chaîne de caractère, une valeur entier, un nombre à virgules ...

Note : Le type de valeur est le type de variable à lire. Les plus utilisés seront "dword" ou "int" pour lire des entier, "float" ou "double" pour les nombres à virgules, "char[x]" pour les chaîne de caractères. Pour plus d'info regarder dans la doc AutoIt -> DllStructCreate

Souvenez-vous on doit lire 0x100579C pour avoir la valeur du temps.
On écrit donc :

PHP:
$Time = _MemoryRead(0x100579C ,$Processus ,"int")

On ajoute ça dans un while et on affiche en temps réelle

PHP:
While (WinExists("Démineur"))
	$Time = _MemoryRead(0x100579C ,$Processus ,"int") 
	TrayTip("Temps","Temps écoulé : " & $Time, 1)
	Sleep(600)
WEnd

Et voilà on a le temps que compte le programme :)

Petite précision penser à fermer la lecture de la mémoire avec _MemoryClose pour éviter tout problèmes :

PHP:
_MemoryClose($Processus)

IV. Ecrire la mémoire

En faites ce n'est pas si dure c'est un peu près pareil que lire la mémoire
On va seulement changer de fonction xD

La fonction _MemoryWrite à 4 arguments :
  1. Adresse: l'adresse à laquelle on lit la mémoire
  2. Le Handle du processus: Adresse retourné par _MemoryOpen
  3. Nouvelle valeur: la valeur a attribué.
  4. Le type de valeur: la valeur désigné pour savoir si on veut lire une chaîne de caractère, une valeur entier, un nombre à virgules ...

On écrira donc :
PHP:
 _MemoryWrite (0x100579C ,$Processus ,999,"int")

Et puis si on veut "frozen" comme avec CE la valeur on fait une boucle de cette manière :

PHP:
While (WinExists("Démineur"))
	_MemoryWrite (0x100579C ,$Processus ,0,"int") 
	Sleep(1000)
WEnd

V.Code

Voici donc les deux codes finales.
Lire la mémoire :
PHP:
#Include <NomadMemory.au3> ; pour ouvrir l'include

SetPrivilege("SeDebugPrivilege", 1) ;pour mettre le mode debug et pour pouvoir lire la mémoire (1 pour l'activer 0 pour le désactiver) 

$Processus = _MemoryOpen(WinGetProcess("Démineur"))

While (WinExists("Démineur"))
	$Time = _MemoryRead(0x100579C ,$Processus ,"int") 
	TrayTip("Temps","Temps écoulé : " & $Time, 1)
	Sleep(600)
WEnd

_MemoryClose($Processus) ; on ferme la mémoire pour éviter certains bugs ^^

Écrire la mémoire :
PHP:
#Include <NomadMemory.au3> ; pour ouvrir l'include

SetPrivilege("SeDebugPrivilege", 1) ;pour mettre le mode debug et pour pouvoir lire la mémoire (1 pour l'activer 0 pour le désactiver) 

$Processus = _MemoryOpen(WinGetProcess("Démineur"))

While (WinExists("Démineur"))
	_MemoryWrite (0x100579C ,$Processus ,0,"int") 
	Sleep(1000)
WEnd

_MemoryClose($Processus) ; on ferme la mémoire pour éviter certains bugs ^^

Note : La boucle While dans l'écriture permet juste de "frozen" la valeur, si on veut la modifier un seule fois pas besoin de boucle.

Et voilà rien de bien compliquer niveau utilisation des fonctions =)

Prochain objectif, lecture et écriture de WoW =)
 

meven2012

Membre
Jan 31, 2011
9
0
421
salut, tu peut expliquer comment trouver le numéro de mémoire (0x100579C) qui correspond au temps. car pour faire des hack sur d'autre programme il faut le numéro mais je sais pas ou on le trouve

Edit : c'est bon j'ai trouver, avec cheat engine
 
Last edited: