ReadProcessMemory

hhhp2004 Messages postés 173 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 13 octobre 2007 - 20 mars 2005 à 18:03
cs_neria Messages postés 319 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 16 février 2009 - 26 mars 2005 à 10:16
hhhp2004

salut,

jai quelque questions sur le code suivant (cest une partie dun programme que jai trouve sur planete source). le but du programme cest de chercher des valeurs dans la memoire dun processus

For addr = 0 To 40000

Call ReadProcessMemory(myHandle, addr * 5000, buffer, 5000, readlen)


If addr Mod 400 = 0 Then
frmMain.lblStatus.Caption = "Searching %" & Trim(Str(Int(addr / 400)))
DoEvents
End If

If readlen > 0 Then
startpos = 1
While InStr(startpos, buffer, Text1.text) > 0
p = (addr) * 5000 + InStr(startpos, buffer, Text1.text) - 1
c = c + 1
If c < 20 Then frmMain.lstResults.AddItem p
startpos = InStr(startpos, buffer, Text1.text) + 1
Wend
End If


Next addr

1. est ceque ce code fait cest quil est cense de faire cest a dire de chercher une valeur dans lespace memoire dun processus ? (vous lui donnez la valeur et il la cherche dans la mem) jai esseye de chercher ladresse de memoire ou Spider Solitaire (jeu tres plat qui vient avec Windows) stocke le score, ca a donne des resultats, meme trop ....... jai esseye avec un autre programme (RAM cheat) sur le meme jeu de spider solitaire et il na trouve qune adresse memoire , LA BONNE ! (apres plusieurs tentatives)

2. pourquoi addr va de 0 jusqua 40000, estcequi pourrait aller jusqua 100000 ou tout autre nombre ? autrement dit, je sais quil fait une boucle pour parcourir la memoire mais pourquoi il va juste jusqua 40000 ? (40000 = limite de la memoire ?)

3. pourquoi dans Call ReadProcessMemory(myHandle, addr * 5000, buffer, 5000, readlen) on multiplie addr par 5000 ?

4. ReadProcessMemory met cest quil a trouve dans la memoire specifie dans buffer ? (cest quoi le role du buffer ?)

5. Cest quoi le role du readlen ? dapres ce que je vois dans le code, il dit si la recherche a donne des resultats, mais estce vraiment ?

6. p = (addr) * 5000 + InStr(startpos, buffer, Text1.text) - 1, cest quoi ca ????

cest un peu long mais........ RESPECT a qui saura repondre

merci

5 réponses

cs_neria Messages postés 319 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 16 février 2009
20 mars 2005 à 20:28
Salut !


Voilà une tentative d'explication (j'espere que je ne vais pas dire de connerie). Tout d'abords voilà ce que donne l'API en C++ :

BOOL ReadProcessMemory(
HANDLE [ hProcess],
LPCVOID [ lpBaseAddress],
LPVOID [ lpBuffer],
SIZE_T [ nSize],
SIZE_T* [ lpNumberOfBytesRead]
);

1) Le code semble faire ce qu'on lui demande (enfin je n'ai pas testé).

2) Pourquoi la boucle va-t-elle jusqu'à 40 000. Je pense que le gars qui a fait ça a essayé de prendre une valeur la plus grande possible pour couvrir l'espace mémoire (40 000* 5 000), je pense qu'il faudrait utiliser une autre métode, c'est un peu bourrin.

3) On multiplie addr par 5 000 parce qu'il parcours l'espace mémoire par bloc de 5 Ko.

4) Buffer est le pointeur qui va pointer sur les données lues. En VB ca doit se faire avec une variable string non ? En gros c'est là que sont stockées les données.

5) readlen sert juste à savoir combien d'octet a lu l'API.

6) p = (addr) * 5000 + InStr(startpos, buffer, Text1.text) - 1 :
p = (addr) * 5000 correspond à l'adresse à partir de laquelle on a lu la mémoire (incrémenté dans la boucle)
+ InStr(startpos, buffer, Text1.text) - 1 correspond à l'adresse à laquelle à été trouvée la valeur. Il faut donc additionner les deux pour connaître l'adresse effective de la valeur.

Voilà j'espère avoir répondu à toutes tes questions, si tu en as d'autres n'hésite pas !!!

@+ Neria
0
hhhp2004 Messages postés 173 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 13 octobre 2007
21 mars 2005 à 20:06
hhhp2004

WOW gros merci neria,

cest quoi dapres toi lautre methode pour parcorir la memoire ? (tu dis que : "je pense qu'il faudrait utiliser une autre métode, c'est un peu bourrin.")

est ce quil peut y avoir une adresse de memoire plus grande que 40 000 * 5000 ?
0
cs_neria Messages postés 319 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 16 février 2009
23 mars 2005 à 16:35
Salut !

Je n'ai hélàs pas de réponse pour connaître la taille d'un processus en mémoire car je ne sais pas ce que fait réellement l'API : scan de toute la mémoire, des valeurs dynamiques... ou simplement du segment du processus (ce qui parait le plus logique) mais à ce moment il y a pleins de valeurs auxquelles on ne pourra pas accéder (tous les mallocs si tu connais un peu le C).
Sinon pour 40 000 * 5 000, c'est égal à 200 000 octet soit à peu près 200 Mo, et je ne vois pas beaucoups de programmes capable d'atteindre ces valeurs (les jeux à la limite).

@+ Neria
0
hhhp2004 Messages postés 173 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 13 octobre 2007
26 mars 2005 à 02:47
hhhp2004

salut,

sous quelle forme sont les chiffres dans la memoire ? parce que le prog du gars utilise une fonction qui transforme le nombre recherche en lettres ! autrement (si tu cherche les chiffres tel quel sans transformer en lettres), il ne trouve rien presque rien compare a la multitude de des resultats quil trouve quand on transforme les chiffres en lettres.

autre affaire :

sur certains programmes comme les jeux lapi WriteProcessMemory, ne fonctionne pas, par exemple jai esseye de changer le contenu de la zone de memoire ou un jeu gardait le nombre de vies qui restent et le jeu a plante completement !

sais tu comment eviter cela ? et pourquoi ReadProcessMemory ne sapplique pas a ce genre de programme ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_neria Messages postés 319 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 16 février 2009
26 mars 2005 à 10:16
Salut !

Dans la mémoire les valeurs sont accessibles à partir d'une adresse qui pointe sur un octet (suite de 8 bits consécutifs) . Tu peut donc voir ce que tu veut : 1 caractère = 1 octet (à convertir en ASCII pour avoir la correspondance avec les lettres), un entier : 4 octets... cela dépend de ce que tu cherches en fait. Après avoir lu la mémoire, il faut vérifier que tout à bien fonctionné, l'API doit renvoyer une valeur non nulle si ça à marché et 0 sinon car tout les processus ne permettent pas l'accès à leur mémoire, je crois qu'on peut la protéger.

Pour WriteProcessMemory tu dit "jai esseye de changer le contenu de la zone de memoire ou un jeu gardait le nombre de vies",
Hors on ne peut pas être sûr à 100% que la zone à modifier soit la bonne, tu as peut être modifier du code ou des autres valeurs, il faut aussi savoir sous quelle forme est stocké la valeur à modifier (entier, flottant, double...). De plus il suffirait que le programme stocke ces valeurs dans une variable dynamique pour que tu n'y ait pas accès. Pour WriteProcessMemory il faut aussi que la mémoire ne soit pas protégé. Il faut donc faire très attention quand à cette API !

@+ Neria
0
Rejoignez-nous