• 11 Juillet 2025, 07:29:41


Auteur Sujet: [SA] Life "tool"  (Lu 4994 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
[SA] Life "tool"
« 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

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #1 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
Courtesy of GtaManiac

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #2 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) 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.
« Modifié: 20 Mars 2009, 02:21:35 par [viruz]rider_77 »

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #3 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
Courtesy of GtaManiac

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #4 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.

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #5 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 ?

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #6 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
Courtesy of GtaManiac

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #7 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
« Modifié: 25 Mars 2009, 01:01:45 par [viruz]rider_77 »

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #8 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/

***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
« Modifié: 27 Mars 2009, 16:49:38 par [viruz]rider_77 »

Hors ligne UZI-I

  • BinaryIPL Manager
  • *
  • Grand Banditisme
  • http://www.yoa2n.fr
  • Messages: 825
    • Voir le profil
    • Yoa2n.fr
Re : [SA] Life "tool"
« Réponse #9 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
« Modifié: 27 Mars 2009, 19:50:45 par UZI-I »

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #10 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.

Hors ligne UZI-I

  • BinaryIPL Manager
  • *
  • Grand Banditisme
  • http://www.yoa2n.fr
  • Messages: 825
    • Voir le profil
    • Yoa2n.fr
Re : [SA] Life "tool"
« Réponse #11 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

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #12 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

Hors ligne UZI-I

  • BinaryIPL Manager
  • *
  • Grand Banditisme
  • http://www.yoa2n.fr
  • Messages: 825
    • Voir le profil
    • Yoa2n.fr
Re : [SA] Life "tool"
« Réponse #13 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 =)

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : [SA] Life "tool"
« Réponse #14 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++ ?