16-07-2017, 01:59
Petite introduction pour les débutants:
Les cheats externes sont des logiciels qui seront lancés en même temps que le jeu mais qui ne s'injectent pas dans le jeu.
Ils utilisent deux fonctions principales : readprocessmemory et writeprocessmemory que l'on écrira sous la forme de rpm et wpm.
Ces deux fonctions permettent de faire à peu près tout ce que vous voulez, c'est à dire récupérer des données et/ou modifier des données dans le jeu. Exemple: vie, position, arme en main, angle de vue, tir, etc.. mais attention cependant ! De base le rpm n'est pas détecté par VAC le wpm non plus mais seulement si correctement utilisé. Si vous utiliser un wpm pour écrire dans une section "interdite" de modification dans le jeu (forcer une variables sv_cheats, section .text, ...) alors VAC vous détectera instantanément.
Il y a aussi toutes les variables qui sont calculées coté serveur, qui reste impossible à modifier (point de vie, position du joueur local, ...) donc pas de cheat d'invincibilité ou noclip
Ensuite c'est bien beau d'avoir du rpm et du wpm mais encore faut-il savoir où lire et où écrire n'est-ce pas ? Pour cela il nous faut trouver des adresses et offset. Un offset représente une adresse dans la mémoire du jeu en référence à une adresse de base. Par exemple l'adresse de la variable maison :
maison = route+numero, l'adresse de base est route et l'offset est numero. Et le tout nous permet d'atteindre l'adresse de maison et donc de connaitre sa valeur ou de la modifier.
Dans cs:go on récupère en général deux adresses de bases, les modules engine.dll et client.dll, ces deux adresses peuvent ensuite être combinées à d'autres puis encore d'autres et ainsi de suite pour atteindre la valeur de la variable que l'on cherche.
Exemple de structure de lecture de mémoire dans cs:go (en utilisant les offsets localplayer = information du joueur local et health = point de vie)
Mes points de vie = (client.dll+localplayer)+health
Et là vous me direz youpi on peut s'y mettre mais il nous faut trouver la valeur de ces offsets ! Les offsets de manière général sont représentés sous leur forme hexadécimal
vb.net
dwLocalPlayer = &HAAFFFC
c++
dwLocalPlayer = 0xAAFFFC
Pour les trouver il nous faut faire du reverse engineering, ou bien en français de l'ingénierie inverse. Etudier cs:go pour savoir où est stocké quelle variable, pourquoi inverse ? car on cherche par la fin, on cherche la valeur de la variable final avant de pouvoir retrouver son adresse. Pour cela je vous propose deux logiciels de prédilection CheatEngine qui reste le plus simple de prise en main, et Ollydbg qui permet bien plus mais que je ne détaillerais pas dans ce tutoriel.
Pour commencer, nous allons chercher un offset simple, celui du joueur local (localplayer) et du tableau des données des autres joueurs (entityplayer). Pour trouver l'offset du joueur local nous allons chercher la valeur de nos propres points de vie dont nous connaissons l'offset
m_iHealth = 0xFC
Les offsets de variables utilisées en réseau, appelées NetVar (networked variables) permettant la transmission des données de joueurs à joueurs, sont retrouvables dans plusieurs dump de csgo, je ne détaillerais pas ici le processus d'obtention de ce dump car de toutes façons les offsets des netvar ne changent jamais (sauf mise a jour modifiant énormément le jeu). Voici une liste complète des netvars du jeu :
CSGO NETVAR DUMP
Allez on s'y met ! Lancer cs:go, lancer un serveur avec des bots (hors ligne) puis lancer cheat engine, cliquer sur le premier icone en haut à gauche (open process) et choisir csgo.exe puis faire "open" :
Pour vous faciliter la vie je vous propose ma petite cfg pour être tranquille sur le serveur (sv_cheats activé, bot a l'arret, temps d'un round = 1h, respawn auto des terroristes) vous pouvez vous en servir de bind aussi :
Ensuite la barre de recherche Value sera accessible, comme valeur on cherche "100" puisque l'on a 100 point de vie.
Scan type on cherche "Exact Value" car 100 est la valeur exacte de la variable que l'on cherche.
Value Type on laisse 4 bytes car on cherche un integer qui est un chiffre sans décimal et la taille d'un integer est de 4 bytes.
Puis on clique sur First Scan, on peut voir en dessous des 3 icones en haut à gauche que cheat engine trouve plusieurs milliers d'adresses. Il nous faut donc affiner notre recherche, et pour ce faire nous allons changer la valeur de la variable que l'on cherche en tapant hurtme 1 dans la console, on se retrouve avec 99 hp on peut donc rentrer 99 dans la case Value puis on effectue une nouvelle recherche avec Next Scan (et pas new scan attention) et hop là on à réduit le nombre d'adresses à une vingtaine seulement.
On peut ensuite répéter ce processus plusieurs fois mais il arrive très rarement qu'on puisse obtenir qu'une seule adresse (tout simplement car une seule et même donnée peut être accessible via différentes adresses, mais une seule nous intéresse).
Pour trouver la bonne adresse il suffit de double cliquer sur chacune d'entre elles pour les amener dans la fenêtre du bas. Avec l'expérience on reconnait celles qui seront les bonnes ou pas, toutes les premières de la liste ne sont en général pas les bonnes, on double clique sur les dernières (3XXXXXXX) et cela les rajoutes en bas.
Sur les adresses en bas il suffit d'en sélectionner une et de faire un clique droit -> find out what access this adress (ou F5). Jusqu'a trouver l'adresse ayant dans les instruction l'information ecx+000000FC (0xFC étant l'offset des points de vie, le nombre de 0 précédent un offset n'importe pas, 0xFC = 0x000000FC).
Une fois que vous avez trouvé celle contenant l'offset FC faites un clique droit dessus et selectionner Pointer Scan for this address
Choisissez Max Level : 1 pour chercher uniquement 1 offset et pas plusieurs sur la même adresse comme: address + offset et pas address + offset1 + offset2
Le scan nécessite d'enregistrer un fichier, nommer le comme vous désirez (pour ma part je le supprime directement après de toutes manières).
Une fois le scan terminé vous pouvez avoir plusieurs résultats différents, l’intérêt est de garder uniquement ceux qui ont pour offset 0 = FC
Vous pouvez double cliquer sur chacun d'entre eux pour les amener dans la fenêtre du bas de cheat engine. Dans mon exemple il n'y a que 4 adresses ayant pour offset FC.
Ensuite pour savoir quel est la bonne adresse de base pour localplayer et au passage trouver entityplayer on vient supprimer l'offset FC pour savoir où pointe l'adresse de base. Il y a surement une meilleure méthode mais pour ma part je viens double cliquer sur le pointerscan result, je copie l'adresse "client.dll"+XXXXX, je supprime l'offset en décochant "pointer" et je viens coller l'adresse dans la premiere case "Address" ainsi que dans la description (Entre temps le round s'est relancé est j'ai 78hp )
On a donc une liste avec dans la description la structure de l'adresse "client.dll"+offset (la description correspond à ce qu'on veut pour désigner une adresse ça peut très bien être "adresselol123", là on s'en sert pour différencier les résultats) et dans "Address" l'adresse où pointe "client.dll"+offset. Pour chaque adresses on va venir faire un clique droit -> browse memory region ou selectionner l'adresse puis ctrl-B.
Localplayer possède une structure similaire à cela :
EntityPlayer possède une structure similaire à cela :
Les deux autres adresses correspondent en fait à des adresses accessibles via les informations du serveur. Comme on fait tout nos test sur un serveur hors ligne avec des bots, cheatengine nous permet aussi de trouver des pointer (adresse + offset) accessible uniquement lorsque notre machine héberge le serveur. Ces adresses ne fonctionneront pas sur un serveur en ligne, et cela est vite vérifiable en faisant des test avec son cheat
Dans notre cas la 1ere et la 2e adresse sont respectivement localplayer et entityplayer. Pour vérifier entityplayer on vient faire bot_add et bot_kick et on voit que des informations se rajoutent et disparaissent en fonction de si on ajoute ou enlève des bots. En voici une petite démonstration (désolé pour la qualité vidéo) :
Donc en conclusion dans notre cas localplayer = "client.dll"+00AAFFFC et entityplayer = "client.dll"+04A8C724, avec l'habitude pas la peine de répéter toutes ces étapes, après le pointerscan on reconnait facilement quel est localplayer et entityplayer par rapport à leurs anciennes valeurs. Car oui elles changent, et en général après chaque mise à jour du jeu. Par la suite l'utilisation de Dumper facilite la vie et vient nous donner les valeurs des offsets. Le plus utilisé étant HazeDumper qui a la particularité de mettre à jour la liste des offset directement en ligne sur github. Il y a aussi la possibilité de retrouver soi même automatiquement la valeur des offset avec le signature scanning, qui fera l'objet d'un autre tutoriel mais dans le principe il est bien de comprendre toutes ces étapes d'adresses + offset.
Voila c'est la fin de ce premier tuto, personnellement j'ai "appris" la programmation en auto didacte (merci google) donc le tutoriel peut ne pas être parfait ou contenir des erreurs, des modifications auront surement lieu celui ci étant le premier d'une serie de tuto sur la programmation de cheat externes !
Bon courage et à bientôt pour la suite !
Les cheats externes sont des logiciels qui seront lancés en même temps que le jeu mais qui ne s'injectent pas dans le jeu.
Ils utilisent deux fonctions principales : readprocessmemory et writeprocessmemory que l'on écrira sous la forme de rpm et wpm.
Ces deux fonctions permettent de faire à peu près tout ce que vous voulez, c'est à dire récupérer des données et/ou modifier des données dans le jeu. Exemple: vie, position, arme en main, angle de vue, tir, etc.. mais attention cependant ! De base le rpm n'est pas détecté par VAC le wpm non plus mais seulement si correctement utilisé. Si vous utiliser un wpm pour écrire dans une section "interdite" de modification dans le jeu (forcer une variables sv_cheats, section .text, ...) alors VAC vous détectera instantanément.
Il y a aussi toutes les variables qui sont calculées coté serveur, qui reste impossible à modifier (point de vie, position du joueur local, ...) donc pas de cheat d'invincibilité ou noclip
Ensuite c'est bien beau d'avoir du rpm et du wpm mais encore faut-il savoir où lire et où écrire n'est-ce pas ? Pour cela il nous faut trouver des adresses et offset. Un offset représente une adresse dans la mémoire du jeu en référence à une adresse de base. Par exemple l'adresse de la variable maison :
maison = route+numero, l'adresse de base est route et l'offset est numero. Et le tout nous permet d'atteindre l'adresse de maison et donc de connaitre sa valeur ou de la modifier.
Dans cs:go on récupère en général deux adresses de bases, les modules engine.dll et client.dll, ces deux adresses peuvent ensuite être combinées à d'autres puis encore d'autres et ainsi de suite pour atteindre la valeur de la variable que l'on cherche.
Exemple de structure de lecture de mémoire dans cs:go (en utilisant les offsets localplayer = information du joueur local et health = point de vie)
Mes points de vie = (client.dll+localplayer)+health
Et là vous me direz youpi on peut s'y mettre mais il nous faut trouver la valeur de ces offsets ! Les offsets de manière général sont représentés sous leur forme hexadécimal
vb.net
dwLocalPlayer = &HAAFFFC
c++
dwLocalPlayer = 0xAAFFFC
Pour les trouver il nous faut faire du reverse engineering, ou bien en français de l'ingénierie inverse. Etudier cs:go pour savoir où est stocké quelle variable, pourquoi inverse ? car on cherche par la fin, on cherche la valeur de la variable final avant de pouvoir retrouver son adresse. Pour cela je vous propose deux logiciels de prédilection CheatEngine qui reste le plus simple de prise en main, et Ollydbg qui permet bien plus mais que je ne détaillerais pas dans ce tutoriel.
Pour commencer, nous allons chercher un offset simple, celui du joueur local (localplayer) et du tableau des données des autres joueurs (entityplayer). Pour trouver l'offset du joueur local nous allons chercher la valeur de nos propres points de vie dont nous connaissons l'offset
m_iHealth = 0xFC
Les offsets de variables utilisées en réseau, appelées NetVar (networked variables) permettant la transmission des données de joueurs à joueurs, sont retrouvables dans plusieurs dump de csgo, je ne détaillerais pas ici le processus d'obtention de ce dump car de toutes façons les offsets des netvar ne changent jamais (sauf mise a jour modifiant énormément le jeu). Voici une liste complète des netvars du jeu :
CSGO NETVAR DUMP
Allez on s'y met ! Lancer cs:go, lancer un serveur avec des bots (hors ligne) puis lancer cheat engine, cliquer sur le premier icone en haut à gauche (open process) et choisir csgo.exe puis faire "open" :
Pour vous faciliter la vie je vous propose ma petite cfg pour être tranquille sur le serveur (sv_cheats activé, bot a l'arret, temps d'un round = 1h, respawn auto des terroristes) vous pouvez vous en servir de bind aussi :
Code :
mp_freezetime 0;mp_roundtime_defuse 60;sv_cheats 1;bot_stop 1;mp_respawn_on_death_t 1;mp_restartgame 1;mp_buyanywhere 1;mp_startmoney 16000
Ensuite la barre de recherche Value sera accessible, comme valeur on cherche "100" puisque l'on a 100 point de vie.
Scan type on cherche "Exact Value" car 100 est la valeur exacte de la variable que l'on cherche.
Value Type on laisse 4 bytes car on cherche un integer qui est un chiffre sans décimal et la taille d'un integer est de 4 bytes.
Puis on clique sur First Scan, on peut voir en dessous des 3 icones en haut à gauche que cheat engine trouve plusieurs milliers d'adresses. Il nous faut donc affiner notre recherche, et pour ce faire nous allons changer la valeur de la variable que l'on cherche en tapant hurtme 1 dans la console, on se retrouve avec 99 hp on peut donc rentrer 99 dans la case Value puis on effectue une nouvelle recherche avec Next Scan (et pas new scan attention) et hop là on à réduit le nombre d'adresses à une vingtaine seulement.
On peut ensuite répéter ce processus plusieurs fois mais il arrive très rarement qu'on puisse obtenir qu'une seule adresse (tout simplement car une seule et même donnée peut être accessible via différentes adresses, mais une seule nous intéresse).
Pour trouver la bonne adresse il suffit de double cliquer sur chacune d'entre elles pour les amener dans la fenêtre du bas. Avec l'expérience on reconnait celles qui seront les bonnes ou pas, toutes les premières de la liste ne sont en général pas les bonnes, on double clique sur les dernières (3XXXXXXX) et cela les rajoutes en bas.
Sur les adresses en bas il suffit d'en sélectionner une et de faire un clique droit -> find out what access this adress (ou F5). Jusqu'a trouver l'adresse ayant dans les instruction l'information ecx+000000FC (0xFC étant l'offset des points de vie, le nombre de 0 précédent un offset n'importe pas, 0xFC = 0x000000FC).
Une fois que vous avez trouvé celle contenant l'offset FC faites un clique droit dessus et selectionner Pointer Scan for this address
Choisissez Max Level : 1 pour chercher uniquement 1 offset et pas plusieurs sur la même adresse comme: address + offset et pas address + offset1 + offset2
Le scan nécessite d'enregistrer un fichier, nommer le comme vous désirez (pour ma part je le supprime directement après de toutes manières).
Une fois le scan terminé vous pouvez avoir plusieurs résultats différents, l’intérêt est de garder uniquement ceux qui ont pour offset 0 = FC
Vous pouvez double cliquer sur chacun d'entre eux pour les amener dans la fenêtre du bas de cheat engine. Dans mon exemple il n'y a que 4 adresses ayant pour offset FC.
Ensuite pour savoir quel est la bonne adresse de base pour localplayer et au passage trouver entityplayer on vient supprimer l'offset FC pour savoir où pointe l'adresse de base. Il y a surement une meilleure méthode mais pour ma part je viens double cliquer sur le pointerscan result, je copie l'adresse "client.dll"+XXXXX, je supprime l'offset en décochant "pointer" et je viens coller l'adresse dans la premiere case "Address" ainsi que dans la description (Entre temps le round s'est relancé est j'ai 78hp )
On a donc une liste avec dans la description la structure de l'adresse "client.dll"+offset (la description correspond à ce qu'on veut pour désigner une adresse ça peut très bien être "adresselol123", là on s'en sert pour différencier les résultats) et dans "Address" l'adresse où pointe "client.dll"+offset. Pour chaque adresses on va venir faire un clique droit -> browse memory region ou selectionner l'adresse puis ctrl-B.
Localplayer possède une structure similaire à cela :
EntityPlayer possède une structure similaire à cela :
Les deux autres adresses correspondent en fait à des adresses accessibles via les informations du serveur. Comme on fait tout nos test sur un serveur hors ligne avec des bots, cheatengine nous permet aussi de trouver des pointer (adresse + offset) accessible uniquement lorsque notre machine héberge le serveur. Ces adresses ne fonctionneront pas sur un serveur en ligne, et cela est vite vérifiable en faisant des test avec son cheat
Dans notre cas la 1ere et la 2e adresse sont respectivement localplayer et entityplayer. Pour vérifier entityplayer on vient faire bot_add et bot_kick et on voit que des informations se rajoutent et disparaissent en fonction de si on ajoute ou enlève des bots. En voici une petite démonstration (désolé pour la qualité vidéo) :
Donc en conclusion dans notre cas localplayer = "client.dll"+00AAFFFC et entityplayer = "client.dll"+04A8C724, avec l'habitude pas la peine de répéter toutes ces étapes, après le pointerscan on reconnait facilement quel est localplayer et entityplayer par rapport à leurs anciennes valeurs. Car oui elles changent, et en général après chaque mise à jour du jeu. Par la suite l'utilisation de Dumper facilite la vie et vient nous donner les valeurs des offsets. Le plus utilisé étant HazeDumper qui a la particularité de mettre à jour la liste des offset directement en ligne sur github. Il y a aussi la possibilité de retrouver soi même automatiquement la valeur des offset avec le signature scanning, qui fera l'objet d'un autre tutoriel mais dans le principe il est bien de comprendre toutes ces étapes d'adresses + offset.
Voila c'est la fin de ce premier tuto, personnellement j'ai "appris" la programmation en auto didacte (merci google) donc le tutoriel peut ne pas être parfait ou contenir des erreurs, des modifications auront surement lieu celui ci étant le premier d'une serie de tuto sur la programmation de cheat externes !
Bon courage et à bientôt pour la suite !