This page has been robot translated, sorry for typos if any. Original content here.

Écrire des formateurs pour les jeux (entraîneur de jeux)

Intro:

Nous avons tous, jadis ou récemment, joué à des jeux de société, de sport et à l’introduction de la technologie informatique dans nos vies. En raison de son âge, de ses habitudes ou tout simplement de son désir, il se détendra après une dure journée de travail.

Il semblerait que le jeu offre des possibilités illimitées de réalisation de soi: en tant que pilote, pilote, tueur ou même dieu. Mais l'homme est tellement arrangé: ayant atteint une certaine hauteur, il veut toujours quelque chose de plus et trouve donc un nouvel objectif ou de nouvelles opportunités.

Il est clair que lors de la création de jeux, les développeurs sont principalement guidés, sinon par leurs propres goûts, puis par ceux du chef de projet, parfois par des statistiques. Mais parfois, vous voulez simplement ralentir les effets de la Matrix. Indiana Jones a migré vers le jeu. Ce n’est pas le héros le plus agile de l’industrie du jeu - Hitman, Hitman, qui a appris à courir sur les murs. À ces fins, des formateurs sont créés.

Théorie:

Formateur (formateur anglais) - programme conçu pour modifier le comportement du jeu, travaillant généralement directement avec la mémoire vive de l'ordinateur.

Dans les années 1980 et 1990, les entraîneurs étaient généralement intégrés directement dans le code du jeu par des pirates. Lors du démarrage, le formateur a tout d’abord été lancé avec la boîte de dialogue «Voulez-vous utiliser des astuces?», Puis le code du jeu a été exécuté. Le nom du formateur utilisait des signes d'addition (+), un pour chaque option du formateur. Par exemple, «Hacker Group présente: Doom +++» - trois options, par exemple, l'immortalité, des munitions sans fin et la téléportation.

Cependant, les entraîneurs modernes utilisent généralement un programme séparé avant le jeu et utilisent, dans leurs noms, un signe d’addition indiquant le nombre d’options suivant, par exemple "Doom Trainer +15". De plus, les formateurs modernes travaillent avec la RAM du jeu, et non avec son fichier exécutable, car les modifications apportées au fichier exécutable sont compliquées par les systèmes de protection contre la copie.

Les méthodes

Pour créer des entraîneurs, des amortisseurs de mémoire, des débogueurs et des désassembleurs sont utilisés. Le moyen le plus simple de créer un coach consiste à rechercher dans la mémoire une valeur correspondant au paramètre de jeu souhaité. Puis changez-le et recherchez à nouveau la liste résultante. Après plusieurs itérations, il y aura probablement une petite liste d'adresses, les valeurs auxquelles vous pouvez essayer de changer. Il existe de nombreux utilitaires tels que: ArtMoney, Cheat'o'Matic - automatisent le processus de recherche et de modification des valeurs.

Dans certains cas, la valeur de jeu souhaitée change constamment de position dans la mémoire. Dans ce cas, vous pouvez essayer de trouver un pointeur sur celui-ci, éventuellement avec un léger décalage, si la valeur de jeu se trouve dans une structure de données. Si le pointeur change de position en mémoire, vous pouvez alors rechercher un pointeur sur ce pointeur, etc. Vous pouvez également définir des points d'arrêt sur les appels de la valeur de jeu et analyser le code qui les lit ou les modifie.

Pour résumer, alors qu'est-ce que c'est, DMA? DMA (Dynamic Memory Allocation) est une allocation de mémoire dynamique. En termes simples, les jeux DMA, contrairement aux jeux non-DMA, stockent les valeurs qu’ils utilisent dans des adresses de mémoire qui changent après chaque lancement de jeu. Tous les jeux DOS n'utilisent pas DMA, alors que la plupart des jeux Win32 l'utilisent.


Pratique:

Dans cet article, je vais examiner les principes d’écriture des entraîneurs pour les jeux DMA et non DMA. Dans RuNet, il existe très peu d'informations sur ce sujet, des exemples de code déjà disponibles, les écrits des formateurs n'ayant souvent pas été testés, ce qui signifie qu'ils peuvent tout simplement confondre les débutants. Tout ce dont nous avons besoin, c'est du langage de programmation Delphi et du débogueur TSearch.
  1. Jeux non DMA:

Nous commençons TSearch. En cliquant sur Open Process, nous sélectionnons le processus qui nous intéresse dans la liste. Ensuite, en utilisant la recherche, nous cherchons, filtrons, puis déterminons l'adresse de la valeur d'intérêt. A titre d'exemple, je considérerai le jeu GTA - Vice City. Le paramètre d'intérêt est le temps.

Comme vous pouvez le constater, pour minimiser le code, je n’ai pas utilisé de vérification de l’existence d’une fenêtre de programme. Étant donné que je ne vois pas l'intérêt de minimiser ou de maximiser l'application, il est beaucoup plus pratique d'utiliser un menuisier quelconque et de coller le fichier de jeu et l'entraîneur ensemble.

 var
 Form1: TForm1;
 WindowName: entier;
 ProcessId: entier;
 ThreadId: entier;
 HandleWindow: Integer;
 écris: cardinal;

 buf: dword;
 const 
 WindowTitle = 'GTA: Vice City'; 
 Adresse = 0097F266 $; 
 NumberOfBytes = 4; 

 mise en oeuvre

 {$ R * .dfm}

 procedure s1ow_mode; 
 commencer
 WindowName: = FindWindow (nil, WindowTitle); 
 ThreadId: = GetWindowThreadProcessId (WindowName, @ ProcessId);
 HandleWindow: = OpenProcess (PROCESS_ALL_ACCESS, False, ProcessId);
 buf: = 3E90 $;
 WriteProcessMemory (HandleWindow, ptr (adresse), @buf, 4, write);
 fin

 procédure nos1_mode; 
 commencer
 WindowName: = FindWindow (nil, WindowTitle); 
 ThreadId: = GetWindowThreadProcessId (WindowName, @ ProcessId);
 HandleWindow: = OpenProcess (PROCESS_ALL_ACCESS, False, ProcessId);
 buf: = 3F80 $;
 WriteProcessMemory (HandleWindow, ptr (adresse), @buf, 4, write);
 fin

 procédure TForm1.Timer1Timer (Sender: TObject);
 commencer
 if (GetAsyncKeyState (VK_LBUTTON) <> 0), puis 
 commencer
 s1ow_mode;
 fin
 if (GetAsyncKeyState (VK_RBUTTON) <> 0), puis
 commencer
 nos1_mode;
 fin
 fin 


Protection:
Si le jeu a un tableau des meilleurs scores officiel ou si le jeu est en réseau et si tous les calculs ne vont pas du côté du serveur, alors l'existence d'entraîneurs ruine le jeu. Dans ce cas, il est nécessaire de prévoir un système de protection contre les formateurs, car les systèmes de protection contre la copie ne peuvent pas s’acquitter de cette tâche. Pour ce faire, les paramètres de jeu les plus importants sont chiffrés et déchiffrés peu de temps avant leur utilisation, ou une copie chiffrée est créée avec laquelle le paramètre original est constamment comparé. Pour contourner de telles protections, on ne peut se passer de désassembler le programme.