bonjour,
j'ai une adresse mémoire : F70FE8 par exemple
sa valeur peut être : 0 ou 1 ou 2
quelle fonction c++ me permettrai de la lire ?
une aide, un tut, un site ...
merci pour votre aide
bonjour,
j'ai une adresse mémoire : F70FE8 par exemple
sa valeur peut être : 0 ou 1 ou 2
quelle fonction c++ me permettrai de la lire ?
une aide, un tut, un site ...
merci pour votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char toto = * ((char *) 0xF70FE8);
quand je le fais, il y a erreur car violation d'accès
un site pour comprendre comment lire et afficher et mettre dans des variables les valeurs des adresses mémoires d'autres applications ??
Tu l'as sors d'ou l'adresse 0xF70FE8 ???
Ca vient peut etre de la ton erreur !
non, c'était juste une adresse fictive l'histoire d'avoir une focntion ou un petit code
sinon, j'ai une vrai adresse mais il y a violation d'accès pour lecture :
0x1AB40F0
Une adresse mémoire n'est valide que pour un processus donné. Tu l'obtiens comment cette adresse ?
ReadProcessMemory(hReadp,(LPCVOID)0x28000496, &buf, bufsize,NULL);
(LPCVOID)0x28000496 = cette adresse est l'adresse de la case mémoire qu'on veut lire ?
Mais que diable veux-tu faire avec une adresse absolue ?
Il y a de fortes chances que windows t'en empêche.
Envoyé par Luc Hermitte
A mon avis Ilimo veut se faire un utilitaire qui permette de tricher dans un jeu...
mais effectivement une adresse mémoire ne représente jamais des données continuellement valides dans le temps
bon sang..
j'ai un programme qui me lit des adresses mémoires
mais il est en delphi
ce n'est pas moi qui l'ai fait
mais je l'ai utilisé pour lire des données mémoires en boucle
vous me direz alors pour quoi je voudrais en faire un autre?
pour la simple raison que ce programme utilise la pile de message de windows pour simuler des touches claviers
donc je suis détecté au bout d'une 30 de mn
avec c++ je peux simuler le niveau materiel, mais envoyer des des frappes de clavier ne sert pas à grande chose si c'est pas au bon moment
d'où lecture des adresses mémoires
bon bonne idée ou pas
au moins, c'est un défi pour le petit programmeur que je suis
vilà un bout de code:
mais je ne sais pas pourquoi, rien ne s'affiche
bon voilà vous savez tout
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #include <iostream> #include <tchar.h> #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { char adresse_data[24000]; DWORD adresse_data_size = sizeof(adresse_data); DWORD dw_PID=21; // un process id quelconque HANDLE h_Read_Process; h_Read_Process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE, dw_PID); if(NULL != h_Read_Process) { int ret = ReadProcessMemory(h_Read_Process,(LPCVOID)0x28000496, &adresse_data, adresse_data_size,NULL); for(int e=0;e<=sizeof(adresse_data);e++) printf("%c",adresse_data[e]); } CloseHandle(h_Read_Process); return 0; }
alors ça vous dit de m'aider ?
C'est spécifique Windows.
tu lis n'importe où dans n'importe quel process, pas étonnant que ça plante.DWORD dw_PID=21; // un process id quelconque
ceci ne précise pas que je veux lire uniquement le process 21 et non pas n'importe quel programme?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DWORD dw_PID=21; // un process id quelconque
C'est quoi le process 21 ?
Chez moi le PID des premiers process commence à 450.
désolé
c'était une valeur fictive
l'histoire juste de remplir le code
sinon, j'utilise Process Explorer et je trouve pour Flashget : 3892
mais je ne sais pas si c'est pareil sur tous les ordi
mais après tout je me demande si je suis clair dans ma demande et je me demande aussi que peut-être je ne sais pas exactement comment ça se passe au niveau mémoire :
1- j'utilise Windows XP Pro mise à jour totale
2- j'utilise Visaul c++ 2003
3- j'ai fait un programme win32 console application
4- ce programme s'appelle rm ( read memory )
5- j'ai un autre programme qui manipule beaucoup de données( =dp)
6- pour cela dp, charge une dll ( dont je connais le nom )
7- le rôle de rm est d'aller dans la zone mémoir de cette dll pour :
a- lire la valeur contenu dans une adresse donnée
b- la stocker dans une autre variable
8- j'ai la base adresse de cette dll(ça me permet de calculer le offset)
9- j'ai l'adresse de la variable qui m'interesse
10- est-ce que mon petit bout de code est utile ?
11- mais ce que je dis, est valable pour n'importe quel programme du moment où vous connaissez sa base-adresse, l'adresse de la variable dont vous chercher la valeur
12- j'espère que cette fois-ci mes intentions sont un peu plus clair pour vous aider à me diriger
merci
Il te manque quelques notions.
Même sur un même ordi, le PID est aléatoire, ton process peut s'exécuter x fois en même temps, avec un PID différent à chaque fois.
8/ la base adresse codée dans la dll est seulement indicative, si Windows n'arrive pas à charger la dll à cette adresse, elle sera modifiée (rebasing).
il est aleatoire à chaque demarrage de windows
mais je peux le retrouver : Process Explorer
mais il doit être possible de trouver la base adresse de cette dll utilisant son nom, même si ça cahnge à chaque démarrage de windows
ayant à chaque fois le PID, la base adresse et ayant calculé les offsets
j'aurais accès tout le temps aux varaibles que je veux
du moins théoriquement
///////////////////////////////////
j'ai ajouté ceci dans les code précedent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #include <iostream> #include <tchar.h> #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { char adresse_data[24000]; DWORD adresse_data_size = sizeof(adresse_data); DWORD dw_PID=21; // un process id quelconque HANDLE h_Read_Process; h_Read_Process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE, dw_PID); if(NULL != h_Read_Process) { ------------------------------------ SIZE_T dwSize; PDWORD lpflOldProtect; VirtualProtectEx( h_Read_Process, (LPVOID)0x1630000, dwSize, PAGE_READONLY, lpflOldProtect); ------------------------------------ int ret = ReadProcessMemory(h_Read_Process,(LPCVOID)0x28000496, &adresse_data, adresse_data_size,NULL); for(int e=0;e<=sizeof(adresse_data);e++) printf("%c",adresse_data[e]); } CloseHandle(h_Read_Process); return 0; }
je pense que ceci permet de modifier les droits d'accès à la zone mémoire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ------------------------------------ SIZE_T dwSize; PDWORD lpflOldProtect; VirtualProtectEx( h_Read_Process, (LPVOID)0x1630000, dwSize, PAGE_READONLY, lpflOldProtect); ------------------------------------
mais je ne sais pas comment trouver le dwSize, et non plus si c'est à moi de remplir la variable : lpflOldProtect
Le redémarrage de Windows n'a aucune influence. Tout dépend des dll que ton exe utilise. S'il utilise 2 dlls qui ont la même base adresse (ou qu'elles se chevauchent), va y avoir conflit et donc relocation de l'une d'entre elles.
Le PID varie a chaque exécution de ton jeux. Dans un autre topic, on t'a expliqué comment lister les dlls d'un process, et donc comment avoirt leurs adresses mappées.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager