cs_cyprine
Messages postés10Date d'inscriptionlundi 1 mai 2006StatutMembreDernière intervention 7 septembre 2006
-
5 sept. 2006 à 15:05
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 2009
-
7 sept. 2006 à 08:58
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 :)
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);
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 5 sept. 2006 à 15:20
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)
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 5 sept. 2006 à 19:27
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 =)
cs_cyprine
Messages postés10Date d'inscriptionlundi 1 mai 2006StatutMembreDernière intervention 7 septembre 2006 7 sept. 2006 à 03:23
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é .
Vous n’avez pas trouvé la réponse que vous recherchez ?