GTAOnline.net

Forum GTAOnline => Discussions générales => Jeux vidéo => Discussion démarrée par: [viruz]rider_77 le 18 Mars 2009, 23:53:58

Titre: [SA] Life "tool"
Posté par: [viruz]rider_77 le 18 Mars 2009, 23:53:58
Bonjour chers programmeurs (meilleurs que moi),
Je fais appel à vous, puisque depuis plusieurs jours je me casse la tête.
J'essaye de créer un MINI programme console. Le but est tout simple. Si l'utilisateur entre 'v', son CJ refait le plein de vie.
Je suis un programmeur débutant et je n'ai jamais fait un truc pareil. Je fais appel à vous (Syg, passes par ici plz :D )!

Code: (cpp) [Sélectionner]
#include <windows.h>
#include <stdio.h>

void SetHealth(float fHealth);

int main (void)
{
printf("Entres 'v' pour faire le plein de vie et 'q' pour quitter!\n\n");
while(getchar() != 'q')
{
if(getchar() == 'v')
{
SetHealth(100);
}
}
return 0;
}
void SetHealth(float fHealth)
{
DWORD _dw;
VirtualProtect ( ( LPVOID )0xB793E0, sizeof ( float ), PAGE_EXECUTE_READWRITE, &_dw );
* ( float* )0xB793E0 = fHealth;
}

Bon, je crois que ce que j'ai fait est bon. Il faudrait que j'utilise une fonction comme WriteProcessMemory, mais j'ai un peu de mal.

Merci de l'aide et du temps offert :D
Titre: Re : [SA] Life "tool"
Posté par: Syg le 19 Mars 2009, 01:06:38
Je ne connais pas du tout la fonction VirtualProtect.
Heureusement il y a l'aide en ligne.

En fait ce que tu veux faire c'est aller écrire dans la mémoire d'un autre process.
Dans ton programme, tu accèdes à la mémoire de ton programme lui même.

Il y avait un erreur qui empêchait d'appeler ta fonction SetHealth, je l'ai corrigée ci-dessous.

J'ai fait des essais non concluants mais mes erreurs portent sur le pointeur 0xB793E0.
Le code retour que j'ai est 6 (pointeur invalide) quand j'appelle la fonction VirtualProtectEx.
Si on ne fait pas le VirtualProtectEx, on a la même erreur mais sur le WriteProcessMemory cette fois ci.

Voici le programme que j'ai fait :
#include <windows.h>
#include <stdio.h>

void SetHealth(float fHealth, DWORD);

int main (void)
{
char Car;
printf("Entres 'v' pour faire le plein de vie et 'q' pour quitter!\n\n");

   /* J'ai corriger cette partie car elle ne fonctionnait pas */
   Car = getchar();
while(Car != 'q')
{
if(Car == 'v')
{
SetHealth(100, 1824); // L'id de gta_sa.exe est en dur ici, ce ne sera certainement pas la même chez toi
}
      Car = getchar ();
}
return 0;
}
void SetHealth(float fHealth, DWORD ProcessId)
{
HANDLE hProcess;
DWORD BytesWritten = 0, OldProtect =0;

   printf ("ProcessId = %d", ProcessId);
   hProcess = OpenProcess (PROCESS_VM_WRITE+PROCESS_VM_OPERATION, FALSE, ProcessId);
   if (hProcess == INVALID_HANDLE_VALUE)
   {
      printf ("Erreur d'ouverture du process : %d\n", GetLastError ());
      return;
   }

   if (VirtualProtectEx (hProcess, (VOID *)0xB793E0, 4, PAGE_READWRITE, &OldProtect) == 0)
   {
      printf ("Erreur protection memoire : %d\n", GetLastError ());
      CloseHandle (hProcess);
      return;
   }


   if (WriteProcessMemory (hProcess, (VOID *)0xB793E0, &fHealth, 4, &BytesWritten) ==0)
   {
      printf ("Erreur d'écriture : %d\n", GetLastError ());
   }

   CloseHandle (hProcess);
}

Pour l'id du processe gta_sa.exe, il existe des fonctions pour le retrouver.

Bon courage.

++
Syg
Titre: Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 19 Mars 2009, 01:32:09
J'ai été chanceux de te trouver sur lalu :P
Très grand merci à toi. J'analyse le code de façon approfondie, je cherche sur internet pour savoir comment trouver l'ID d'un Process et si j'ai d'autres problèmes, je reposterai :D

Merci encore :D

EDIT: Effectivement, l'adresse pose problème. En fait, je suis allé ici http://www.gtamodding.com/index.php?title=Memory_Addresses_(SA) (http://www.gtamodding.com/index.php?title=Memory_Addresses_(SA)) pour trouver le pointeur vers la variable de la vie et j'ai trouvé 0xB793E0 - [float] Health stat .
 Je continu de chercher.

EDIT2: J'ai testé avec d'autre pointeur (gravité, traffic, heure) et j'ai toujours cette fameuse erreur 6. Cependant, j'ai toujours l'IP de ton Process, je ne suis pas parvenu à trouver la mienne.
***Tu pourrais me donner un code qui trouve l'ip d'un process plz. Pas besoin de commenter rien, je suis capable de chercher pas moi-même.
Titre: Re : [SA] Life "tool"
Posté par: Syg le 20 Mars 2009, 10:16:34
Pour trouver l'ID d'un process, tu peux utiliser le gestionnaire des taches.
Tu vas ensuite dans le menu "Affichage/Sélectionner de colonnes..." et tu coches la case "PID (Identificateur de Processus)".
Ensuite tu affiches la liste des processus (Onglet Processus).
Puis tu récupères la valeur que tu trouves dans cette colonne pour le processus gta_sa.exe.
C'est la méthode manuelle.

Pour déterminer l'ID d'un processus par programme, il faut utiliser PSAPI.
Il faut que tu trouve le fichier PSAPI.H (à inclure dans ton source) et le fichier PSAPI.LIB (pour le link).
Fais une recherche sur la fonction EnumProcesses, tu devrais pouvoir trouver des exemples d'utilisation de PSAPI.

Pour l'histoire de ton pointeur, je dirais qu'il faudrait pourvoir trouver l'adresse de base de la mémoire du processus gta_sa.exe. Dans le lien que tu donnes, il parle bien d'offset ce qui sous-entend qu'il faut une adresse de base (à laquelle tu ajoutes le fameux offset pour trouver l'adresse réelle).
 Je vais voir si je peux trouver quelque chose la-dessus.

++
Syg
Titre: Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 20 Mars 2009, 20:40:06
Merci des réponses.
J'avais chercher dans le gestionnaire de tâches, mais le PID était pas coché :P

Je vais également chercher un peu de mon côté :D

Merci encore Syg.
Titre: Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 22 Mars 2009, 03:46:51
En gros, il faut que je trouve un moyen de "repérer" l'adresse de base de la mémoire du processus gta_sa.exe ?
Titre: Re : [SA] Life "tool"
Posté par: Syg le 24 Mars 2009, 11:41:05
Non, en fait, tout fonctionne correctement mais avec le jeu en solo.
Pour le jeu lancé avec SA-MP, soit la mémoire est protégé et il n'est pas possible d'y accéder de cette façon (ce serait une protection contre les logiciels de cheat), soit les offsets ne sont pas les mêmes que pour le jeu en solo (ce qui semble le cas car le code retour est "pointeur invalide").

Dans le premier cas, on ne peut rien faire.
Dans le deuxième cas, il faut chercher les offsets correspondants à GTA:SA:MP.

Sinon, pour retrouver l'ID d'un process, j'ai trouvé un méthode simple :
   /* Recherche de la fenêtre de GTA SA */
   hWnd = FindWindow (NULL, "GTA: San Andreas");
   if (hWnd == NULL)
   {
      printf ("Erreur, jeu non lance\n");
      return;
   }

   /* On recherche l'ID du process */
   GetWindowThreadProcessId (hWnd, &ProcessId);

Cette méthode nécessite de connaître le nom de la fenêtre du jeu ("GTA: San Andreas" pour le jeu en solo, "GTA:SA:MP" pour le jeu lancé sous SA-MP).
Pour trouver ce nom (qui ne change normalement jamais), il faut lancer le jeu puis afficher la liste des applications (onglet applications dans le gestionnaire des tâches) et récupérer le nom exact de l'application.

++
Syg
Titre: Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 24 Mars 2009, 21:20:16
Merci de l'astuce Syg. Avec la MSDN tout a rentré :D
Je vais essayer de terminer le tool maintenant.

EDIT : OMFG !!!! Ça marche nickel ! Énorme merci à toi Syg. Je ne t'oublirai pas dans les thank's, même si ça ne changera pas grand chose pour toi  :laugh
En fait, le problème c'était le suivant : J'exécute GTA SA en tant qu'Admin, mais je ne le fesais pas pour mon tool :P
Maintenant ça marche nikel! Ah, merci mec :D !

Trainer en développement ! :D
Titre: Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 27 Mars 2009, 05:44:40
Salut à tous,
Ayant du temps libre ce soir, je me suis amusé à faire quelques tests. C'est loin d'être le trainer que je sortirai au courant des semaines qui suivent, mais c'était quelques tests pour moi. J'ai tout mit sur mon blog (qui n'est pas commencé). Vous y retrouverez les fichiers sources, ainsi que le Setup. La plupart se fouteront complètement des sources, mais j'ai dû en chercher pendant plus d'un mois, alors comme on dit j'aide mon prochain, en espérant qu'il pourrait avancé mieux que moi avec des sources comme ça. Merci de me rapporter tout bug. Je remercie également Syg pour le coup de main apporté et UZI-I pour de l'aide apportée C/C++ auparavant, qui m'a mené jusqu'ici.

Voici le lien: http://felixweb.olympe-network.com/telechargements/Rider%27s%20Trainer/Petits%20tests/ (http://felixweb.olympe-network.com/telechargements/Rider%27s%20Trainer/Petits%20tests/)

***Il faut lancer une partie avant de lancer le trainer

Bon jeu.
Rider_77


EDIT: @ Syg, finalement je crois avoir compri les offsets. J'ai trouvé sur wiki :D
Titre: Re : [SA] Life "tool"
Posté par: UZI-I le 27 Mars 2009, 19:48:03
Bouah j'vais te répondre ici...
J'voit que tu galere encore pour les pointeur lorsque tu essaye de modifier une valeur en te trouvant en dehors de l'espace memoire alloué et utilisé par le processus.

Le principe est simple, un pointeur n'est qu'une variable de type integer, et non signé.
Rappelons que la taille de l'entier varie d'un processeur a l'autre (Proc. 16Bits 2 Octets, Proc. 32Bits = 4 Octets, Proc. 64Bits = 8 Octets...)

Donc revenons a nos pointeurs. Cette variable donc, puisque c'est un pointeur vers un espace memoire, contient simplement l'adresse de base de cet espace memoire.
Imaginons

T'as la valeur de ta vie qui se trouve à l'adresse "CPed +0x540 = [float] Health"
Mais qu'est-ce donc que ce CPed ? CPed est un objet que le jeu utilise pour chaque entité de type piétons dans le jeu. (C'est compliqué comme exemple mais bon si tu visualise un minimum dans ta tete l'etat de la memoire de ton processus, c'est simple. ne t'inquiete pas ça vient avec le temp et l'entrainement)
Donc en gros dans le jeu, on a une liste chainé de CPed (Qu'on Appelle CPedPool)... Le premier piétons est @ "AddrBaseCPedPool + sizeof ( CPed ) * 0 )", le deuxieme est a "AddrBaseCPedPool + sizeof ( CPed ) * 1 )"... Tu comprendra, c'est vraiment pas compliqué...

Mais pour le moment, tu veut simplement modifier la vie de ton joueur. Or, le joueur n'est rien d'autre qu'un CPed (Réellement, il est en fait un CPlayerPed qui herite de la classe CPed et il me semble que dans CPlayerPed, il y a un autre poiteur qui pointe sur la vie, mais bref...)
Et que le pointeur du CPed de notre joueur est @ 0xB6F5F0 =)

On a tous ce qu'il nous faut, l'offset de notre variable "Vie" dans CPed et le pointeur vers notre CPed en question. Allons y :P
Donc on va commencer par trouver l'adresse reel de notre CPed, je t'est expliqué plus haut qu'un pointeur n'est autre qu'une variable qui contient une adresse memoire.
Donc on va lire ce qui se trouve dans notre pointeur =)
ReadProcessMemory ( 0xB6F5F0 ) sans oublié de specifier la taille par "sifeof ( int ). (Ma fonction est derisoire)
Donc la, on va obtenir l'adresse de base du CPed de notre joueur. Genial non ?
Maintenant, on sait que la vie de notre joueur se trouve donc a CPed + 0x540. Et le CPed de cette equation n'est autre que l'adresse que l'on vient de lire :P
Il faut proceder comme en math avec des equation a plusieur inconnu :P

Donc maintenant on va lire la vrai valeur de notre vie :
ReadProcessMemory ( CPed + 0x540 ); La vie est un float donc on specifie la taille "sizeof ( float )" et on remplace CPed par la variable qui stocke la premiere valeur qu'on a lu =)

On peut tout aussi bien y ecrire quelque chose...
WriteProcessMemory() mais la tu sais deja l'utiliser :D

Je te tape pas du vrai code ici. Si t'en a besoin demande moi. Et faudra que j'te montre comment te retrouver dans l'espace memoire du processus, et tu n'aura plus a te faire chier :D

Aller bye... Fiou ce diiscours xD
Titre: Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 27 Mars 2009, 20:33:55
Merci beaucoup UZI-I,
en fait, j'avais essayé d'utiliser ReadProcessMemory(), mais sans plus.
Je comprend pourquoi tu me disais que j'utilisais mal les offsets et les pointeurs surtout.

Encore merci.
Titre: Re : [SA] Life "tool"
Posté par: UZI-I le 27 Mars 2009, 20:34:59
Frenchement heiste pas a me parler. Le soir j'suis un peu claqué, pour ça que j't'envoie chier defois xD
Mais bon surtotu que chaque soir j'suis au tel donc difficile de suivre une conversation et de reflechir a tes soucis :P
Titre: Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 27 Mars 2009, 20:40:11
 :laugh Non t'inquiètes je comprend que j'ai été harcelant :P Je t'avais dit y'a pas longtemps que je ne le serais plus ;)
Vraiment un énorme merci d'accepter de m'aider :D

Sinon pour le trainer, il me reste à :
-Apprendre à programmer en mode fenêtre
-Comprendre mieux le fonctionnement de GTA SA

En gros, j'en ai pour quelques semaines, mais le trainer verra définitivement le jour :D
Titre: Re : [SA] Life "tool"
Posté par: UZI-I le 27 Mars 2009, 23:12:44
Faire de la fenetre en Win32 c'est chiant... Je te conseillerais de passer par le FrameWork en C# par example qui est un bon language =)
Titre: Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 27 Mars 2009, 23:18:23
J'ai un très bon tuto sur le siteduzero pour apprendre le Framework Qt. En même temps, je ne veux pas trop m'écarter (rester dans le C/C++)... le C# c'est bien différent du C/C++ ?
Titre: Re : [SA] Life "tool"
Posté par: UZI-I le 27 Mars 2009, 23:32:51
Moi j'te conseille le C#...
Ou le C++ .Net mais bon...
Titre: Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 27 Mars 2009, 23:53:51
D'accord, jusqu'ici il m'a toujours été payant de te faire confiance. De plus, il est beaucoup mieux d'utiliser soi-même les fonctions, que d'avoir un framework comme Qt qu'il l'a déjà fait pour toi. Finalement, avec Qt, il faut avoir 4-5 DLL qui font environ 500mo au total. Personne voudra télécharger mes créations :P

Donc, je vais m'orienter vers C#. Ce sera un peu plus de boulot, mais ce sera beaucoup mieux.

Petite question, est-ce que je devrais finir d'apprendre le C++ (il me reste à approfondir la surcharge d'opérateurs, à voir l'héritage et à voir les éléments statiques et constants).


EDIT: J'aurais un petit problème, auquel tu, ou bien Syg, pouvez me répondre par msn ou encore sur le topic.
J'ai voulu lire à adresse mémoire du processus de GTA, mais ce fut sans succès.
En gros, je veux lire à l'adresse CPed +0x544 et ensuite écrire à l'adresse mémoire du pointeur sur la vie de CJ le résultat de ma lecture de mémoire précédente.

Voici le lien: http://pastebin.com/m37de93cc (http://pastebin.com/m37de93cc)
Titre: Re : [SA] Life "tool"
Posté par: UZI-I le 28 Mars 2009, 09:34:23
Parce que t'as tout faux sur la lecture :P
Tu lis @ ( 0xB6F5F0+0x544 )
Or 0xB6F5F0 n'est pas l'adresse de base de l'objet CPed mais bel et bien l'adresse qui contient l'adresse de la base. (Un pointeur quoi)


=)

Pour le C#, techniquement il est pas plus leger que Qt puisqu'il utilise la framework .NET. Une application dotnet n'est pas une application stand alone et ne s'execute pas toute seule, elle est executer par une machine virtuelle, comme Java par exemple.

Qt c'est un ensemble de lib avec plein de fonction (trop) mais qui reste quand meme interessant si tu veut rester dans du purement C / C++

Quant a ce qu'il te manque comme cours, tu les apprendra en temps voulu, quand tu bloquera dessus. Il est inutile de lire un cours entier, on le retient jamais, il faut y aller progressivement et assimiler chaque choses en son temps.
Titre: Re : [SA] Life "tool"
Posté par: Ssk le 19 Avril 2009, 16:34:06
Salut je me suis aider du code de rider avec les amelioration, seul probleme quand j' appuye sur la tuche la vie augmente bien de 100 mais .... la barre de vie devient toute petite  :lmao


je vous donne le code ne vous occuper pas du keybind avec



#include <stdlib.h>
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>


using namespace std;
void SetHealth(float fHealth, DWORD ProcessId);
int main(int argc, char *argv[])
{
    const SHORT Mask = 32768;
int bContinue = 1;
   
HWND hWnd;
DWORD ProcessId;


   /* On recherche l'ID du process */

while(bContinue)
{
if (GetKeyState(0x31) & Mask)
{
Sleep(100);
keybd_event(0x54,0,0,0);
keybd_event(0x54,0,KEYEVENTF_KEYUP,0);
keybd_event(0x6F,0,0,0);
keybd_event(0x6F,0,KEYEVENTF_KEYUP,0);
keybd_event(0x54,0,0,0);
keybd_event(0x54,0,KEYEVENTF_KEYUP,0);
keybd_event(0x41,0,0,0);
keybd_event(0x41,0,KEYEVENTF_KEYUP,0);
keybd_event(0x5A,0,0,0);
keybd_event(0x5A,0,KEYEVENTF_KEYUP,0);
keybd_event(0x45,0,0,0);
keybd_event(0x45,0,KEYEVENTF_KEYUP,0);
keybd_event(0x52,0,0,0);
keybd_event(0x52,0,KEYEVENTF_KEYUP,0);
keybd_event(0x0D,0,0,0);
keybd_event(0x0D,0,KEYEVENTF_KEYUP,0);
cout<<"Commande /tazer vient d' etre binder"<<endl;
}
if (GetKeyState(0x73) & Mask)
{
hWnd = FindWindow (NULL, "GTA: San Andreas");
Sleep(100);
if (hWnd == NULL)
   {
  printf ("Erreur, jeu non lance\n");
   }
   else{
GetWindowThreadProcessId (hWnd, &ProcessId);
SetHealth(100, ProcessId);
   }
}
}

     return 0;
}
void SetHealth(float fHealth, DWORD ProcessId)
{
HANDLE hProcess;
DWORD BytesWritten = 0, OldProtect =0;
   
printf ("ProcessId = %d", ProcessId);
      hProcess = OpenProcess (PROCESS_VM_WRITE+PROCESS_VM_OPERATION, FALSE, ProcessId);
   if (hProcess == INVALID_HANDLE_VALUE)
   {
      printf ("Erreur d'ouverture du process : %d\n", GetLastError ());
      return;
   }

   if (VirtualProtectEx (hProcess, (VOID *)0xB793E0, 4, PAGE_READWRITE, &OldProtect) == 0)
   {
      printf ("Erreur protection memoire : %d\n", GetLastError ());
      CloseHandle (hProcess);
      return;
   }


   if (WriteProcessMemory (hProcess, (VOID *)0xB793E0, &fHealth, 4, &BytesWritten) ==0)
   {
      printf ("Erreur d'écriture : %d\n", GetLastError ());
   }

   CloseHandle (hProcess);
}



EDIT: ajout du screen
Aussi on ne peut augmenter la vie qu' une fois



Probleme resolu merci UZI-I
Titre: Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 19 Avril 2009, 22:53:21
Petit UP pour dire que le trainer ne verra jamais le jour en version GUI (fenêtre).
C'était seulement quelques apprentissages :D

Je suis content que mon code aille servi à quelqu'un :D

++
Rider_77
Titre: Re : [SA] Life "tool"
Posté par: Ssk le 20 Avril 2009, 13:49:43
lol moi aussi ca m' as servit pour m' enrichir, je l utilise pas comme vrai trainer lol, l' erreur etait juste que je m' etait tromper d' adresse j' ai changer le stats de vie max au lieu de changer le niveau de vie
Titre: Re : Re : [SA] Life "tool"
Posté par: [viruz]rider_77 le 20 Avril 2009, 23:20:40
lol moi aussi ca m' as servit pour m' enrichir, je l utilise pas comme vrai trainer lol, l' erreur etait juste que je m' etait tromper d' adresse j' ai changer le stats de vie max au lieu de changer le niveau de vie
Oui j'ai vu ça :P
J'avais fait la même  :laugh