Besoin de vos lumieres avec readprocessmemory()

Messages postés
10
Date d'inscription
lundi 1 mai 2006
Statut
Membre
Dernière intervention
7 septembre 2006
-
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
-
Bonjours j'essais actuelement de faire un bot pour world of warcraft seulement je n'arrive pas a lire les information nessessaire ( vie , mana etc ... ). J'utilise la fonction readprocessmemory pour lire ces information mais je dois manquer d'experience , la fonction me retourne toujours -1 quel que soit l'état du process cible.

Voici mon code si vous pouviez m'aider a trouver se qui cloche sa m'aiderai grandement :)

var
  Form1: TForm1;
  uProcessInfo: TProcessEntry32;
  Fentr : integer;
  PrcID : integer;
  ProID : integer;
  Opnpr : integer;
  Wrtpr : cardinal;
  Buf   : pchar;
  NumberOfBytes : byte;
  PokeValue     : dword;
  PokeAddress   : dword;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:LongBool;
begin

 //Il faut indiqué la taille de la structure dans la structure avant de l'utiliser
  uProcessInfo.dwSize:= SizeOf(TProcessEntry32);
  //Création d'un snapshot des processus en cours d'excution
  opnpr:= CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  //Récupéation des infos du premier processus snapshoté
  Process32First(opnpr, uProcessInfo);
  //On boucle sur les processus
  repeat
    //Si c'est notre homme
    if CompareText(uProcessInfo.szExeFile, 'Project1.exe') = 0 then
    begin
      //On demande un handle permettant de le lire
      opnpr:= OpenProcess(PROCESS_VM_READ, False, uProcessInfo.th32ProcessID);
      Break;
    end;
  until not Process32Next(opnpr, uProcessInfo);

 
  PokeAddress   := $455B68;
  NumberOfBytes := 4;  // Nombre de byte à écrire ( 4 pour un integer , non ? )
  GetMem(Buf,SIZEOF(integer));  
  
  Buf^  := Chr(PokeValue);                                             // La valeur à écrire
  i:=readProcessMemory(Opnpr, ptr(PokeAddress),Buf,NumberOfBytes,Wrtpr); // On lit la valeur
  ShowMessage(BoolToStr(i)); // ici je ne recuper que -1 et la veleur de pokeaddress n'est jamais changé
  label1.Caption:=IntToStr(PokeValue);

  FreeMem(Buf);
end;

Voila merci d'avance !!

5 réponses

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
Integer :  32 bits ou 4 octets.
Recode ta propre fonction BoolToStr, j'ai cru voir sur ce site que son comportement était parfois étrange.

function myBoolToStr(b: boolean):string;
begin
  if b then
    Result := 'True'
  else
    Result : = 'False';
end;

Ca ne serait pas plus simple de faire un OpenProcess directement ? ou un FindWindow plutot que des lister tout les processus ? (Si tu as le titre de la fenetre et/ou sa classe pas besoin de tout lister)
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
Attention, si ce programme a accès au jeu sur un serveur officiel blizzard, ta clé de jeu sera bannie a vie (je ne blague pas, c'est arrivé a une connaissance), tout comme un simple HOOK, il serait detecté et tu serais grillé comme on dit.
Gaffe a toi =)
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
38
booltostr fonctionne trés bien, c'est juste qu'il faut savoir s'en servir :
BoolToStr( 1 1 , false) >>> renvois -1 (true) ou 1 (true) : 0 false
BoolToStr( 1 = 1 , true ) >>> renvois 'true'

on peu egalement faire :

const
   BoolToStr : array[boolean] of string = ('false', 'true);
Label1.Caption :BoolToStr[1 1];

<hr size="2" width="100%" />Croc (click me)
Messages postés
10
Date d'inscription
lundi 1 mai 2006
Statut
Membre
Dernière intervention
7 septembre 2006

Bon un ami est venu a ma rescousse et a arranger le problème il venait de mon :

buf^ := chr(pokevalue) qui n'avait aucun sens .

voila le tout qui marche , sa pourrait servire a certains :

function FindProcessID(const ExeName: string): DWORD;
var
  HSnap: THandle;
  uProcessInfo: TProcessEntry32;
begin
  Result := 0;
  //Il faut indiqué la taille de la structure dans la structure avant de l'utiliser
  uProcessInfo.dwSize := SizeOf(TProcessEntry32);
  //Création d'un snapshot des processus en cours d'excution
  HSnap := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  //Récupéation des infos du premier processus snapshoté
  Process32First(HSnap, uProcessInfo);
  //On boucle sur les processus
  repeat
    //Si c'est notre homme
    if CompareText(uProcessInfo.szExeFile, ExeName) = 0 then
    begin
      CloseHandle(HSnap);
      Result := uProcessInfo.th32ProcessID;
      Break;
    end;
  until not Process32Next(HSnap, uProcessInfo);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  PID: Integer;
  HProc: THandle;
  RValue: DWORD;
  RLength: Cardinal;
begin
 { Fentr := FindWindow(nil,'Project1');                                     // On cherche la fenêtre du jeu...
  PrcID := GetWindowThreadProcessId(Fentr,@ProID);                     // On cherche l'ID une fois que la fenêtre a été trouvée
  Opnpr := OpenProcess(PROCESS_ALL_ACCESS,False,ProID); }

  PID := FindProcessID(ProcessExeName);
  if PID <> 0 then
  begin
    HProc := OpenProcess(PROCESS_VM_READ, False, PID);
    if ReadProcessMemory(HProc, Ptr(ReadAddress), @RValue, SizeOf(RValue), RLength) then
    begin
      Label1.Caption := IntToStr(RLength) + ' bytes read: ' + IntToStr(RValue);
    end;
    CloseHandle(HProc);
  end;

end;

Pour ce qui est de mon projet je me heurte cette fois a l'obtetion de l'adresse mémoire des informations voulues. En effet je me suis appercu qu'elles changeaient a chaque redemarage du jeu ...

Et c'est bien pour un server officiel de wow mais je fais mes testes avec des comptes invité .
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
tu peux essaier de rechercher une valeur connu. et d'en déduire les autres adresse.

(ex: niveau de vie, ...)