<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Auger</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Auger"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Auger"/>
	<updated>2026-04-16T12:39:09Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Game_Trainer&amp;diff=10738</id>
		<title>Game Trainer</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Game_Trainer&amp;diff=10738"/>
		<updated>2018-11-15T18:45:16Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;i&amp;gt;Auteur : Lukas AUGER&amp;lt;/i&amp;gt;&lt;br /&gt;
[https://drive.google.com/open?id=1hO-lMe49HwhLr9qbY5BMKFcXHF9bcKyK Version PDF]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;Les « Trainers » sont des programmes ayant pour objectif d’accéder aux adresses en mémoire d’un logiciel afin de lire et de modifier une valeur ou un mécanisme spécifique dans le but d’engendrer un comportement inattendu. On parle souvent de « Game Trainers » car ces derniers sont généralement développés afin de tricher aux jeux vidéo. Le niveau de difficulté quant au développement d’un tel programme varie énormément en fonction du logiciel auquel il s’attaque : plus ce dernier est complet et complexe, plus il est difficile de trouver l’information recherchée. L’impact d’un trainer varie également entre un logiciel en ligne (disposant d’une partie serveur avec laquelle un certain nombre de données sont synchronisées avec le client) et hors ligne (client seul). De surcroît, les méthodes permettant de lutter contre ces attaques ne sont pas les mêmes.&lt;br /&gt;
&lt;br /&gt;
Parmi quelques exemples applicatifs de ces programmes, on retrouve notamment la possibilité de geler la valeur d’une variable (points de vie, nombres de munitions, et plus globalement les « compteurs » de n’importe quelle nature qu’ils soient) ou de lui faire atteindre des valeurs disproportionnées, mais aussi de provoquer ou d’observer le déclenchement d’événements particuliers.&lt;br /&gt;
Les game trainers diffèrent des codes de triches dans la mesure où ces derniers ont été pensés à cet effet par les développeurs dans le but de faciliter la progression du joueur, ou de lui offrir une nouvelle expérience de jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Fonctionnement théorique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L’accès à la mémoire ==&lt;br /&gt;
&lt;br /&gt;
Une des méthodes les plus employées pour la réalisation d’un trainer consiste, dans un premier temps, à identifier l’adresse mémoire liée à la valeur que l’utilisateur souhaite modifier. Pour ce faire, nous utiliserons un scanneur de mémoire du nom de Cheat Engine. Ce logiciel permet de lister toutes les adresses mémoires rattachées à un logiciel précis, de rechercher une adresse en particulier en fonction de différents critères (comme son type) et à l’aide d’opérateurs de comparaison (appliqués lorsque la valeur change), et enfin de modifier la valeur stockée dans cet espace. Il offre de nombreuses fonctionnalités comme la recherche de pointeurs, l’injection de code ou encore le contrôle de la souris notamment utilisé pour la création d’aimbots; certaines d’entre-elles seront abordées dans ce wiki.&lt;br /&gt;
&lt;br /&gt;
Un problème que nous risquons rapidement de rencontrer réside dans le fait qu’une simple adresse mémoire a de fortes chances d’être différente lorsque le jeu sera relancé, ou plus tard pendant l’exécution du jeu. En connaissant l’adresse d’un pointeur, nous pourrons de ce fait accéder à l’adresse mémoire dans laquelle est stockée la valeur que nous souhaitons lire ou modifier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:PtrAdrVal.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le pointeur déterminé, deux cas de figures peuvent se présenter : l’adresse du pointeur est conservée de manière statique dans la mémoire, ou alors elle l’est de manière dynamique. Pour faire simple, dans le cas de l’allocation de mémoire statique, il est possible de connaître l’emplacement de la ressource dès lors que le programme est compilé (et donc d’y accéder de manière déterministe à chaque lancement du programme), tandis que lors d’une allocation dynamique, il n’est pas possible de prédire quel emplacement mémoire sera utilisé.&lt;br /&gt;
En d’autres termes, l’objectif est d’obtenir une adresse de pointeur de la forme :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&#039;MonProgramme.exe&#039;+Offset=AdresseValeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, ‘MonProgramme.exe’ est ce qu’on appelle un module principal. Dans certains cas, une adresse statique peut être accédée à partir de l’adresse d’une ressource de la forme ‘MaRessource.dll’ : on parle alors de module tout court, mais le principe reste le même. L’adresse derrière ce module correspond à l’adresse minimale à partir de laquelle le logiciel va pouvoir allouer de la mémoire. D’une certaine manière, il s’agit d’un référentiel qu’on peut facilement connaître à l’aide d’un langage de programmation, et qui constituer le point de départ à partir duquel nous allons accéder à notre valeur.&lt;br /&gt;
&lt;br /&gt;
La notion d’offset, ou décalage, est généralement exprimé en hexadécimal et correspond on nombre de « sauts » à effectuer dans la mémoire à partir d’une certaine adresse afin d’accéder à une adresse mémoire cible. Le code C suivant illustre simplement cette notion en partant d’un tableau de 200 entiers :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// ptr = ptr[0] = ptr + 0&lt;br /&gt;
int *ptr = (int*) malloc(200 * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
// ptr8 = ptr[8] = ptr + 8&lt;br /&gt;
int *ptr8 = ptr + 8;&lt;br /&gt;
&lt;br /&gt;
// ptr199 = ptr[199] = ptr + 199&lt;br /&gt;
int *ptr199 = ptr + 199;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour résumer, une adresse statique se compose de l’adresse d’un module que l’on va pouvoir facilement connaître, à laquelle on additionne un certain nombre (offset) afin d’accéder à une adresse en mémoire donc la valeur contiendra ce qui nous intéresse : ici, une autre adresse que nous permettra d’accéder à la valeur recherchée.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TabStaticPtr.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le cas où l’adresse du pointeur n’est pas statique, il est nécessaire de remonter plus haut dans la mémoire jusqu’à trouver un pointeur statique : on parle alors de multilevel pointer, ou encore de level-n pointer.&lt;br /&gt;
&lt;br /&gt;
Enfin, il est possible qu’une adresse statique mène directement à la valeur recherchée, sans passer par un pointeur intermédiaire. Cela n’arrive cependant presque jamais car les programmes pour lesquels des trainers sont développés atteignent rarement un tel niveau de simplicité.&lt;br /&gt;
&lt;br /&gt;
Nous avons abordé dans les grandes lignes ce que nous souhaitions faire : trouver une adresse statique nous menant jusqu’à notre valeur. Détaillons un peu comment nous y prendre.&lt;br /&gt;
Dans un premier temps, comme vu précédemment, expliquons plus en détail comment trouver l’adresse d’un pointeur. Tout d’abord, nous devons trouver l’adresse mémoire où se trouve la valeur qui nous intéresse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;Adresse=Valeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin de déterminer l’adresse du pointeur, il est d’abord nécessaire de connaître l’adresse de base de celle que nous avons trouvé. Pour cela, il « suffit » de soustraire l’offset de l’adresse trouvée à cette dernière.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;AdresseBase=Adresse-Offset_n&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cheat Engine permet de visualiser les instructions réalisées par l’assembleur afin de déterminer l’offset d’une adresse. Avoir quelques notions en assembleur peut aider, notamment lorsqu’on souhaite réaliser une injection de code. Ainsi, en observant les instructions réalisées précisément lorsqu’on modifie la valeur que nous observons en interagissant avec le logiciel, il devient possible de retrouver l’offset de l’adresse mémoire. Evidemment, il peut arriver que celui-ci soit égale à 0 : dans ce cas, l’adresse trouvée est donc déjà une adresse de base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:AccessAssembly.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, il ne reste plus qu’à trouver l’adresse du pointeur (allouée de manière statique ou dynamique) en recherchant simplement quelle adresse a pour valeur l’adresse de base que nous venons de calculer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;Pointeur \rightarrow AdresseBase&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi calculé l’adresse de pointeur pour une adresse donnée. Si cette adresse n’est pas allouée statiquement, il est nécessaire de réitérer cette démarche jusqu’à trouver une adresse statique (level-n pointer). En résumé, la démarche est la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;Pointeur Statique \rightarrow AdresseBase_1+Offset_1=Pointeur_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Pointeur_(n-1) \rightarrow AdresseBase_(n-1)+Offset_(n-1)=Pointeur_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Pointeur_n \rightarrow AdresseBase_n+Offset_n=Adresse&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous possédons une adresse statique, il faut trouver un moyen de redescendre jusqu’à la valeur initialement observée. Pour cela, rien de plus simple. Supposons que nous disposons d’une fonction getAddress() calculant l’adresse passée en paramètre ; accéder à la valeur observée revient à se déplacer par « sauts » successifs correspondant aux offsets précédemment déterminés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;(Rappel) Pointeur Statique=getAddress(&#039;MonProgramme.exe&#039;+Offset)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Adresse=Valeur&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;\Leftrightarrow&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;getAddress(getAddress(Pointeur Statique)+Offset_i )=Valeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jusqu’à présent, nous avons supposé que l’offset était une information qui ne variait pas dans le programme : elle dépend en réalité de la manière dont est écrit le code, et n’évolue pas tant que le code garde la même structure. Si le logiciel subit une mise à jour importante, il est possible que ces valeurs changent, et qu’il faille recalculer une nouvelle adresse statique. Ici, il faut vraiment voir le pointeur statique comme un référentiel connu qui nous permet de descendre dans la mémoire jusqu’à la valeur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi vu &amp;lt;strong&amp;gt;une manière&amp;lt;/strong&amp;gt; d’accéder à la mémoire d’un logiciel. Par ailleurs, Cheat Engine introduit le concept de Cheat Tables consistant à importer des pointeurs statiques (mais aussi des scripts), déjà calculées par d’autres personnes afin de profiter de certains hacks sans avoir à chercher soi-même ces adresses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L’injection de code ==&lt;br /&gt;
&lt;br /&gt;
Injecter du code dans un logiciel peut rapidement s’avérer complexe, et demande de bonnes connaissances en assembleur. L’idée, ici, est juste de survoler le principe d’injection avec quelques exemples concrets, sans trop entrer dans les détails.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que la valeur observée sera modifiée, des instructions seront réalisées en assembleur. Par exemple, le code suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;int i = 1, j = 1;&lt;br /&gt;
i -= j;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pourra donner un code assembleur à peu près équivalent à ce qui suit :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:Assembly.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note sur l’instruction lea :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;lea reg1,[reg2+offset]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;\Leftrightarrow&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;mov reg1,adresse(reg2+offset)&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A la différence de mov où c’est la valeur qui est stockée dans le registre, et non l’adresse.&lt;br /&gt;
&lt;br /&gt;
L’injection de code consiste simplement à ajouter une ou plusieurs instructions à l’endroit souhaité dans la pile d’exécution afin de modifier, par exemple, le résultat d’une affectation. CheatEngine permet aussi de « commenter » certaines instructions afin de ne pas les exécuter (il réalise probablement un jump de son côté afin de sauter les instructions initialement exécutées).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple d’injection que l’on pourrait effectuer sur le code assembleur vu au-dessus :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alloc(newmem,2048,&amp;quot;Tutorial-x86_64.exe&amp;quot;+2B233) &lt;br /&gt;
&lt;br /&gt;
newmem:&lt;br /&gt;
    mov edx,1E&lt;br /&gt;
    add [rbx+00000790],edx&lt;br /&gt;
&lt;br /&gt;
originalcode:&lt;br /&gt;
    ;lea edx,[rax+01]&lt;br /&gt;
    ;sub [rbx+00000790],edx&lt;br /&gt;
&lt;br /&gt;
exit:&lt;br /&gt;
    jmp returnhere&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, l’injection a lieu à un emplacement mémoire précis. Sans entrer plus en détail sur la manière dont l’insertion est gérée et exploitée, il est fort probable que si le code du logiciel attaqué vient à être modifié, les instructions injectées ne fassent plus ce qui est attendu (au point de potentiellement déclencher des erreurs).&lt;br /&gt;
&lt;br /&gt;
Dans l’exemple ci-dessus, on insère la valeur brute « 30 » (0x1E) dans le registre edx, puis on l’additionne à la valeur de l’adresse rbx+00000790 (pointant vers la variable i). Le code assembleur exécuté sera ainsi :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:AssemblyInjection.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il ne fait aucun doute que la complexité d’une injection dépend de ce que l’on souhaite faire, et des valeurs manipulées (une division de nombres flottants fera appel à d’autres instructions de l’assembleur, par exemple). Il est aussi parfaitement envisageable de récupérer la valeur d’un pointeur qu’on aurait calculé dans la partie précédente afin d’effectuer un certain nombre d’opérations spécifiques.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Exemples applicatifs =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Récupération de données simples d’un jeu ==&lt;br /&gt;
&lt;br /&gt;
Afin de mettre en pratique ce que nous avons abordé précédemment et découvrir comment fonctionne Cheat Engine, je vais vous présenter comment récupérer un accès vers une valeur simple dans un jeu. Pour des raisons évidentes de sécurité, nous jouerons sur un serveur local.&lt;br /&gt;
L’idée va donc consister à récupérer la vitalité (simple, mais toujours aussi efficace) de notre « joueur » afin de tenter de devenir invulnérable sur le jeu The Isle, qui est en cours de développement (ce qui rendra la recherche de pointeurs plus simple à réaliser).&lt;br /&gt;
&lt;br /&gt;
Avant de commencer, nous partons du principe que nous disposons à tout moment de la vitalité courante du joueur (disponible dans des fichiers de données du jeu au format JSON). Dans le cas où la vitalité du joueur n’est pas explicitement affichée sous forme de valeur numérique, il est possible de retrouver une adresse par comparaison, en observant par exemple si la valeur observée (initialement inconnue) est augmentée ou réduite suite à un certain événement (comme le fait de recevoir des dégâts) : cette recherche reste cependant laborieuse et demande beaucoup de temps.&lt;br /&gt;
De plus, nous savons que la valeur désignant les points de vie du joueur est codée sur un entier de 4 bytes. Là aussi, retrouver le type exact de la valeur que nous recherchons peut prendre un certain temps, d’autant plus que les types utilisés dépendent fortement des jeux et des langages dans lesquels ils sont développés).&lt;br /&gt;
&lt;br /&gt;
La première étape, comme expliqué dans la partie précédente, consiste à trouver l’adresse mémoire où est stockée la valeur des points de vie du joueur. Pour ce faire, Cheat Engine permet facilement de rechercher les adresses par valeur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;flex: 1; margin: 10px;&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;Growth&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   &amp;quot;Hunger&amp;quot;: &amp;quot;200&amp;quot;,&lt;br /&gt;
   &amp;quot;Thirst&amp;quot;: &amp;quot;86&amp;quot;,&lt;br /&gt;
   &amp;quot;Stamina&amp;quot;: &amp;quot;106&amp;quot;,&lt;br /&gt;
   &amp;quot;Health&amp;quot;: &amp;quot;6500&amp;quot;,&lt;br /&gt;
   &amp;quot;Oxygen&amp;quot;: &amp;quot;40&amp;quot;,&lt;br /&gt;
   &amp;quot;bGender&amp;quot;: true&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Fichier:TheIsle01.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Plus de 104 adresses différentes ont été trouvées, mais seulement quelques-unes d’entre elles correspondent à ce que nous recherchons vraiment. Afin de trouver la bonne adresse, nous allons modifier la vitalité du joueur en subissant des dégâts en jeu ; les adresses des valeurs qui ont été modifiées seront mises en évidence.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle02.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux valeurs ont été modifiées suite aux dégâts subis. L’une d’elles correspond à un résultat cohérent : le joueur disposant initialement de 6500 pdv, a de fortes chances d’être tombé à 4196 pdv. Il est ainsi quasiment certain que l’adresse &amp;lt;strong&amp;gt;21E33D4BD2C&amp;lt;/strong&amp;gt; contienne la valeur des points de vie du joueur.&lt;br /&gt;
Il arrive souvent que plusieurs adresses contenant la nouvelle valeur soient trouvées. Dans ce cas, il est nécessaire de pousser la recherche un cran plus loin en modifiant chacune d’elles jusqu’à trouver celle qui impacte véritablement la vitalité du joueur.&lt;br /&gt;
&lt;br /&gt;
Nous devons maintenant remonter la mémoire jusqu’à trouver l’adresse d’un pointeur statique. Cependant, nous allons procéder d’une manière différente : rechercher des pointeurs à la main comme expliqué précédemment serait bien trop long, notamment lorsqu’on s’attaque à un jeu pouvant allouer plusieurs millions d’adresses en mémoire. Fort heureusement, Cheat Engine permet de réaliser des « pointer scans » afin de calculer automatiquement tous les pointeurs accédant à l’adresse que nous venons de trouver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle03.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bien que le logiciel soit capable de lister une liste de pointeurs sans effort, il est impossible de prédire l’aspect du pointeur que nous recherchons, et notamment quelle sera la taille maximale d’un de ses offsets, ou même le nombre d’offsets nécessaires à appliquer à partir de l’adresse statique afin de retomber sur notre valeur.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, le pointeur que nous recherchons doit ressembler à ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;getAddress(getAddress(Pointeur Statique)+Offset_i )=AdresseValeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi, il est parfois nécessaire d’effectuer plusieurs scans avec des paramètres de recherche différents jusqu’à tomber sur le bon pointeur. Dans les cas les plus extrêmes, un scan peut mettre plusieurs heures et nécessiter plusieurs GO (voire TO) d’espace disque. De manière plus globale, on favorisera des recherches avec peu d’offsets (3 à 5) mais un maximal élevé (rarement au-delà de 8192), ou beaucoup d’offset (rarement au-delà de 8) mais un maximal faible (1024 ou 2048).&lt;br /&gt;
Pour notre exemple, un seul scan avec ces paramètres suffira à mettre la main sur le pointeur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle04.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le résultat de l’analyse retourne 1431 adresses : certaines d’entre elles sont des adresses statiques, d’autres des pointeurs. Pour rappel, seule les adresses statiques permettent de retrouver notre valeur une fois le jeu relancé ; les pointeurs seront alloués différemment et ne présentent donc aucun intérêt pour la création d’un trainer.&lt;br /&gt;
Afin donc de focaliser notre recherche sur les adresses statiques retournées par le scan, nous allons relancer le jeu, et ne conserver que les adresses qui mènent aux points de vie du joueur (qui a pu se soigner entre temps).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; align-items: center;text-align: center; margin: 0 auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 10px;&amp;quot;&amp;gt;[[Fichier:TheIsle05.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 10px;&amp;quot;&amp;gt;[[Fichier:TheIsle06.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons presque trouvé l’adresse statique rattachée aux points de vie du joueur. A ce stade-là, il ne reste que 27 adresses à tester. Et pour ce faire, nous pouvons relancer plusieurs fois le jeu, et modifier les valeurs manuellement jusqu’à ce qu’il y ait un impact visible en jeu. Il se peut évidemment que plusieurs adresses statiques soient valides : il ne reste alors plus qu’à choisir celle que l’on souhaite conserver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle07.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notons que nous &amp;lt;strong&amp;gt;ne pouvons pas&amp;lt;/strong&amp;gt; simplifier l’écriture de l’adresse statique de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&#039;TheIsle-Win64-Shipping.exe&#039;+02F8F3D0 +30 +3B0+9AC= AdresseValeur&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;\Leftrightarrow&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&#039;TheIsle-Win64-Shipping.exe&#039; + 2F9015C= AdresseValeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La première équation s’écrit en réalité de la manière suivante (dans le cas où plusieurs offsets sont nécessaires) :&lt;br /&gt;
&amp;lt;pre&amp;gt;getAddress(&lt;br /&gt;
    getAddress(&lt;br /&gt;
        getAddress(&lt;br /&gt;
            getAddress(&lt;br /&gt;
                getModuleAddress(&amp;quot;TheIsle-Win64-Shipping.exe&amp;quot;) + 0x02F8F3D0&lt;br /&gt;
            ) + 0x30&lt;br /&gt;
        ) + 0x3B0&lt;br /&gt;
    ) + 0x9AC&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Où la valeur retournée par getAddress() peut évoluer au cours de l’exécution du jeu. C’est pour cette raison qu’il ne faut surtout pas additionner les offsets en pensant que la mémoire reste statique pour chacune des adresses calculées.&lt;br /&gt;
&lt;br /&gt;
Pour nous amuser, nous pouvons geler la variable afin que le joueur ne perde plus de vitalité. Il devient ainsi invulnérable à toute sorte de dégâts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création d’un trainer ==&lt;br /&gt;
&lt;br /&gt;
Le fait d’avoir passé du temps à trouver une adresse statique va nous permettre de réaliser un véritable trainer (simple, mais fonctionnel) afin d’accéder à la vitalité du joueur en lecture et en écriture à partir d’une interface dédiée. Les trainers sont généralement développés en C++ ou en C# avec une sous-couche en Lua  notamment pour réaliser des injections de code.&lt;br /&gt;
Pour cet exemple, nous réaliserons une interface en C# afin de gagner un peu de temps. De plus, nous utiliserons la librairie ProcessMemoryReaderLib.cs qui nous permettra d’utiliser simplement des fonctions de lecture et d’écriture dans la mémoire.&lt;br /&gt;
&lt;br /&gt;
Voici une interface réalisable en quelques clics sur Visual Studio :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:Trainer.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, préparons le squelette du code. L’exemple qui suit est minimaliste, mais sera suffisant pour ce que nous souhaitons faire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private static readonly string PROCESS_NAME = &amp;quot;TheIsle-Win64-Shipping&amp;quot;;&lt;br /&gt;
private System.Diagnostics.Process TheIsleProcess;&lt;br /&gt;
private ProcessMemoryReader ReadMemory;&lt;br /&gt;
&lt;br /&gt;
public Trainer() { InitializeComponent(); }&lt;br /&gt;
&lt;br /&gt;
// Exécuté au chargement du trainer&lt;br /&gt;
private void Trainer_Load(object o, EventArgs e) {&lt;br /&gt;
    ReadMemory = new ProcessMemoryReader();&lt;br /&gt;
    DetectGame();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Exécuté toutes les 100 ms&lt;br /&gt;
private void TimerDetectGame_Tick(object o, EventArgs e) {&lt;br /&gt;
    DetectGame();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Exécuté toutes les 50 ms&lt;br /&gt;
private void TimerShowHealth_Tick(object o, EventArgs e) {&lt;br /&gt;
    ShowHealth();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Exécuté lorsqu&#039;on écrit dans le textbox&lt;br /&gt;
private void VitalityTextbox_TextChanged(object o, EventArgs e) {&lt;br /&gt;
    UpdateHealth();&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d’abord, penchons-nous sur la détection du jeu. L’idée consiste simplement à afficher un message d’avertissement si notre trainer parvient à détecter au non le jeu auquel nous tentons de tricher. De plus, dans l’idéal, il faudrait décider d’afficher le bloc « Vitalité » de l’exemple de fenêtre vu plus haut uniquement si le jeu a bien été détecté.&lt;br /&gt;
Pour détecter un logiciel en C#, nous utilisons la classe System qui va nous permettre de rechercher tous les processus d’un certain nom. Il peut évidemment y en avoir plusieurs, comme par exemple lorsqu’on ouvre plusieurs fois un même navigateur. Ici, nous travaillons sur une seule instance du processus « TheIsle-Win64-Shipping.exe ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private void DetectGame() {&lt;br /&gt;
    System.Diagnostics.Process[] TheIsleProcesses =&lt;br /&gt;
        System.Diagnostics.Process.GetProcessesByName(Trainer.PROCESS_NAME);&lt;br /&gt;
&lt;br /&gt;
    if (TheIsleProcesses.Length != 0) {&lt;br /&gt;
        TheIsleProcess = TheIsleProcesses[0];&lt;br /&gt;
        /*&lt;br /&gt;
            On active les événements TimerShowHealth_Tick&lt;br /&gt;
            et VitalityTextbox_TextChanged&lt;br /&gt;
        */&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        TheIsleProcess = null;&lt;br /&gt;
       /*&lt;br /&gt;
            On désactive les événements TimerShowHealth_Tick&lt;br /&gt;
            et VitalityTextbox_TextChanged&lt;br /&gt;
        */&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il ne nous reste plus qu’à trouver un moyen d’afficher la vitalité du joueur, puis un moyen pour la modifier. En réalité, qu’il s’agisse de lire ou d’écrire dans la mémoire, la manière de procéder est exactement la même. Nous allons simplement lire les octets des emplacements mémoire spécifiques alloués par le processus, que nous devrons ensuite convertir en entier : ce nouvel entier correspond simplement à l’adresse en mémoire (sous forme décimale) que nous avons lue. Enfin, une fois que nous avons obtenu notre &amp;lt;i&amp;gt;AdresseValeur&amp;lt;/i&amp;gt; par succession de sauts dans la mémoire, il ne restera plus qu’à lire l’entier en valeur (codé sur 4 octets dans notre cas).&lt;br /&gt;
&lt;br /&gt;
Il y a cependant une petite subtilité à prendre en compte. Lorsqu’on réalise un trainer, il faut bien avoir en tête que ce dernier s’exécutera sur un processeur 32 bits ou 64 bits. Pour un processeur 32 bits, les adresses sont stockées sur 4 octets, tandis que pour du 64 bits, elles seront stockées sur 8 octets. L’exemple ci-dessous a été adapté seulement pour les systèmes 64 bits. &lt;br /&gt;
&lt;br /&gt;
Voici la fonction qui permettra d’afficher la vitalité du joueur :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private void ShowHealth() {&lt;br /&gt;
    // Lecture de la mémoire du jeu&lt;br /&gt;
    ReadMemory.ReadProcess = TheIsleProcess;&lt;br /&gt;
    ReadMemory.OpenProcess();&lt;br /&gt;
&lt;br /&gt;
    int NumberOfReadBytes;&lt;br /&gt;
    uint ByteSize = sizeof(byte);&lt;br /&gt;
    IntPtr Address;&lt;br /&gt;
    byte[] ReadBytes;&lt;br /&gt;
&lt;br /&gt;
    Int32 Health = 0;&lt;br /&gt;
&lt;br /&gt;
    // Adresse de base : &amp;quot;TheIsle-Win64-Shipping.exe&amp;quot; + 02F8F3D0&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        TheIsleProcess.MainModule.BaseAddress + 0x02F8F3D0,&lt;br /&gt;
        8 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Address = (IntPtr)BitConverter.ToInt64(ReadBytes, 0);&lt;br /&gt;
&lt;br /&gt;
    // Pointeur de niveau 1 : {Adresse de base} + 0x30&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        Address + 0x30,&lt;br /&gt;
        8 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Address = (IntPtr)BitConverter.ToInt64(ReadBytes, 0);&lt;br /&gt;
&lt;br /&gt;
    // Pointeur de niveau 2 : {Pointeur Lvl 1} + 0x3B0&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        Address + 0x3B0,&lt;br /&gt;
        8 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Address = (IntPtr)BitConverter.ToInt64(ReadBytes, 0);&lt;br /&gt;
    &lt;br /&gt;
    // Adresse contenant la valeur : {Pointer Lvl 2} + 0x9AC&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        Address + 0x9AC,&lt;br /&gt;
        4 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Health = BitConverter.ToInt32(ReadBytes, 0);&lt;br /&gt;
&lt;br /&gt;
    // Affichage de la vitalité&lt;br /&gt;
    VitalityLabel.Text = Health.ToString();&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour un système 32 bits, on aurait juste eu à modifier le nombre d’octets lus, et le type de conversion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
    Address + 0x30,&lt;br /&gt;
    4 * ByteSize,&lt;br /&gt;
    out NumberOfReadBytes&lt;br /&gt;
);&lt;br /&gt;
Address = (IntPtr)BitConverter.ToInt32(ReadBytes, 0);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, il ne reste plus qu’à coder la fonction modifiant la valeur de l’adresse en mémoire à chaque interaction avec le champ texte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private void UpdateHealth() {&lt;br /&gt;
    // Début identique à ShowHealth()&lt;br /&gt;
&lt;br /&gt;
    int NumberOfWrittenBytes;&lt;br /&gt;
    byte[] WrittenBytes =&lt;br /&gt;
        BitConverter.GetBytes(Int32.Parse(VitalityTextbox.Text));&lt;br /&gt;
&lt;br /&gt;
    // Parcours identique à ShowHealth()&lt;br /&gt;
    // Address = {Pointeur Lvl 1} + 0x3B0&lt;br /&gt;
&lt;br /&gt;
    // Adresse contenant la valeur : {Pointer Lvl 2} + 0x9AC&lt;br /&gt;
    ReadMemory.WriteProcessMemory(&lt;br /&gt;
        Address + 0x9AC,&lt;br /&gt;
        WrittenBytes,&lt;br /&gt;
        out NumberOfWrittenBytes&lt;br /&gt;
    );&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc une manière de réaliser un trainer simple en quelques minutes. Vous pouvez évidemment utiliser d’autres langages de programmation, comme C, C++, ou Lua, et multiplier les variables en jeu que vous souhaitez contrôler.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Détecter et lutter contre l’utilisation d’un trainer =&lt;br /&gt;
&lt;br /&gt;
Les manières de détecter l’utilisation d’un trainer diffèrent du fait qu’il s’agisse d’un logiciel s’exécutant côté client uniquement, ou pouvant inclure des scripts côté serveur.&lt;br /&gt;
&lt;br /&gt;
== Côté client ==&lt;br /&gt;
&lt;br /&gt;
Les « anti-cheats » côté client sont des logiciels (qu’il faut donc installer, ou au moins exécuter sur la machine) consistant à scanner de manière régulière les instructions exécutées par le jeu, et capables de détecter d’éventuelles instructions ou lignes de code suspicieuses en les comparant à des instructions blacklistées dans une base de donnes, ou encore d’écouter les erreurs de mémoire reportées par le système qui sont généralement issues d’une injection qui s’est mal déroulée. Ces anti-cheats fonctionnent sur un principe relativement proche de celui des anti-virus.&lt;br /&gt;
Cependant, certains hacks plus performants parviennent à passer outre cette protection en changeant en permanence et de manière parfaitement autonome la nature des injections (syntaxe, emplacement, registres utilisés, opérations réalisées, etc) : dans ce cas, il faudrait que l’anti-cheat connaisse autant d’instructions à blacklister que le logiciel de triche en invente, ce qui n’est physiquement pas possible.&lt;br /&gt;
&lt;br /&gt;
== Côté serveur ==&lt;br /&gt;
&lt;br /&gt;
Disposer d’un serveur connecté au client permet généralement de freiner l’exploitation de logiciels de triche sur ce dernier : pour peu que les données des utilisateurs soient conservées (dans une base de données, par exemple), il est alors possible de vérifier l’authenticité d’une information reçue de la part du client. Lorsque cette vérification n’est pas effectuée ou mal réalisée, on parle généralement d’exploitation de faille.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple d’exploitation de faille :&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 2px solid black; padding-left: 5px; margin-left: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
- L’utilisateur modifie une caractéristique A avec son logiciel de triche, puis attaque un ennemi.&lt;br /&gt;
- Le serveur reçoit les caractéristiques du joueur A et l’ennemi ciblé. Il calcule les dommages effectués, modifie les points de vie restant du monstre, et retourne le résultat de l’attaque.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un exemple où cette exploitation de faille ne serait pas possible :&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 2px solid black; padding-left: 5px; margin-left: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
- L’utilisateur modifie une caractéristique A avec son logiciel de triche, puis attaque un ennemi.&lt;br /&gt;
- Le serveur reçoit l’identifiant du joueur A et celui de l’ennemi ciblé. Il récupère ses caractéristiques à partir d’une base de données, calcule les dommages effectués, modifie les points de vie restant du monstre, et retourne le résultat de l’attaque.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces erreurs sont fréquentes sur des logiciels fraîchement créés ou récemment mis à jour, et, bien qu’elles soient relativement faciles à détecter et à corriger, elles peuvent avoir des impacts importants sur le logiciel en question, surtout si la faille est exploitée de manière modéré et discrète sur la durée.&lt;br /&gt;
Détecter une différence entre la valeur client et la valeur récupérée côté serveur n’assure toutefois pas qu’il s’agit d’un acte de tricherie : suivant la nature du logiciel, des désynchronisations peuvent avoir lieu entre client et serveur. Il peut donc parfois être difficile de déterminer précisément si une tentative de triche a été réalisée ou non.&lt;br /&gt;
&lt;br /&gt;
Ici aussi, il existe des anti-cheats dont le fonctionnement peut varier. Exécutés côté serveur (et ne nécessitant donc aucune installation côté client), ils observent les statistiques relatives à l’utilisation du logiciel (comme le résultat d’une partie et le ratio de tués/morts sur un jeu de tir), et détermine de manière probabiliste si l’utilisateur a eu recours à un logiciel de triche (et comparant ses performances à celles d’autres joueurs de même niveau, par exemple). Après un certain nombre d’alertes, l’activité de l’utilisateur est vérifiée par un administrateur qui jugera si un trainer a bel et bien utilisé, notamment en relisant les logs d’une partie et en mettant en évidence des exploits qui ne sont normalement pas possible sans tricher. Cela peut toutefois engendrer la sanction de joueurs particulièrement bons, détectés par le système comme étant des tricheurs.&lt;br /&gt;
Parmi les anti-cheats les plus utilisés, nous retrouvons par exemple battlEye ou FaceIT. Leur fonctionnement reste cependant obscur, et il est difficile de déterminer sur quelles statistiques ces derniers s’appuient, et leur « seuil de tolérance ».&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Conclusion =&lt;br /&gt;
&lt;br /&gt;
Ce wiki avait pour but de présenter les bases sur lesquelles se fondent les entraîneurs de jeux, et de comprendre du mieux possible comment de tels logiciels peuvent fonctionner, mais aussi d’être averti sur la manière dont ces derniers peuvent être repérés. Il est tout à fait possible d’approfondir le sujet notamment au niveau des injections de code, qui ont été très vaguement abordées, ou des injections AOB, qui vont se fonder sur une signature plutôt qu’une adresse mémoire. Cheat Engine est un logiciel complet qui permet d’exploiter la mémoire d’un jeu d’une multitude de façons différentes, et seules deux approches ont été présentées ici.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sources =&lt;br /&gt;
https://en.wikipedia.org/wiki/Trainer_(games) – Introduction, Historique, Définitions&amp;lt;br /&amp;gt;&lt;br /&gt;
https://en.wikipedia.org/wiki/Cheating_in_video_games  - Définitions&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.webopedia.com/TERM/T/trainer.html - Définition&amp;lt;br /&amp;gt;&lt;br /&gt;
https://hackerbot.net/tutorials/151-create-make-trainer-pc-games-cheat-table - Tutoriel (Cheat Engine)&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.manomayasoft.com/blog/item/134-what-is-static-memory-allocation-and-dynamic-memory-allocation - Mémoire statique, mémoire dynamique&amp;lt;br /&amp;gt;&lt;br /&gt;
https://fr.wikipedia.org/wiki/Offset_(informatique) – Mécanisme d’Offset&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.cheatengine.org/forum/viewtopic.php?p=5298727&amp;amp;sid=d00099bee51323582360eaf26bbf3e03 – Mécanisme d’Offset&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.youtube.com/watch?v=yjdSxL2DWfE – Tutoriel de base (Cheat Engine)&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.youtube.com/watch?v=nQ2F2iW80Fk – Tutoriel Pointermaps (Cheat Engine)&amp;lt;br /&amp;gt;&lt;br /&gt;
https://wiki.cheatengine.org/index.php?title=Lua:getModuleSize – GetAddress() en Lua (Cheat Engine)&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.quora.com/How-do-new-anti-cheats-in-online-games-work - Anticheat&amp;lt;br /&amp;gt;&lt;br /&gt;
https://cyberbeartracks.wordpress.com/2017/04/30/cheat-engine-cheating-might-be-wrong-but-its-not-illegal/ - Légalité (Cheat Engine)&amp;lt;br /&amp;gt;&lt;br /&gt;
https://en.wikipedia.org/wiki/Cheating_in_video_games - Légalité&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Game_Trainer&amp;diff=10737</id>
		<title>Game Trainer</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Game_Trainer&amp;diff=10737"/>
		<updated>2018-11-15T18:39:26Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;i&amp;gt;Auteur : Lukas AUGER&amp;lt;/i&amp;gt;&lt;br /&gt;
[https://drive.google.com/open?id=1hO-lMe49HwhLr9qbY5BMKFcXHF9bcKyK Version PDF]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;Les « Trainers » sont des programmes ayant pour objectif d’accéder aux adresses en mémoire d’un logiciel afin de lire et de modifier une valeur ou un mécanisme spécifique dans le but d’engendrer un comportement inattendu. On parle souvent de « Game Trainers » car ces derniers sont généralement développés afin de tricher aux jeux vidéo. Le niveau de difficulté quant au développement d’un tel programme varie énormément en fonction du logiciel auquel il s’attaque : plus ce dernier est complet et complexe, plus il est difficile de trouver l’information recherchée. L’impact d’un trainer varie également entre un logiciel en ligne (disposant d’une partie serveur avec laquelle un certain nombre de données sont synchronisées avec le client) et hors ligne (client seul). De surcroît, les méthodes permettant de lutter contre ces attaques ne sont pas les mêmes.&lt;br /&gt;
&lt;br /&gt;
Parmi quelques exemples applicatifs de ces programmes, on retrouve notamment la possibilité de geler la valeur d’une variable (points de vie, nombres de munitions, et plus globalement les « compteurs » de n’importe quelle nature qu’ils soient) ou de lui faire atteindre des valeurs disproportionnées, mais aussi de provoquer ou d’observer le déclenchement d’événements particuliers.&lt;br /&gt;
Les game trainers diffèrent des codes de triches dans la mesure où ces derniers ont été pensés à cet effet par les développeurs dans le but de faciliter la progression du joueur, ou de lui offrir une nouvelle expérience de jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Fonctionnement théorique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L’accès à la mémoire ==&lt;br /&gt;
&lt;br /&gt;
Une des méthodes les plus employées pour la réalisation d’un trainer consiste, dans un premier temps, à identifier l’adresse mémoire liée à la valeur que l’utilisateur souhaite modifier. Pour ce faire, nous utiliserons un scanneur de mémoire du nom de Cheat Engine. Ce logiciel permet de lister toutes les adresses mémoires rattachées à un logiciel précis, de rechercher une adresse en particulier en fonction de différents critères (comme son type) et à l’aide d’opérateurs de comparaison (appliqués lorsque la valeur change), et enfin de modifier la valeur stockée dans cet espace. Il offre de nombreuses fonctionnalités comme la recherche de pointeurs, l’injection de code ou encore le contrôle de la souris notamment utilisé pour la création d’aimbots; certaines d’entre-elles seront abordées dans ce wiki.&lt;br /&gt;
&lt;br /&gt;
Un problème que nous risquons rapidement de rencontrer réside dans le fait qu’une simple adresse mémoire a de fortes chances d’être différente lorsque le jeu sera relancé, ou plus tard pendant l’exécution du jeu. En connaissant l’adresse d’un pointeur, nous pourrons de ce fait accéder à l’adresse mémoire dans laquelle est stockée la valeur que nous souhaitons lire ou modifier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:PtrAdrVal.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le pointeur déterminé, deux cas de figures peuvent se présenter : l’adresse du pointeur est conservée de manière statique dans la mémoire, ou alors elle l’est de manière dynamique. Pour faire simple, dans le cas de l’allocation de mémoire statique, il est possible de connaître l’emplacement de la ressource dès lors que le programme est compilé (et donc d’y accéder de manière déterministe à chaque lancement du programme), tandis que lors d’une allocation dynamique, il n’est pas possible de prédire quel emplacement mémoire sera utilisé.&lt;br /&gt;
En d’autres termes, l’objectif est d’obtenir une adresse de pointeur de la forme :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&#039;MonProgramme.exe&#039;+Offset=AdresseValeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, ‘MonProgramme.exe’ est ce qu’on appelle un module principal. Dans certains cas, une adresse statique peut être accédée à partir de l’adresse d’une ressource de la forme ‘MaRessource.dll’ : on parle alors de module tout court, mais le principe reste le même. L’adresse derrière ce module correspond à l’adresse minimale à partir de laquelle le logiciel va pouvoir allouer de la mémoire. D’une certaine manière, il s’agit d’un référentiel qu’on peut facilement connaître à l’aide d’un langage de programmation, et qui constituer le point de départ à partir duquel nous allons accéder à notre valeur.&lt;br /&gt;
&lt;br /&gt;
La notion d’offset, ou décalage, est généralement exprimé en hexadécimal et correspond on nombre de « sauts » à effectuer dans la mémoire à partir d’une certaine adresse afin d’accéder à une adresse mémoire cible. Le code C suivant illustre simplement cette notion en partant d’un tableau de 200 entiers :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// ptr = ptr[0] = ptr + 0&lt;br /&gt;
int *ptr = (int*) malloc(200 * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
// ptr8 = ptr[8] = ptr + 8&lt;br /&gt;
int *ptr8 = ptr + 8;&lt;br /&gt;
&lt;br /&gt;
// ptr199 = ptr[199] = ptr + 199&lt;br /&gt;
int *ptr199 = ptr + 199;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour résumer, une adresse statique se compose de l’adresse d’un module que l’on va pouvoir facilement connaître, à laquelle on additionne un certain nombre (offset) afin d’accéder à une adresse en mémoire donc la valeur contiendra ce qui nous intéresse : ici, une autre adresse que nous permettra d’accéder à la valeur recherchée.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TabStaticPtr.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le cas où l’adresse du pointeur n’est pas statique, il est nécessaire de remonter plus haut dans la mémoire jusqu’à trouver un pointeur statique : on parle alors de multilevel pointer, ou encore de level-n pointer.&lt;br /&gt;
&lt;br /&gt;
Enfin, il est possible qu’une adresse statique mène directement à la valeur recherchée, sans passer par un pointeur intermédiaire. Cela n’arrive cependant presque jamais car les programmes pour lesquels des trainers sont développés atteignent rarement un tel niveau de simplicité.&lt;br /&gt;
&lt;br /&gt;
Nous avons abordé dans les grandes lignes ce que nous souhaitions faire : trouver une adresse statique nous menant jusqu’à notre valeur. Détaillons un peu comment nous y prendre.&lt;br /&gt;
Dans un premier temps, comme vu précédemment, expliquons plus en détail comment trouver l’adresse d’un pointeur. Tout d’abord, nous devons trouver l’adresse mémoire où se trouve la valeur qui nous intéresse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;Adresse=Valeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin de déterminer l’adresse du pointeur, il est d’abord nécessaire de connaître l’adresse de base de celle que nous avons trouvé. Pour cela, il « suffit » de soustraire l’offset de l’adresse trouvée à cette dernière.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;AdresseBase=Adresse-Offset_n&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cheat Engine permet de visualiser les instructions réalisées par l’assembleur afin de déterminer l’offset d’une adresse. Avoir quelques notions en assembleur peut aider, notamment lorsqu’on souhaite réaliser une injection de code. Ainsi, en observant les instructions réalisées précisément lorsqu’on modifie la valeur que nous observons en interagissant avec le logiciel, il devient possible de retrouver l’offset de l’adresse mémoire. Evidemment, il peut arriver que celui-ci soit égale à 0 : dans ce cas, l’adresse trouvée est donc déjà une adresse de base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:AccessAssembly.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, il ne reste plus qu’à trouver l’adresse du pointeur (allouée de manière statique ou dynamique) en recherchant simplement quelle adresse a pour valeur l’adresse de base que nous venons de calculer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;Pointeur \rightarrow AdresseBase&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi calculé l’adresse de pointeur pour une adresse donnée. Si cette adresse n’est pas allouée statiquement, il est nécessaire de réitérer cette démarche jusqu’à trouver une adresse statique (level-n pointer). En résumé, la démarche est la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;Pointeur Statique \rightarrow AdresseBase_1+Offset_1=Pointeur_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Pointeur_(n-1) \rightarrow AdresseBase_(n-1)+Offset_(n-1)=Pointeur_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Pointeur_n \rightarrow AdresseBase_n+Offset_n=Adresse&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous possédons une adresse statique, il faut trouver un moyen de redescendre jusqu’à la valeur initialement observée. Pour cela, rien de plus simple. Supposons que nous disposons d’une fonction getAddress() calculant l’adresse passée en paramètre ; accéder à la valeur observée revient à se déplacer par « sauts » successifs correspondant aux offsets précédemment déterminés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;(Rappel) Pointeur Statique=getAddress(&#039;MonProgramme.exe&#039;+Offset)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Adresse=Valeur&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;\Leftrightarrow&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;getAddress(getAddress(Pointeur Statique)+Offset_i )=Valeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jusqu’à présent, nous avons supposé que l’offset était une information qui ne variait pas dans le programme : elle dépend en réalité de la manière dont est écrit le code, et n’évolue pas tant que le code garde la même structure. Si le logiciel subit une mise à jour importante, il est possible que ces valeurs changent, et qu’il faille recalculer une nouvelle adresse statique. Ici, il faut vraiment voir le pointeur statique comme un référentiel connu qui nous permet de descendre dans la mémoire jusqu’à la valeur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi vu &amp;lt;strong&amp;gt;une manière&amp;lt;/strong&amp;gt; d’accéder à la mémoire d’un logiciel. Par ailleurs, Cheat Engine introduit le concept de Cheat Tables consistant à importer des pointeurs statiques (mais aussi des scripts), déjà calculées par d’autres personnes afin de profiter de certains hacks sans avoir à chercher soi-même ces adresses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L’injection de code ==&lt;br /&gt;
&lt;br /&gt;
Injecter du code dans un logiciel peut rapidement s’avérer complexe, et demande de bonnes connaissances en assembleur. L’idée, ici, est juste de survoler le principe d’injection avec quelques exemples concrets, sans trop entrer dans les détails.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que la valeur observée sera modifiée, des instructions seront réalisées en assembleur. Par exemple, le code suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;int i = 1, j = 1;&lt;br /&gt;
i -= j;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pourra donner un code assembleur à peu près équivalent à ce qui suit :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:Assembly.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note sur l’instruction lea :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;lea reg1,[reg2+offset]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;\Leftrightarrow&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;mov reg1,adresse(reg2+offset)&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A la différence de mov où c’est la valeur qui est stockée dans le registre, et non l’adresse.&lt;br /&gt;
&lt;br /&gt;
L’injection de code consiste simplement à ajouter une ou plusieurs instructions à l’endroit souhaité dans la pile d’exécution afin de modifier, par exemple, le résultat d’une affectation. CheatEngine permet aussi de « commenter » certaines instructions afin de ne pas les exécuter (il réalise probablement un jump de son côté afin de sauter les instructions initialement exécutées).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple d’injection que l’on pourrait effectuer sur le code assembleur vu au-dessus :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alloc(newmem,2048,&amp;quot;Tutorial-x86_64.exe&amp;quot;+2B233) &lt;br /&gt;
&lt;br /&gt;
newmem:&lt;br /&gt;
    mov edx,1E&lt;br /&gt;
    add [rbx+00000790],edx&lt;br /&gt;
&lt;br /&gt;
originalcode:&lt;br /&gt;
    ;lea edx,[rax+01]&lt;br /&gt;
    ;sub [rbx+00000790],edx&lt;br /&gt;
&lt;br /&gt;
exit:&lt;br /&gt;
    jmp returnhere&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, l’injection a lieu à un emplacement mémoire précis. Sans entrer plus en détail sur la manière dont l’insertion est gérée et exploitée, il est fort probable que si le code du logiciel attaqué vient à être modifié, les instructions injectées ne fassent plus ce qui est attendu (au point de potentiellement déclencher des erreurs).&lt;br /&gt;
&lt;br /&gt;
Dans l’exemple ci-dessus, on insère la valeur brute « 30 » (0x1E) dans le registre edx, puis on l’additionne à la valeur de l’adresse rbx+00000790 (pointant vers la variable i). Le code assembleur exécuté sera ainsi :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:AssemblyInjection.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il ne fait aucun doute que la complexité d’une injection dépend de ce que l’on souhaite faire, et des valeurs manipulées (une division de nombres flottants fera appel à d’autres instructions de l’assembleur, par exemple). Il est aussi parfaitement envisageable de récupérer la valeur d’un pointeur qu’on aurait calculé dans la partie précédente afin d’effectuer un certain nombre d’opérations spécifiques.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Exemples applicatifs =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Récupération de données simples d’un jeu ==&lt;br /&gt;
&lt;br /&gt;
Afin de mettre en pratique ce que nous avons abordé précédemment et découvrir comment fonctionne Cheat Engine, je vais vous présenter comment récupérer un accès vers une valeur simple dans un jeu. Pour des raisons évidentes de sécurité, nous jouerons sur un serveur local.&lt;br /&gt;
L’idée va donc consister à récupérer la vitalité (simple, mais toujours aussi efficace) de notre « joueur » afin de tenter de devenir invulnérable sur le jeu The Isle, qui est en cours de développement (ce qui rendra la recherche de pointeurs plus simple à réaliser).&lt;br /&gt;
&lt;br /&gt;
Avant de commencer, nous partons du principe que nous disposons à tout moment de la vitalité courante du joueur (disponible dans des fichiers de données du jeu au format JSON). Dans le cas où la vitalité du joueur n’est pas explicitement affichée sous forme de valeur numérique, il est possible de retrouver une adresse par comparaison, en observant par exemple si la valeur observée (initialement inconnue) est augmentée ou réduite suite à un certain événement (comme le fait de recevoir des dégâts) : cette recherche reste cependant laborieuse et demande beaucoup de temps.&lt;br /&gt;
De plus, nous savons que la valeur désignant les points de vie du joueur est codée sur un entier de 4 bytes. Là aussi, retrouver le type exact de la valeur que nous recherchons peut prendre un certain temps, d’autant plus que les types utilisés dépendent fortement des jeux et des langages dans lesquels ils sont développés).&lt;br /&gt;
&lt;br /&gt;
La première étape, comme expliqué dans la partie précédente, consiste à trouver l’adresse mémoire où est stockée la valeur des points de vie du joueur. Pour ce faire, Cheat Engine permet facilement de rechercher les adresses par valeur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;flex: 1; margin: 10px;&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;Growth&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   &amp;quot;Hunger&amp;quot;: &amp;quot;200&amp;quot;,&lt;br /&gt;
   &amp;quot;Thirst&amp;quot;: &amp;quot;86&amp;quot;,&lt;br /&gt;
   &amp;quot;Stamina&amp;quot;: &amp;quot;106&amp;quot;,&lt;br /&gt;
   &amp;quot;Health&amp;quot;: &amp;quot;6500&amp;quot;,&lt;br /&gt;
   &amp;quot;Oxygen&amp;quot;: &amp;quot;40&amp;quot;,&lt;br /&gt;
   &amp;quot;bGender&amp;quot;: true&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Fichier:TheIsle01.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Plus de 104 adresses différentes ont été trouvées, mais seulement quelques-unes d’entre elles correspondent à ce que nous recherchons vraiment. Afin de trouver la bonne adresse, nous allons modifier la vitalité du joueur en subissant des dégâts en jeu ; les adresses des valeurs qui ont été modifiées seront mises en évidence.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle02.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux valeurs ont été modifiées suite aux dégâts subis. L’une d’elles correspond à un résultat cohérent : le joueur disposant initialement de 6500 pdv, a de fortes chances d’être tombé à 4196 pdv. Il est ainsi quasiment certain que l’adresse &amp;lt;strong&amp;gt;21E33D4BD2C&amp;lt;/strong&amp;gt; contienne la valeur des points de vie du joueur.&lt;br /&gt;
Il arrive souvent que plusieurs adresses contenant la nouvelle valeur soient trouvées. Dans ce cas, il est nécessaire de pousser la recherche un cran plus loin en modifiant chacune d’elles jusqu’à trouver celle qui impacte véritablement la vitalité du joueur.&lt;br /&gt;
&lt;br /&gt;
Nous devons maintenant remonter la mémoire jusqu’à trouver l’adresse d’un pointeur statique. Cependant, nous allons procéder d’une manière différente : rechercher des pointeurs à la main comme expliqué précédemment serait bien trop long, notamment lorsqu’on s’attaque à un jeu pouvant allouer plusieurs millions d’adresses en mémoire. Fort heureusement, Cheat Engine permet de réaliser des « pointer scans » afin de calculer automatiquement tous les pointeurs accédant à l’adresse que nous venons de trouver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle03.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bien que le logiciel soit capable de lister une liste de pointeurs sans effort, il est impossible de prédire l’aspect du pointeur que nous recherchons, et notamment quelle sera la taille maximale d’un de ses offsets, ou même le nombre d’offsets nécessaires à appliquer à partir de l’adresse statique afin de retomber sur notre valeur.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, le pointeur que nous recherchons doit ressembler à ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;getAddress(getAddress(Pointeur Statique)+Offset_i )=AdresseValeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi, il est parfois nécessaire d’effectuer plusieurs scans avec des paramètres de recherche différents jusqu’à tomber sur le bon pointeur. Dans les cas les plus extrêmes, un scan peut mettre plusieurs heures et nécessiter plusieurs GO (voire TO) d’espace disque. De manière plus globale, on favorisera des recherches avec peu d’offsets (3 à 5) mais un maximal élevé (rarement au-delà de 8192), ou beaucoup d’offset (rarement au-delà de 8) mais un maximal faible (1024 ou 2048).&lt;br /&gt;
Pour notre exemple, un seul scan avec ces paramètres suffira à mettre la main sur le pointeur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle04.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le résultat de l’analyse retourne 1431 adresses : certaines d’entre elles sont des adresses statiques, d’autres des pointeurs. Pour rappel, seule les adresses statiques permettent de retrouver notre valeur une fois le jeu relancé ; les pointeurs seront alloués différemment et ne présentent donc aucun intérêt pour la création d’un trainer.&lt;br /&gt;
Afin donc de focaliser notre recherche sur les adresses statiques retournées par le scan, nous allons relancer le jeu, et ne conserver que les adresses qui mènent aux points de vie du joueur (qui a pu se soigner entre temps).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; align-items: center;text-align: center; margin: 0 auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 10px;&amp;quot;&amp;gt;[[Fichier:TheIsle05.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 10px;&amp;quot;&amp;gt;[[Fichier:TheIsle06.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons presque trouvé l’adresse statique rattachée aux points de vie du joueur. A ce stade-là, il ne reste que 27 adresses à tester. Et pour ce faire, nous pouvons relancer plusieurs fois le jeu, et modifier les valeurs manuellement jusqu’à ce qu’il y ait un impact visible en jeu. Il se peut évidemment que plusieurs adresses statiques soient valides : il ne reste alors plus qu’à choisir celle que l’on souhaite conserver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle07.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notons que nous &amp;lt;strong&amp;gt;ne pouvons pas&amp;lt;/strong&amp;gt; simplifier l’écriture de l’adresse statique de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&#039;TheIsle-Win64-Shipping.exe&#039;+02F8F3D0 +30 +3B0+9AC= AdresseValeur&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;\Leftrightarrow&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&#039;TheIsle-Win64-Shipping.exe&#039; + 2F9015C= AdresseValeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La première équation s’écrit en réalité de la manière suivante (dans le cas où plusieurs offsets sont nécessaires) :&lt;br /&gt;
&amp;lt;pre&amp;gt;getAddress(&lt;br /&gt;
    getAddress(&lt;br /&gt;
        getAddress(&lt;br /&gt;
            getAddress(&lt;br /&gt;
                getModuleAddress(&amp;quot;TheIsle-Win64-Shipping.exe&amp;quot;) + 0x02F8F3D0&lt;br /&gt;
            ) + 0x30&lt;br /&gt;
        ) + 0x3B0&lt;br /&gt;
    ) + 0x9AC&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Où la valeur retournée par getAddress() peut évoluer au cours de l’exécution du jeu. C’est pour cette raison qu’il ne faut surtout pas additionner les offsets en pensant que la mémoire reste statique pour chacune des adresses calculées.&lt;br /&gt;
&lt;br /&gt;
Pour nous amuser, nous pouvons geler la variable afin que le joueur ne perde plus de vitalité. Il devient ainsi invulnérable à toute sorte de dégâts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création d’un trainer ==&lt;br /&gt;
&lt;br /&gt;
Le fait d’avoir passé du temps à trouver une adresse statique va nous permettre de réaliser un véritable trainer (simple, mais fonctionnel) afin d’accéder à la vitalité du joueur en lecture et en écriture à partir d’une interface dédiée. Les trainers sont généralement développés en C++ ou en C# avec une sous-couche en Lua  notamment pour réaliser des injections de code.&lt;br /&gt;
Pour cet exemple, nous réaliserons une interface en C# afin de gagner un peu de temps. De plus, nous utiliserons la librairie ProcessMemoryReaderLib.cs qui nous permettra d’utiliser simplement des fonctions de lecture et d’écriture dans la mémoire.&lt;br /&gt;
&lt;br /&gt;
Voici une interface réalisable en quelques clics sur Visual Studio :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:Trainer.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, préparons le squelette du code. L’exemple qui suit est minimaliste, mais sera suffisant pour ce que nous souhaitons faire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private static readonly string PROCESS_NAME = &amp;quot;TheIsle-Win64-Shipping&amp;quot;;&lt;br /&gt;
private System.Diagnostics.Process TheIsleProcess;&lt;br /&gt;
private ProcessMemoryReader ReadMemory;&lt;br /&gt;
&lt;br /&gt;
public Trainer() { InitializeComponent(); }&lt;br /&gt;
&lt;br /&gt;
// Exécuté au chargement du trainer&lt;br /&gt;
private void Trainer_Load(object o, EventArgs e) {&lt;br /&gt;
    ReadMemory = new ProcessMemoryReader();&lt;br /&gt;
    DetectGame();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Exécuté toutes les 100 ms&lt;br /&gt;
private void TimerDetectGame_Tick(object o, EventArgs e) {&lt;br /&gt;
    DetectGame();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Exécuté toutes les 50 ms&lt;br /&gt;
private void TimerShowHealth_Tick(object o, EventArgs e) {&lt;br /&gt;
    ShowHealth();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Exécuté lorsqu&#039;on écrit dans le textbox&lt;br /&gt;
private void VitalityTextbox_TextChanged(object o, EventArgs e) {&lt;br /&gt;
    UpdateHealth();&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d’abord, penchons-nous sur la détection du jeu. L’idée consiste simplement à afficher un message d’avertissement si notre trainer parvient à détecter au non le jeu auquel nous tentons de tricher. De plus, dans l’idéal, il faudrait décider d’afficher le bloc « Vitalité » de l’exemple de fenêtre vu plus haut uniquement si le jeu a bien été détecté.&lt;br /&gt;
Pour détecter un logiciel en C#, nous utilisons la classe System qui va nous permettre de rechercher tous les processus d’un certain nom. Il peut évidemment y en avoir plusieurs, comme par exemple lorsqu’on ouvre plusieurs fois un même navigateur. Ici, nous travaillons sur une seule instance du processus « TheIsle-Win64-Shipping.exe ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private void DetectGame() {&lt;br /&gt;
    System.Diagnostics.Process[] TheIsleProcesses =&lt;br /&gt;
        System.Diagnostics.Process.GetProcessesByName(Trainer.PROCESS_NAME);&lt;br /&gt;
&lt;br /&gt;
    if (TheIsleProcesses.Length != 0) {&lt;br /&gt;
        TheIsleProcess = TheIsleProcesses[0];&lt;br /&gt;
        /*&lt;br /&gt;
            On active les événements TimerShowHealth_Tick&lt;br /&gt;
            et VitalityTextbox_TextChanged&lt;br /&gt;
        */&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        TheIsleProcess = null;&lt;br /&gt;
       /*&lt;br /&gt;
            On désactive les événements TimerShowHealth_Tick&lt;br /&gt;
            et VitalityTextbox_TextChanged&lt;br /&gt;
        */&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il ne nous reste plus qu’à trouver un moyen d’afficher la vitalité du joueur, puis un moyen pour la modifier. En réalité, qu’il s’agisse de lire ou d’écrire dans la mémoire, la manière de procéder est exactement la même. Nous allons simplement lire les octets des emplacements mémoire spécifiques alloués par le processus, que nous devrons ensuite convertir en entier : ce nouvel entier correspond simplement à l’adresse en mémoire (sous forme décimale) que nous avons lue. Enfin, une fois que nous avons obtenu notre &amp;lt;i&amp;gt;AdresseValeur&amp;lt;/i&amp;gt; par succession de sauts dans la mémoire, il ne restera plus qu’à lire l’entier en valeur (codé sur 4 octets dans notre cas).&lt;br /&gt;
&lt;br /&gt;
Il y a cependant une petite subtilité à prendre en compte. Lorsqu’on réalise un trainer, il faut bien avoir en tête que ce dernier s’exécutera sur un processeur 32 bits ou 64 bits. Pour un processeur 32 bits, les adresses sont stockées sur 4 octets, tandis que pour du 64 bits, elles seront stockées sur 8 octets. L’exemple ci-dessous a été adapté seulement pour les systèmes 64 bits. &lt;br /&gt;
&lt;br /&gt;
Voici la fonction qui permettra d’afficher la vitalité du joueur :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private void ShowHealth() {&lt;br /&gt;
    // Lecture de la mémoire du jeu&lt;br /&gt;
    ReadMemory.ReadProcess = TheIsleProcess;&lt;br /&gt;
    ReadMemory.OpenProcess();&lt;br /&gt;
&lt;br /&gt;
    int NumberOfReadBytes;&lt;br /&gt;
    uint ByteSize = sizeof(byte);&lt;br /&gt;
    IntPtr Address;&lt;br /&gt;
    byte[] ReadBytes;&lt;br /&gt;
&lt;br /&gt;
    Int32 Health = 0;&lt;br /&gt;
&lt;br /&gt;
    // Adresse de base : &amp;quot;TheIsle-Win64-Shipping.exe&amp;quot; + 02F8F3D0&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        TheIsleProcess.MainModule.BaseAddress + 0x02F8F3D0,&lt;br /&gt;
        8 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Address = (IntPtr)BitConverter.ToInt64(ReadBytes, 0);&lt;br /&gt;
&lt;br /&gt;
    // Pointeur de niveau 1 : {Adresse de base} + 0x30&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        Address + 0x30,&lt;br /&gt;
        8 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Address = (IntPtr)BitConverter.ToInt64(ReadBytes, 0);&lt;br /&gt;
&lt;br /&gt;
    // Pointeur de niveau 2 : {Pointeur Lvl 1} + 0x3B0&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        Address + 0x3B0,&lt;br /&gt;
        8 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Address = (IntPtr)BitConverter.ToInt64(ReadBytes, 0);&lt;br /&gt;
    &lt;br /&gt;
    // Adresse contenant la valeur : {Pointer Lvl 2} + 0x9AC&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        Address + 0x9AC,&lt;br /&gt;
        4 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Health = BitConverter.ToInt32(ReadBytes, 0);&lt;br /&gt;
&lt;br /&gt;
    // Affichage de la vitalité&lt;br /&gt;
    VitalityLabel.Text = Health.ToString();&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour un système 32 bits, on aurait juste eu à modifier le nombre d’octets lus, et le type de conversion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
    Address + 0x30,&lt;br /&gt;
    4 * ByteSize,&lt;br /&gt;
    out NumberOfReadBytes&lt;br /&gt;
);&lt;br /&gt;
Address = (IntPtr)BitConverter.ToInt32(ReadBytes, 0);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, il ne reste plus qu’à coder la fonction modifiant la valeur de l’adresse en mémoire à chaque interaction avec le champ texte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private void UpdateHealth() {&lt;br /&gt;
    // Début identique à ShowHealth()&lt;br /&gt;
&lt;br /&gt;
    int NumberOfWrittenBytes;&lt;br /&gt;
    byte[] WrittenBytes =&lt;br /&gt;
        BitConverter.GetBytes(Int32.Parse(VitalityTextbox.Text));&lt;br /&gt;
&lt;br /&gt;
    // Parcours identique à ShowHealth()&lt;br /&gt;
    // Address = {Pointeur Lvl 1} + 0x3B0&lt;br /&gt;
&lt;br /&gt;
    // Adresse contenant la valeur : {Pointer Lvl 2} + 0x9AC&lt;br /&gt;
    ReadMemory.WriteProcessMemory(&lt;br /&gt;
        Address + 0x9AC,&lt;br /&gt;
        WrittenBytes,&lt;br /&gt;
        out NumberOfWrittenBytes&lt;br /&gt;
    );&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc une manière de réaliser un trainer simple en quelques minutes. Vous pouvez évidemment utiliser d’autres langages de programmation, comme C, C++, ou Lua, et multiplier les variables en jeu que vous souhaitez contrôler.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Détecter et lutter contre l’utilisation d’un trainer =&lt;br /&gt;
&lt;br /&gt;
Les manières de détecter l’utilisation d’un trainer diffèrent du fait qu’il s’agisse d’un logiciel s’exécutant côté client uniquement, ou pouvant inclure des scripts côté serveur.&lt;br /&gt;
&lt;br /&gt;
== Côté client ==&lt;br /&gt;
&lt;br /&gt;
Les « anti-cheats » côté client sont des logiciels (qu’il faut donc installer, ou au moins exécuter sur la machine) consistant à scanner de manière régulière les instructions exécutées par le jeu, et capables de détecter d’éventuelles instructions ou lignes de code suspicieuses en les comparant à des instructions blacklistées dans une base de donnes, ou encore d’écouter les erreurs de mémoire reportées par le système qui sont généralement issues d’une injection qui s’est mal déroulée. Ces anti-cheats fonctionnent sur un principe relativement proche de celui des anti-virus.&lt;br /&gt;
Cependant, certains hacks plus performants parviennent à passer outre cette protection en changeant en permanence et de manière parfaitement autonome la nature des injections (syntaxe, emplacement, registres utilisés, opérations réalisées, etc) : dans ce cas, il faudrait que l’anti-cheat connaisse autant d’instructions à blacklister que le logiciel de triche en invente, ce qui n’est physiquement pas possible.&lt;br /&gt;
&lt;br /&gt;
== Côté serveur ==&lt;br /&gt;
&lt;br /&gt;
Disposer d’un serveur connecté au client permet généralement de freiner l’exploitation de logiciels de triche sur ce dernier : pour peu que les données des utilisateurs soient conservées (dans une base de données, par exemple), il est alors possible de vérifier l’authenticité d’une information reçue de la part du client. Lorsque cette vérification n’est pas effectuée ou mal réalisée, on parle généralement d’exploitation de faille.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple d’exploitation de faille :&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 2px solid black; padding-left: 5px; margin-left: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
- L’utilisateur modifie une caractéristique A avec son logiciel de triche, puis attaque un ennemi.&lt;br /&gt;
- Le serveur reçoit les caractéristiques du joueur A et l’ennemi ciblé. Il calcule les dommages effectués, modifie les points de vie restant du monstre, et retourne le résultat de l’attaque.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un exemple où cette exploitation de faille ne serait pas possible :&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 2px solid black; padding-left: 5px; margin-left: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
- L’utilisateur modifie une caractéristique A avec son logiciel de triche, puis attaque un ennemi.&lt;br /&gt;
- Le serveur reçoit l’identifiant du joueur A et celui de l’ennemi ciblé. Il récupère ses caractéristiques à partir d’une base de données, calcule les dommages effectués, modifie les points de vie restant du monstre, et retourne le résultat de l’attaque.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces erreurs sont fréquentes sur des logiciels fraîchement créés ou récemment mis à jour, et, bien qu’elles soient relativement faciles à détecter et à corriger, elles peuvent avoir des impacts importants sur le logiciel en question, surtout si la faille est exploitée de manière modéré et discrète sur la durée.&lt;br /&gt;
Détecter une différence entre la valeur client et la valeur récupérée côté serveur n’assure toutefois pas qu’il s’agit d’un acte de tricherie : suivant la nature du logiciel, des désynchronisations peuvent avoir lieu entre client et serveur. Il peut donc parfois être difficile de déterminer précisément si une tentative de triche a été réalisée ou non.&lt;br /&gt;
&lt;br /&gt;
Ici aussi, il existe des anti-cheats dont le fonctionnement peut varier. Exécutés côté serveur (et ne nécessitant donc aucune installation côté client), ils observent les statistiques relatives à l’utilisation du logiciel (comme le résultat d’une partie et le ratio de tués/morts sur un jeu de tir), et détermine de manière probabiliste si l’utilisateur a eu recours à un logiciel de triche (et comparant ses performances à celles d’autres joueurs de même niveau, par exemple). Après un certain nombre d’alertes, l’activité de l’utilisateur est vérifiée par un administrateur qui jugera si un trainer a bel et bien utilisé, notamment en relisant les logs d’une partie et en mettant en évidence des exploits qui ne sont normalement pas possible sans tricher. Cela peut toutefois engendrer la sanction de joueurs particulièrement bons, détectés par le système comme étant des tricheurs.&lt;br /&gt;
Parmi les anti-cheats les plus utilisés, nous retrouvons par exemple battlEye ou FaceIT. Leur fonctionnement reste cependant obscur, et il est difficile de déterminer sur quelles statistiques ces derniers s’appuient, et leur « seuil de tolérance ».&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Conclusion =&lt;br /&gt;
&lt;br /&gt;
Ce wiki avait pour but de présenter les bases sur lesquelles se fondent les entraîneurs de jeux, et de comprendre du mieux possible comment de tels logiciels peuvent fonctionner, mais aussi d’être averti sur la manière dont ces derniers peuvent être repérés. Il est tout à fait possible d’approfondir le sujet notamment au niveau des injections de code, qui ont été très vaguement abordées, ou des injections AOB, qui vont se fonder sur une signature plutôt qu’une adresse mémoire. Cheat Engine est un logiciel complet qui permet d’exploiter la mémoire d’un jeu d’une multitude de façons différentes, et seules deux approches ont été présentées ici.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Game_Trainer&amp;diff=10736</id>
		<title>Game Trainer</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Game_Trainer&amp;diff=10736"/>
		<updated>2018-11-15T18:37:34Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;i&amp;gt;Auteur : Lukas AUGER&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;Les « Trainers » sont des programmes ayant pour objectif d’accéder aux adresses en mémoire d’un logiciel afin de lire et de modifier une valeur ou un mécanisme spécifique dans le but d’engendrer un comportement inattendu. On parle souvent de « Game Trainers » car ces derniers sont généralement développés afin de tricher aux jeux vidéo. Le niveau de difficulté quant au développement d’un tel programme varie énormément en fonction du logiciel auquel il s’attaque : plus ce dernier est complet et complexe, plus il est difficile de trouver l’information recherchée. L’impact d’un trainer varie également entre un logiciel en ligne (disposant d’une partie serveur avec laquelle un certain nombre de données sont synchronisées avec le client) et hors ligne (client seul). De surcroît, les méthodes permettant de lutter contre ces attaques ne sont pas les mêmes.&lt;br /&gt;
&lt;br /&gt;
Parmi quelques exemples applicatifs de ces programmes, on retrouve notamment la possibilité de geler la valeur d’une variable (points de vie, nombres de munitions, et plus globalement les « compteurs » de n’importe quelle nature qu’ils soient) ou de lui faire atteindre des valeurs disproportionnées, mais aussi de provoquer ou d’observer le déclenchement d’événements particuliers.&lt;br /&gt;
Les game trainers diffèrent des codes de triches dans la mesure où ces derniers ont été pensés à cet effet par les développeurs dans le but de faciliter la progression du joueur, ou de lui offrir une nouvelle expérience de jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Fonctionnement théorique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L’accès à la mémoire ==&lt;br /&gt;
&lt;br /&gt;
Une des méthodes les plus employées pour la réalisation d’un trainer consiste, dans un premier temps, à identifier l’adresse mémoire liée à la valeur que l’utilisateur souhaite modifier. Pour ce faire, nous utiliserons un scanneur de mémoire du nom de Cheat Engine. Ce logiciel permet de lister toutes les adresses mémoires rattachées à un logiciel précis, de rechercher une adresse en particulier en fonction de différents critères (comme son type) et à l’aide d’opérateurs de comparaison (appliqués lorsque la valeur change), et enfin de modifier la valeur stockée dans cet espace. Il offre de nombreuses fonctionnalités comme la recherche de pointeurs, l’injection de code ou encore le contrôle de la souris notamment utilisé pour la création d’aimbots; certaines d’entre-elles seront abordées dans ce wiki.&lt;br /&gt;
&lt;br /&gt;
Un problème que nous risquons rapidement de rencontrer réside dans le fait qu’une simple adresse mémoire a de fortes chances d’être différente lorsque le jeu sera relancé, ou plus tard pendant l’exécution du jeu. En connaissant l’adresse d’un pointeur, nous pourrons de ce fait accéder à l’adresse mémoire dans laquelle est stockée la valeur que nous souhaitons lire ou modifier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:PtrAdrVal.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le pointeur déterminé, deux cas de figures peuvent se présenter : l’adresse du pointeur est conservée de manière statique dans la mémoire, ou alors elle l’est de manière dynamique. Pour faire simple, dans le cas de l’allocation de mémoire statique, il est possible de connaître l’emplacement de la ressource dès lors que le programme est compilé (et donc d’y accéder de manière déterministe à chaque lancement du programme), tandis que lors d’une allocation dynamique, il n’est pas possible de prédire quel emplacement mémoire sera utilisé.&lt;br /&gt;
En d’autres termes, l’objectif est d’obtenir une adresse de pointeur de la forme :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&#039;MonProgramme.exe&#039;+Offset=AdresseValeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, ‘MonProgramme.exe’ est ce qu’on appelle un module principal. Dans certains cas, une adresse statique peut être accédée à partir de l’adresse d’une ressource de la forme ‘MaRessource.dll’ : on parle alors de module tout court, mais le principe reste le même. L’adresse derrière ce module correspond à l’adresse minimale à partir de laquelle le logiciel va pouvoir allouer de la mémoire. D’une certaine manière, il s’agit d’un référentiel qu’on peut facilement connaître à l’aide d’un langage de programmation, et qui constituer le point de départ à partir duquel nous allons accéder à notre valeur.&lt;br /&gt;
&lt;br /&gt;
La notion d’offset, ou décalage, est généralement exprimé en hexadécimal et correspond on nombre de « sauts » à effectuer dans la mémoire à partir d’une certaine adresse afin d’accéder à une adresse mémoire cible. Le code C suivant illustre simplement cette notion en partant d’un tableau de 200 entiers :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// ptr = ptr[0] = ptr + 0&lt;br /&gt;
int *ptr = (int*) malloc(200 * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
// ptr8 = ptr[8] = ptr + 8&lt;br /&gt;
int *ptr8 = ptr + 8;&lt;br /&gt;
&lt;br /&gt;
// ptr199 = ptr[199] = ptr + 199&lt;br /&gt;
int *ptr199 = ptr + 199;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour résumer, une adresse statique se compose de l’adresse d’un module que l’on va pouvoir facilement connaître, à laquelle on additionne un certain nombre (offset) afin d’accéder à une adresse en mémoire donc la valeur contiendra ce qui nous intéresse : ici, une autre adresse que nous permettra d’accéder à la valeur recherchée.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TabStaticPtr.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le cas où l’adresse du pointeur n’est pas statique, il est nécessaire de remonter plus haut dans la mémoire jusqu’à trouver un pointeur statique : on parle alors de multilevel pointer, ou encore de level-n pointer.&lt;br /&gt;
&lt;br /&gt;
Enfin, il est possible qu’une adresse statique mène directement à la valeur recherchée, sans passer par un pointeur intermédiaire. Cela n’arrive cependant presque jamais car les programmes pour lesquels des trainers sont développés atteignent rarement un tel niveau de simplicité.&lt;br /&gt;
&lt;br /&gt;
Nous avons abordé dans les grandes lignes ce que nous souhaitions faire : trouver une adresse statique nous menant jusqu’à notre valeur. Détaillons un peu comment nous y prendre.&lt;br /&gt;
Dans un premier temps, comme vu précédemment, expliquons plus en détail comment trouver l’adresse d’un pointeur. Tout d’abord, nous devons trouver l’adresse mémoire où se trouve la valeur qui nous intéresse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;Adresse=Valeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin de déterminer l’adresse du pointeur, il est d’abord nécessaire de connaître l’adresse de base de celle que nous avons trouvé. Pour cela, il « suffit » de soustraire l’offset de l’adresse trouvée à cette dernière.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;AdresseBase=Adresse-Offset_n&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cheat Engine permet de visualiser les instructions réalisées par l’assembleur afin de déterminer l’offset d’une adresse. Avoir quelques notions en assembleur peut aider, notamment lorsqu’on souhaite réaliser une injection de code. Ainsi, en observant les instructions réalisées précisément lorsqu’on modifie la valeur que nous observons en interagissant avec le logiciel, il devient possible de retrouver l’offset de l’adresse mémoire. Evidemment, il peut arriver que celui-ci soit égale à 0 : dans ce cas, l’adresse trouvée est donc déjà une adresse de base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:AccessAssembly.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, il ne reste plus qu’à trouver l’adresse du pointeur (allouée de manière statique ou dynamique) en recherchant simplement quelle adresse a pour valeur l’adresse de base que nous venons de calculer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;Pointeur \rightarrow AdresseBase&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi calculé l’adresse de pointeur pour une adresse donnée. Si cette adresse n’est pas allouée statiquement, il est nécessaire de réitérer cette démarche jusqu’à trouver une adresse statique (level-n pointer). En résumé, la démarche est la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;Pointeur Statique \rightarrow AdresseBase_1+Offset_1=Pointeur_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Pointeur_(n-1) \rightarrow AdresseBase_(n-1)+Offset_(n-1)=Pointeur_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Pointeur_n \rightarrow AdresseBase_n+Offset_n=Adresse&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous possédons une adresse statique, il faut trouver un moyen de redescendre jusqu’à la valeur initialement observée. Pour cela, rien de plus simple. Supposons que nous disposons d’une fonction getAddress() calculant l’adresse passée en paramètre ; accéder à la valeur observée revient à se déplacer par « sauts » successifs correspondant aux offsets précédemment déterminés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;(Rappel) Pointeur Statique=getAddress(&#039;MonProgramme.exe&#039;+Offset)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Adresse=Valeur&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;\Leftrightarrow&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;getAddress(getAddress(Pointeur Statique)+Offset_i )=Valeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jusqu’à présent, nous avons supposé que l’offset était une information qui ne variait pas dans le programme : elle dépend en réalité de la manière dont est écrit le code, et n’évolue pas tant que le code garde la même structure. Si le logiciel subit une mise à jour importante, il est possible que ces valeurs changent, et qu’il faille recalculer une nouvelle adresse statique. Ici, il faut vraiment voir le pointeur statique comme un référentiel connu qui nous permet de descendre dans la mémoire jusqu’à la valeur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi vu &amp;lt;strong&amp;gt;une manière&amp;lt;/strong&amp;gt; d’accéder à la mémoire d’un logiciel. Par ailleurs, Cheat Engine introduit le concept de Cheat Tables consistant à importer des pointeurs statiques (mais aussi des scripts), déjà calculées par d’autres personnes afin de profiter de certains hacks sans avoir à chercher soi-même ces adresses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L’injection de code ==&lt;br /&gt;
&lt;br /&gt;
Injecter du code dans un logiciel peut rapidement s’avérer complexe, et demande de bonnes connaissances en assembleur. L’idée, ici, est juste de survoler le principe d’injection avec quelques exemples concrets, sans trop entrer dans les détails.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que la valeur observée sera modifiée, des instructions seront réalisées en assembleur. Par exemple, le code suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;int i = 1, j = 1;&lt;br /&gt;
i -= j;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pourra donner un code assembleur à peu près équivalent à ce qui suit :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:Assembly.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note sur l’instruction lea :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;lea reg1,[reg2+offset]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;\Leftrightarrow&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;mov reg1,adresse(reg2+offset)&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A la différence de mov où c’est la valeur qui est stockée dans le registre, et non l’adresse.&lt;br /&gt;
&lt;br /&gt;
L’injection de code consiste simplement à ajouter une ou plusieurs instructions à l’endroit souhaité dans la pile d’exécution afin de modifier, par exemple, le résultat d’une affectation. CheatEngine permet aussi de « commenter » certaines instructions afin de ne pas les exécuter (il réalise probablement un jump de son côté afin de sauter les instructions initialement exécutées).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple d’injection que l’on pourrait effectuer sur le code assembleur vu au-dessus :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alloc(newmem,2048,&amp;quot;Tutorial-x86_64.exe&amp;quot;+2B233) &lt;br /&gt;
&lt;br /&gt;
newmem:&lt;br /&gt;
    mov edx,1E&lt;br /&gt;
    add [rbx+00000790],edx&lt;br /&gt;
&lt;br /&gt;
originalcode:&lt;br /&gt;
    ;lea edx,[rax+01]&lt;br /&gt;
    ;sub [rbx+00000790],edx&lt;br /&gt;
&lt;br /&gt;
exit:&lt;br /&gt;
    jmp returnhere&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, l’injection a lieu à un emplacement mémoire précis. Sans entrer plus en détail sur la manière dont l’insertion est gérée et exploitée, il est fort probable que si le code du logiciel attaqué vient à être modifié, les instructions injectées ne fassent plus ce qui est attendu (au point de potentiellement déclencher des erreurs).&lt;br /&gt;
&lt;br /&gt;
Dans l’exemple ci-dessus, on insère la valeur brute « 30 » (0x1E) dans le registre edx, puis on l’additionne à la valeur de l’adresse rbx+00000790 (pointant vers la variable i). Le code assembleur exécuté sera ainsi :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:AssemblyInjection.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il ne fait aucun doute que la complexité d’une injection dépend de ce que l’on souhaite faire, et des valeurs manipulées (une division de nombres flottants fera appel à d’autres instructions de l’assembleur, par exemple). Il est aussi parfaitement envisageable de récupérer la valeur d’un pointeur qu’on aurait calculé dans la partie précédente afin d’effectuer un certain nombre d’opérations spécifiques.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Exemples applicatifs =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Récupération de données simples d’un jeu ==&lt;br /&gt;
&lt;br /&gt;
Afin de mettre en pratique ce que nous avons abordé précédemment et découvrir comment fonctionne Cheat Engine, je vais vous présenter comment récupérer un accès vers une valeur simple dans un jeu. Pour des raisons évidentes de sécurité, nous jouerons sur un serveur local.&lt;br /&gt;
L’idée va donc consister à récupérer la vitalité (simple, mais toujours aussi efficace) de notre « joueur » afin de tenter de devenir invulnérable sur le jeu The Isle, qui est en cours de développement (ce qui rendra la recherche de pointeurs plus simple à réaliser).&lt;br /&gt;
&lt;br /&gt;
Avant de commencer, nous partons du principe que nous disposons à tout moment de la vitalité courante du joueur (disponible dans des fichiers de données du jeu au format JSON). Dans le cas où la vitalité du joueur n’est pas explicitement affichée sous forme de valeur numérique, il est possible de retrouver une adresse par comparaison, en observant par exemple si la valeur observée (initialement inconnue) est augmentée ou réduite suite à un certain événement (comme le fait de recevoir des dégâts) : cette recherche reste cependant laborieuse et demande beaucoup de temps.&lt;br /&gt;
De plus, nous savons que la valeur désignant les points de vie du joueur est codée sur un entier de 4 bytes. Là aussi, retrouver le type exact de la valeur que nous recherchons peut prendre un certain temps, d’autant plus que les types utilisés dépendent fortement des jeux et des langages dans lesquels ils sont développés).&lt;br /&gt;
&lt;br /&gt;
La première étape, comme expliqué dans la partie précédente, consiste à trouver l’adresse mémoire où est stockée la valeur des points de vie du joueur. Pour ce faire, Cheat Engine permet facilement de rechercher les adresses par valeur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;flex: 1; margin: 10px;&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;Growth&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   &amp;quot;Hunger&amp;quot;: &amp;quot;200&amp;quot;,&lt;br /&gt;
   &amp;quot;Thirst&amp;quot;: &amp;quot;86&amp;quot;,&lt;br /&gt;
   &amp;quot;Stamina&amp;quot;: &amp;quot;106&amp;quot;,&lt;br /&gt;
   &amp;quot;Health&amp;quot;: &amp;quot;6500&amp;quot;,&lt;br /&gt;
   &amp;quot;Oxygen&amp;quot;: &amp;quot;40&amp;quot;,&lt;br /&gt;
   &amp;quot;bGender&amp;quot;: true&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Fichier:TheIsle01.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Plus de 104 adresses différentes ont été trouvées, mais seulement quelques-unes d’entre elles correspondent à ce que nous recherchons vraiment. Afin de trouver la bonne adresse, nous allons modifier la vitalité du joueur en subissant des dégâts en jeu ; les adresses des valeurs qui ont été modifiées seront mises en évidence.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle02.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux valeurs ont été modifiées suite aux dégâts subis. L’une d’elles correspond à un résultat cohérent : le joueur disposant initialement de 6500 pdv, a de fortes chances d’être tombé à 4196 pdv. Il est ainsi quasiment certain que l’adresse &amp;lt;strong&amp;gt;21E33D4BD2C&amp;lt;/strong&amp;gt; contienne la valeur des points de vie du joueur.&lt;br /&gt;
Il arrive souvent que plusieurs adresses contenant la nouvelle valeur soient trouvées. Dans ce cas, il est nécessaire de pousser la recherche un cran plus loin en modifiant chacune d’elles jusqu’à trouver celle qui impacte véritablement la vitalité du joueur.&lt;br /&gt;
&lt;br /&gt;
Nous devons maintenant remonter la mémoire jusqu’à trouver l’adresse d’un pointeur statique. Cependant, nous allons procéder d’une manière différente : rechercher des pointeurs à la main comme expliqué précédemment serait bien trop long, notamment lorsqu’on s’attaque à un jeu pouvant allouer plusieurs millions d’adresses en mémoire. Fort heureusement, Cheat Engine permet de réaliser des « pointer scans » afin de calculer automatiquement tous les pointeurs accédant à l’adresse que nous venons de trouver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle03.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bien que le logiciel soit capable de lister une liste de pointeurs sans effort, il est impossible de prédire l’aspect du pointeur que nous recherchons, et notamment quelle sera la taille maximale d’un de ses offsets, ou même le nombre d’offsets nécessaires à appliquer à partir de l’adresse statique afin de retomber sur notre valeur.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, le pointeur que nous recherchons doit ressembler à ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;getAddress(getAddress(Pointeur Statique)+Offset_i )=AdresseValeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi, il est parfois nécessaire d’effectuer plusieurs scans avec des paramètres de recherche différents jusqu’à tomber sur le bon pointeur. Dans les cas les plus extrêmes, un scan peut mettre plusieurs heures et nécessiter plusieurs GO (voire TO) d’espace disque. De manière plus globale, on favorisera des recherches avec peu d’offsets (3 à 5) mais un maximal élevé (rarement au-delà de 8192), ou beaucoup d’offset (rarement au-delà de 8) mais un maximal faible (1024 ou 2048).&lt;br /&gt;
Pour notre exemple, un seul scan avec ces paramètres suffira à mettre la main sur le pointeur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle04.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le résultat de l’analyse retourne 1431 adresses : certaines d’entre elles sont des adresses statiques, d’autres des pointeurs. Pour rappel, seule les adresses statiques permettent de retrouver notre valeur une fois le jeu relancé ; les pointeurs seront alloués différemment et ne présentent donc aucun intérêt pour la création d’un trainer.&lt;br /&gt;
Afin donc de focaliser notre recherche sur les adresses statiques retournées par le scan, nous allons relancer le jeu, et ne conserver que les adresses qui mènent aux points de vie du joueur (qui a pu se soigner entre temps).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; align-items: center;text-align: center; margin: 0 auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 10px;&amp;quot;&amp;gt;[[Fichier:TheIsle05.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 10px;&amp;quot;&amp;gt;[[Fichier:TheIsle06.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons presque trouvé l’adresse statique rattachée aux points de vie du joueur. A ce stade-là, il ne reste que 27 adresses à tester. Et pour ce faire, nous pouvons relancer plusieurs fois le jeu, et modifier les valeurs manuellement jusqu’à ce qu’il y ait un impact visible en jeu. Il se peut évidemment que plusieurs adresses statiques soient valides : il ne reste alors plus qu’à choisir celle que l’on souhaite conserver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:TheIsle07.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notons que nous &amp;lt;strong&amp;gt;ne pouvons pas&amp;lt;/strong&amp;gt; simplifier l’écriture de l’adresse statique de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&#039;TheIsle-Win64-Shipping.exe&#039;+02F8F3D0 +30 +3B0+9AC= AdresseValeur&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;math&amp;gt;\Leftrightarrow&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&#039;TheIsle-Win64-Shipping.exe&#039; + 2F9015C= AdresseValeur&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La première équation s’écrit en réalité de la manière suivante (dans le cas où plusieurs offsets sont nécessaires) :&lt;br /&gt;
&amp;lt;pre&amp;gt;getAddress(&lt;br /&gt;
    getAddress(&lt;br /&gt;
        getAddress(&lt;br /&gt;
            getAddress(&lt;br /&gt;
                getModuleAddress(&amp;quot;TheIsle-Win64-Shipping.exe&amp;quot;) + 0x02F8F3D0&lt;br /&gt;
            ) + 0x30&lt;br /&gt;
        ) + 0x3B0&lt;br /&gt;
    ) + 0x9AC&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Où la valeur retournée par getAddress() peut évoluer au cours de l’exécution du jeu. C’est pour cette raison qu’il ne faut surtout pas additionner les offsets en pensant que la mémoire reste statique pour chacune des adresses calculées.&lt;br /&gt;
&lt;br /&gt;
Pour nous amuser, nous pouvons geler la variable afin que le joueur ne perde plus de vitalité. Il devient ainsi invulnérable à toute sorte de dégâts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création d’un trainer ==&lt;br /&gt;
&lt;br /&gt;
Le fait d’avoir passé du temps à trouver une adresse statique va nous permettre de réaliser un véritable trainer (simple, mais fonctionnel) afin d’accéder à la vitalité du joueur en lecture et en écriture à partir d’une interface dédiée. Les trainers sont généralement développés en C++ ou en C# avec une sous-couche en Lua  notamment pour réaliser des injections de code.&lt;br /&gt;
Pour cet exemple, nous réaliserons une interface en C# afin de gagner un peu de temps. De plus, nous utiliserons la librairie ProcessMemoryReaderLib.cs qui nous permettra d’utiliser simplement des fonctions de lecture et d’écriture dans la mémoire.&lt;br /&gt;
&lt;br /&gt;
Voici une interface réalisable en quelques clics sur Visual Studio :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;[[Fichier:Trainer.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, préparons le squelette du code. L’exemple qui suit est minimaliste, mais sera suffisant pour ce que nous souhaitons faire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private static readonly string PROCESS_NAME = &amp;quot;TheIsle-Win64-Shipping&amp;quot;;&lt;br /&gt;
private System.Diagnostics.Process TheIsleProcess;&lt;br /&gt;
private ProcessMemoryReader ReadMemory;&lt;br /&gt;
&lt;br /&gt;
public Trainer() { InitializeComponent(); }&lt;br /&gt;
&lt;br /&gt;
// Exécuté au chargement du trainer&lt;br /&gt;
private void Trainer_Load(object o, EventArgs e) {&lt;br /&gt;
    ReadMemory = new ProcessMemoryReader();&lt;br /&gt;
    DetectGame();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Exécuté toutes les 100 ms&lt;br /&gt;
private void TimerDetectGame_Tick(object o, EventArgs e) {&lt;br /&gt;
    DetectGame();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Exécuté toutes les 50 ms&lt;br /&gt;
private void TimerShowHealth_Tick(object o, EventArgs e) {&lt;br /&gt;
    ShowHealth();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Exécuté lorsqu&#039;on écrit dans le textbox&lt;br /&gt;
private void VitalityTextbox_TextChanged(object o, EventArgs e) {&lt;br /&gt;
    UpdateHealth();&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d’abord, penchons-nous sur la détection du jeu. L’idée consiste simplement à afficher un message d’avertissement si notre trainer parvient à détecter au non le jeu auquel nous tentons de tricher. De plus, dans l’idéal, il faudrait décider d’afficher le bloc « Vitalité » de l’exemple de fenêtre vu plus haut uniquement si le jeu a bien été détecté.&lt;br /&gt;
Pour détecter un logiciel en C#, nous utilisons la classe System qui va nous permettre de rechercher tous les processus d’un certain nom. Il peut évidemment y en avoir plusieurs, comme par exemple lorsqu’on ouvre plusieurs fois un même navigateur. Ici, nous travaillons sur une seule instance du processus « TheIsle-Win64-Shipping.exe ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private void DetectGame() {&lt;br /&gt;
    System.Diagnostics.Process[] TheIsleProcesses =&lt;br /&gt;
        System.Diagnostics.Process.GetProcessesByName(Trainer.PROCESS_NAME);&lt;br /&gt;
&lt;br /&gt;
    if (TheIsleProcesses.Length != 0) {&lt;br /&gt;
        TheIsleProcess = TheIsleProcesses[0];&lt;br /&gt;
        /*&lt;br /&gt;
            On active les événements TimerShowHealth_Tick&lt;br /&gt;
            et VitalityTextbox_TextChanged&lt;br /&gt;
        */&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        TheIsleProcess = null;&lt;br /&gt;
       /*&lt;br /&gt;
            On désactive les événements TimerShowHealth_Tick&lt;br /&gt;
            et VitalityTextbox_TextChanged&lt;br /&gt;
        */&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il ne nous reste plus qu’à trouver un moyen d’afficher la vitalité du joueur, puis un moyen pour la modifier. En réalité, qu’il s’agisse de lire ou d’écrire dans la mémoire, la manière de procéder est exactement la même. Nous allons simplement lire les octets des emplacements mémoire spécifiques alloués par le processus, que nous devrons ensuite convertir en entier : ce nouvel entier correspond simplement à l’adresse en mémoire (sous forme décimale) que nous avons lue. Enfin, une fois que nous avons obtenu notre &amp;lt;i&amp;gt;AdresseValeur&amp;lt;/i&amp;gt; par succession de sauts dans la mémoire, il ne restera plus qu’à lire l’entier en valeur (codé sur 4 octets dans notre cas).&lt;br /&gt;
&lt;br /&gt;
Il y a cependant une petite subtilité à prendre en compte. Lorsqu’on réalise un trainer, il faut bien avoir en tête que ce dernier s’exécutera sur un processeur 32 bits ou 64 bits. Pour un processeur 32 bits, les adresses sont stockées sur 4 octets, tandis que pour du 64 bits, elles seront stockées sur 8 octets. L’exemple ci-dessous a été adapté seulement pour les systèmes 64 bits. &lt;br /&gt;
&lt;br /&gt;
Voici la fonction qui permettra d’afficher la vitalité du joueur :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private void ShowHealth() {&lt;br /&gt;
    // Lecture de la mémoire du jeu&lt;br /&gt;
    ReadMemory.ReadProcess = TheIsleProcess;&lt;br /&gt;
    ReadMemory.OpenProcess();&lt;br /&gt;
&lt;br /&gt;
    int NumberOfReadBytes;&lt;br /&gt;
    uint ByteSize = sizeof(byte);&lt;br /&gt;
    IntPtr Address;&lt;br /&gt;
    byte[] ReadBytes;&lt;br /&gt;
&lt;br /&gt;
    Int32 Health = 0;&lt;br /&gt;
&lt;br /&gt;
    // Adresse de base : &amp;quot;TheIsle-Win64-Shipping.exe&amp;quot; + 02F8F3D0&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        TheIsleProcess.MainModule.BaseAddress + 0x02F8F3D0,&lt;br /&gt;
        8 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Address = (IntPtr)BitConverter.ToInt64(ReadBytes, 0);&lt;br /&gt;
&lt;br /&gt;
    // Pointeur de niveau 1 : {Adresse de base} + 0x30&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        Address + 0x30,&lt;br /&gt;
        8 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Address = (IntPtr)BitConverter.ToInt64(ReadBytes, 0);&lt;br /&gt;
&lt;br /&gt;
    // Pointeur de niveau 2 : {Pointeur Lvl 1} + 0x3B0&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        Address + 0x3B0,&lt;br /&gt;
        8 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Address = (IntPtr)BitConverter.ToInt64(ReadBytes, 0);&lt;br /&gt;
    &lt;br /&gt;
    // Adresse contenant la valeur : {Pointer Lvl 2} + 0x9AC&lt;br /&gt;
    ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
        Address + 0x9AC,&lt;br /&gt;
        4 * ByteSize,&lt;br /&gt;
        out NumberOfReadBytes&lt;br /&gt;
    );&lt;br /&gt;
    Health = BitConverter.ToInt32(ReadBytes, 0);&lt;br /&gt;
&lt;br /&gt;
    // Affichage de la vitalité&lt;br /&gt;
    VitalityLabel.Text = Health.ToString();&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour un système 32 bits, on aurait juste eu à modifier le nombre d’octets lus, et le type de conversion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ReadBytes = ReadMemory.ReadProcessMemory(&lt;br /&gt;
    Address + 0x30,&lt;br /&gt;
    4 * ByteSize,&lt;br /&gt;
    out NumberOfReadBytes&lt;br /&gt;
);&lt;br /&gt;
Address = (IntPtr)BitConverter.ToInt32(ReadBytes, 0);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, il ne reste plus qu’à coder la fonction modifiant la valeur de l’adresse en mémoire à chaque interaction avec le champ texte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private void UpdateHealth() {&lt;br /&gt;
    // Début identique à ShowHealth()&lt;br /&gt;
&lt;br /&gt;
    int NumberOfWrittenBytes;&lt;br /&gt;
    byte[] WrittenBytes =&lt;br /&gt;
        BitConverter.GetBytes(Int32.Parse(VitalityTextbox.Text));&lt;br /&gt;
&lt;br /&gt;
    // Parcours identique à ShowHealth()&lt;br /&gt;
    // Address = {Pointeur Lvl 1} + 0x3B0&lt;br /&gt;
&lt;br /&gt;
    // Adresse contenant la valeur : {Pointer Lvl 2} + 0x9AC&lt;br /&gt;
    ReadMemory.WriteProcessMemory(&lt;br /&gt;
        Address + 0x9AC,&lt;br /&gt;
        WrittenBytes,&lt;br /&gt;
        out NumberOfWrittenBytes&lt;br /&gt;
    );&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc une manière de réaliser un trainer simple en quelques minutes. Vous pouvez évidemment utiliser d’autres langages de programmation, comme C, C++, ou Lua, et multiplier les variables en jeu que vous souhaitez contrôler.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Détecter et lutter contre l’utilisation d’un trainer =&lt;br /&gt;
&lt;br /&gt;
Les manières de détecter l’utilisation d’un trainer diffèrent du fait qu’il s’agisse d’un logiciel s’exécutant côté client uniquement, ou pouvant inclure des scripts côté serveur.&lt;br /&gt;
&lt;br /&gt;
== Côté client ==&lt;br /&gt;
&lt;br /&gt;
Les « anti-cheats » côté client sont des logiciels (qu’il faut donc installer, ou au moins exécuter sur la machine) consistant à scanner de manière régulière les instructions exécutées par le jeu, et capables de détecter d’éventuelles instructions ou lignes de code suspicieuses en les comparant à des instructions blacklistées dans une base de donnes, ou encore d’écouter les erreurs de mémoire reportées par le système qui sont généralement issues d’une injection qui s’est mal déroulée. Ces anti-cheats fonctionnent sur un principe relativement proche de celui des anti-virus.&lt;br /&gt;
Cependant, certains hacks plus performants parviennent à passer outre cette protection en changeant en permanence et de manière parfaitement autonome la nature des injections (syntaxe, emplacement, registres utilisés, opérations réalisées, etc) : dans ce cas, il faudrait que l’anti-cheat connaisse autant d’instructions à blacklister que le logiciel de triche en invente, ce qui n’est physiquement pas possible.&lt;br /&gt;
&lt;br /&gt;
== Côté serveur ==&lt;br /&gt;
&lt;br /&gt;
Disposer d’un serveur connecté au client permet généralement de freiner l’exploitation de logiciels de triche sur ce dernier : pour peu que les données des utilisateurs soient conservées (dans une base de données, par exemple), il est alors possible de vérifier l’authenticité d’une information reçue de la part du client. Lorsque cette vérification n’est pas effectuée ou mal réalisée, on parle généralement d’exploitation de faille.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple d’exploitation de faille :&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 2px solid black; padding-left: 5px; margin-left: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
- L’utilisateur modifie une caractéristique A avec son logiciel de triche, puis attaque un ennemi.&lt;br /&gt;
- Le serveur reçoit les caractéristiques du joueur A et l’ennemi ciblé. Il calcule les dommages effectués, modifie les points de vie restant du monstre, et retourne le résultat de l’attaque.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un exemple où cette exploitation de faille ne serait pas possible :&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 2px solid black; padding-left: 5px; margin-left: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
- L’utilisateur modifie une caractéristique A avec son logiciel de triche, puis attaque un ennemi.&lt;br /&gt;
- Le serveur reçoit l’identifiant du joueur A et celui de l’ennemi ciblé. Il récupère ses caractéristiques à partir d’une base de données, calcule les dommages effectués, modifie les points de vie restant du monstre, et retourne le résultat de l’attaque.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces erreurs sont fréquentes sur des logiciels fraîchement créés ou récemment mis à jour, et, bien qu’elles soient relativement faciles à détecter et à corriger, elles peuvent avoir des impacts importants sur le logiciel en question, surtout si la faille est exploitée de manière modéré et discrète sur la durée.&lt;br /&gt;
Détecter une différence entre la valeur client et la valeur récupérée côté serveur n’assure toutefois pas qu’il s’agit d’un acte de tricherie : suivant la nature du logiciel, des désynchronisations peuvent avoir lieu entre client et serveur. Il peut donc parfois être difficile de déterminer précisément si une tentative de triche a été réalisée ou non.&lt;br /&gt;
&lt;br /&gt;
Ici aussi, il existe des anti-cheats dont le fonctionnement peut varier. Exécutés côté serveur (et ne nécessitant donc aucune installation côté client), ils observent les statistiques relatives à l’utilisation du logiciel (comme le résultat d’une partie et le ratio de tués/morts sur un jeu de tir), et détermine de manière probabiliste si l’utilisateur a eu recours à un logiciel de triche (et comparant ses performances à celles d’autres joueurs de même niveau, par exemple). Après un certain nombre d’alertes, l’activité de l’utilisateur est vérifiée par un administrateur qui jugera si un trainer a bel et bien utilisé, notamment en relisant les logs d’une partie et en mettant en évidence des exploits qui ne sont normalement pas possible sans tricher. Cela peut toutefois engendrer la sanction de joueurs particulièrement bons, détectés par le système comme étant des tricheurs.&lt;br /&gt;
Parmi les anti-cheats les plus utilisés, nous retrouvons par exemple battlEye ou FaceIT. Leur fonctionnement reste cependant obscur, et il est difficile de déterminer sur quelles statistiques ces derniers s’appuient, et leur « seuil de tolérance ».&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Conclusion =&lt;br /&gt;
&lt;br /&gt;
Ce wiki avait pour but de présenter les bases sur lesquelles se fondent les entraîneurs de jeux, et de comprendre du mieux possible comment de tels logiciels peuvent fonctionner, mais aussi d’être averti sur la manière dont ces derniers peuvent être repérés. Il est tout à fait possible d’approfondir le sujet notamment au niveau des injections de code, qui ont été très vaguement abordées, ou des injections AOB, qui vont se fonder sur une signature plutôt qu’une adresse mémoire. Cheat Engine est un logiciel complet qui permet d’exploiter la mémoire d’un jeu d’une multitude de façons différentes, et seules deux approches ont été présentées ici.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Trainer.png&amp;diff=10735</id>
		<title>Fichier:Trainer.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Trainer.png&amp;diff=10735"/>
		<updated>2018-11-15T18:29:34Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle07.png&amp;diff=10734</id>
		<title>Fichier:TheIsle07.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle07.png&amp;diff=10734"/>
		<updated>2018-11-15T18:25:38Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle06.png&amp;diff=10733</id>
		<title>Fichier:TheIsle06.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle06.png&amp;diff=10733"/>
		<updated>2018-11-15T18:25:05Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle05.png&amp;diff=10732</id>
		<title>Fichier:TheIsle05.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle05.png&amp;diff=10732"/>
		<updated>2018-11-15T18:24:56Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle04.png&amp;diff=10731</id>
		<title>Fichier:TheIsle04.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle04.png&amp;diff=10731"/>
		<updated>2018-11-15T18:23:56Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle03.png&amp;diff=10730</id>
		<title>Fichier:TheIsle03.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle03.png&amp;diff=10730"/>
		<updated>2018-11-15T18:22:45Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle02.png&amp;diff=10729</id>
		<title>Fichier:TheIsle02.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle02.png&amp;diff=10729"/>
		<updated>2018-11-15T18:21:49Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle01.png&amp;diff=10728</id>
		<title>Fichier:TheIsle01.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TheIsle01.png&amp;diff=10728"/>
		<updated>2018-11-15T18:12:30Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:AssemblyInjection.png&amp;diff=10727</id>
		<title>Fichier:AssemblyInjection.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:AssemblyInjection.png&amp;diff=10727"/>
		<updated>2018-11-15T18:09:45Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Assembly.png&amp;diff=10726</id>
		<title>Fichier:Assembly.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Assembly.png&amp;diff=10726"/>
		<updated>2018-11-15T18:07:47Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:AccessAssembly.png&amp;diff=10725</id>
		<title>Fichier:AccessAssembly.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:AccessAssembly.png&amp;diff=10725"/>
		<updated>2018-11-15T17:52:07Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TabStaticPtr.png&amp;diff=10724</id>
		<title>Fichier:TabStaticPtr.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:TabStaticPtr.png&amp;diff=10724"/>
		<updated>2018-11-15T17:48:09Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:PtrAdrVal.png&amp;diff=10710</id>
		<title>Fichier:PtrAdrVal.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:PtrAdrVal.png&amp;diff=10710"/>
		<updated>2018-11-15T17:23:07Z</updated>

		<summary type="html">&lt;p&gt;Auger : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO002_:_Cryptologie&amp;diff=10705</id>
		<title>INFO002 : Cryptologie</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO002_:_Cryptologie&amp;diff=10705"/>
		<updated>2018-11-15T17:15:24Z</updated>

		<summary type="html">&lt;p&gt;Auger : /* Sujets d&amp;#039;exposés pour l&amp;#039;année 2018/2019 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quelques ressources pour l&#039;étudiant ==&lt;br /&gt;
&lt;br /&gt;
# Cours &lt;br /&gt;
#* Support de cours (presentation [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Cours/cours.pdf PDF], article [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Cours/article.pdf PDF])&lt;br /&gt;
# Fiches de TD&lt;br /&gt;
#* TDs 1 : cryptographie élémentaire [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/TDs/td-1.ps PDF]&lt;br /&gt;
# TPs et autres travaux pratiques [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Tests/doc/html/index.html Pages des TPs]&lt;br /&gt;
# Autres ressources&lt;br /&gt;
#* Handbook of Applied Cryptology [http://www.cacr.math.uwaterloo.ca/hac/]&lt;br /&gt;
#* Cryptologie en ligne [http://www.apprendre-en-ligne.net/crypto/menu/index.html]&lt;br /&gt;
# [[Projets étudiants cryptographie et sécurité]]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2018/2019 ==&lt;br /&gt;
&lt;br /&gt;
Créez les liens vers vos wikis ci-dessous (comme les autres).&lt;br /&gt;
&lt;br /&gt;
# Cryptologie et calculs quantiques { R. ESTOPINAN, A. RAFIK } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Les_calculs_quantiques_dans_la_cryptologie Les calculs quantiques dans la cryptologie]&lt;br /&gt;
# Sécuriser les mots de passe avec Bcrypt { A. PETETIN, F. SEBIRE } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php?title=Bcrypt Bcrypt]&lt;br /&gt;
# Les réseaux euclidiens {A. BROGNA, A. BRUHL} -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Les_r%C3%A9seaux_euclidiens Les réseaux euclidiens]&lt;br /&gt;
# Authentification à deux facteurs { R. VIOLETTE, C. THONONT } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Authentification_deux_facteurs Authentification à deux facteurs]&lt;br /&gt;
# Game Trainer {L. AUGER} -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Game_Trainer Game Trainer] [https://drive.google.com/open?id=1hO-lMe49HwhLr9qbY5BMKFcXHF9bcKyK PDF]&lt;br /&gt;
# Cryptologie pour le Cloud { S. DEMARS, X. GOLEMI } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Cryptologie_pour_le_Cloud Cryptologie pour le Cloud]&lt;br /&gt;
# Faille CSRF { V. BASSET, V.PEILLEX } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Faille_CSRF Faille CSRF]&lt;br /&gt;
# Attaque par Buffer Overflow { O. STHIOUL, L. MILLON } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Attaque_par_Buffer_Overflow Attaque par Buffer Overflow]&lt;br /&gt;
# Générateur (pseudo-)aléatoire crypto-sécurisé { A. MOREL, R KACZMARCZYK } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/CSPRNG]&lt;br /&gt;
# Transactions Bitcoins &amp;amp; Signatures numérique { T. DE ISEPPI, F. STEMMELEN } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transactions_Bitcoins_&amp;amp;_Signatures_numérique]&lt;br /&gt;
# RID Hijacking { B. PIZZO, T. MARIE } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Rid_Hijacking]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2017/2018 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Stéganographie { S. BARNIAUDY, S. DUPRAZ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Steganographie stéganographie]&lt;br /&gt;
# Pretty Good Privacy { M. PELLET, B. LE SAUX } [https://lama.univ-savoie.fr/mediawiki/index.php?title=Pretty_Good_Privacy Pretty Good Privacy]&lt;br /&gt;
# Cryptographie Visuelle { T. COUPECHOUX, N. TASCA} -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=CryptographieVisuelle Cryptographie Visuelle]&lt;br /&gt;
# Prise de contrôle à distance de la machine Windows 7 par une faille sur acrobat reader 9, preuve par l&#039;exemple de l&#039;intérêt des mises à jours { A. CHIVOT, P. PASQUIER, T. NOWICKI} -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=HackWind7FailleAcrobR7 Attaque Windows 7 par une faille sur acrobat reader 9 via Metasploit]&lt;br /&gt;
# Authentification via fingerprint { Z. CIMINERA, A. HURSTEL, F. VOUILLAMOZ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Autentification_via_fingerprint Autentification via fingerprint]&lt;br /&gt;
# Ransomwares { L. FERREIRA-GOMEZ, S. BERCHERY } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Ransomware Ransomwares]&lt;br /&gt;
# Cryptomonnaie { A. PORCHERON-ROCHE, L. JOMMETTI } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Cryptomonnaie Crypto-monnaie]&lt;br /&gt;
# Sécurité des réseaux sans fils WEP, WPA { M. LEBLANC, M.-O. DIALLO } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Securite_des_reseaux_WEP_WPA Sécurité des Réseaux WEP &amp;amp;amp; WPA]&lt;br /&gt;
# le chiffre ADFGVX { M. OUALI-ALAMI, O. SOUISSI } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Le_chiffre_ADFGVX le chiffre ADFGVX]&lt;br /&gt;
# La sécurité de la couche physique du RFID { J. MANGANONI, F. PRISCOGLIO } --[https://lama.univ-savoie.fr/mediawiki/index.php/Attaque_des_supports_sans_contact_type_RFID_et_NFC Sécurité du RFID]&lt;br /&gt;
# Blockchains { A. BADAJ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Blochchain Blockchains]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2016/2017 ==&lt;br /&gt;
&lt;br /&gt;
# Carré de Polybe { C. Farnier, B. Lauret } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php?title=Carre_de_Polybe Carré de Polybe]&lt;br /&gt;
# Cryptographie sur courbe elliptique (ECC) et l&#039;échange de clés Diffie-Hellman sur une courbe elliptique (ECDH) { P. Clavier }&lt;br /&gt;
# Sécurité des réseaux mobiles { G. Charvier, G. Yoccoz } -- [https://lama.univ-savoie.fr/mediawiki/index.php/GSM_Security La sécurité du réseau GSM]&lt;br /&gt;
# Sécurité des fichiers de format commun { A. De-Laere, T. Martin } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/S%C3%A9curit%C3%A9_des_fichiers_de_format_commun Sécurité des fichiers de format commun]&lt;br /&gt;
# Sécurité des appareils mobiles { B. Vaudey, B. Toneghin } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Sécurité_appareil_mobile Sécurité des appareils mobiles]&lt;br /&gt;
# Vulnérabilité des réseaux lorawan { H. A. RAKOTOARIVONY, N. Y. P. RANDRIANJATOVO } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Vulnerabilite_du_reseaux_lorawan Vulnerabilite des reseaux lorawan]&lt;br /&gt;
# Injections SQL (SQLi) et méthodes de protection { R. Rebillard, L. Robergeon } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Injections_SQL_et_m%C3%A9thodes_de_protection WikiSQLi]&lt;br /&gt;
# Social engineering { A. Senger, J. Manceaux } [https://lama.univ-savoie.fr/mediawiki/index.php/Social_engineering Social engineering]&lt;br /&gt;
# Courbes elliptiques pour la sécurité informatique {J. Suzan, G. Zablocki }&lt;br /&gt;
# Application &amp;quot;textsecure&amp;quot; { F. Ribard, A. Abdelmoumni } -- [https://lama.univ-savoie.fr/mediawiki/index.php/TextSecure WikiTextSecure]&lt;br /&gt;
# Cryptographie Visuelle { N. Baudon, G. Gomila, A. Vincent } -- [http://www.lama.univ-savoie.fr/mediawiki/index.php/Cryptographie_Visuelle Cryptographie visuelle]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2014/2015 ==&lt;br /&gt;
&lt;br /&gt;
# Cryptologie VS NSA { H. Ramamonjy, N.E. Ould Kadi }&lt;br /&gt;
# le Bitcoin { H. Helbawi, A. Tang, J. }&lt;br /&gt;
# le virus &amp;quot;stuxnet&amp;quot; { N. Challut et T. Chisci }&lt;br /&gt;
# Google Recaptcha { A. SAYAH, A. EL-HARRAS }&lt;br /&gt;
# La cryptographie dans l&#039;antiquité { Y. Lombardi, G. Badin }&lt;br /&gt;
# La sécurité des cartes bancaires { M. Salvat, Y. Salti }&lt;br /&gt;
# Cryptolocker { W. Lecable, M. Genovese }&lt;br /&gt;
# La machine de Turing et ses variantes { C. Laignel, P.E. Roux }&lt;br /&gt;
# La machine ENIGMA { B. Da Silva, G. Ply }&lt;br /&gt;
# La stéganographie { K. Deléglise, Y. Rakotonanahary }&lt;br /&gt;
# Sécurité des cartes bancaires { A. Bigane, F. Way }&lt;br /&gt;
# Le craquage de la cryptographie quantique ? { D. Cauwet, A. Hauguel }&lt;br /&gt;
# Le paiement par NFC { J. Maurice, S. Zehnder }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2013/2014 ==&lt;br /&gt;
&lt;br /&gt;
#* Le cryptosystème Bitcoin { Johanny Clerc-Renaud &amp;amp; Clément Montigny }&lt;br /&gt;
#* La stéganographie { Bosviel Thomas &amp;amp; Tolron Sebastien}&lt;br /&gt;
#* AES { Avet Anthony &amp;amp; Duraz Aurélien }&lt;br /&gt;
#* Payement NFC { Montouchet Raphaël &amp;amp; Marois Jeremy }&lt;br /&gt;
#* La sécurité dans les box de FAI { Charron Thomas &amp;amp; Mesurolle Anthony }&lt;br /&gt;
#* La technologie RFID et la sécurité { CHANTREL Thierry &amp;amp; SEZILLE Aurélien }&lt;br /&gt;
#* Le Cloud et la Cryptologie { Capellaro Alexandre &amp;amp; Chabert Cédric }&lt;br /&gt;
#* La sécurité et les chaines TV cryptées { CINDOLO Giuseppe &amp;amp; NARETTO Benjamin }&lt;br /&gt;
#* Tunneling TCP/IP via SSH {RAHARISON Laurent &amp;amp; JEAN FRANÇOIS Michael}&lt;br /&gt;
#* Principes et techniques de génération de nombres aléatoires {BERTHON Yohann &amp;amp; KELFANI Hugo &amp;amp; REY Anthony}&lt;br /&gt;
#* Sécurité atypique et empreintes des navigateurs {FONTANA Antonin}&lt;br /&gt;
#* La sécurité des monnaies électroniques {BUISSON Valentin &amp;amp; GENY-DUMONT Rémi}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2012/2013 ==&lt;br /&gt;
&lt;br /&gt;
#* Nouvelle philosophie de partage de fichiers avec MEGA { WAYNTAL David et DOMINATI Nicolas } (ok)&lt;br /&gt;
#* La cyberguerre { COLIN François et APPREDERISSE Benjamin } (ok)&lt;br /&gt;
#* Octobre Rouge { REGAZZONI Rudy et LOMBARD Adrien } (ok)&lt;br /&gt;
#* HTTPS et SSL { ASSIER Aymeric et ROLLINGER Claire } (ok)&lt;br /&gt;
#* DMZ { COLLOMB Camille et LAURENT Corantin } (ok)&lt;br /&gt;
#* Failles de sécurité des systèmes informatiques de grandes entreprises (LinkedIn, Apple, Sony, ...) { ARNOULD Mickaël et LEMAIRE Noémie } (ok)&lt;br /&gt;
#* Biométrie { BACART Aurélien et BAH Abdoulaye } (ok)&lt;br /&gt;
#* Sécurité et mobile : nouvelle cible des pirates { GEVET Gwénaël et YANG Yang } (ok)&lt;br /&gt;
#* Sécurité et [http://www.infosafe.fr/Armoirefortedin/Armoirefortedin.htm armoire forte ignifuge] pour les sauvegardes de données&lt;br /&gt;
#* Injections SQL &amp;amp; faille XSS { GUILLOT Pierre &amp;amp; KRATTINGER Thibaut }&lt;br /&gt;
#* La cryptographie militaire { GIUNCHI Ryan &amp;amp; CIMINERA Lary }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2011/2012 ==&lt;br /&gt;
&lt;br /&gt;
A vous de proposer des sujets d&#039;exposés... Prévoir 15min d&#039;exposé, suivi de 5min de questions.&lt;br /&gt;
&lt;br /&gt;
#* La sécurité des cartes bancaires (ok) { DORIEN Christophe et LAPIERRE Rémy }&lt;br /&gt;
#* La cyberguerre (ok) {MAIRE Cyril et MONTCHAL Justine}&lt;br /&gt;
#* La sécurité sur les sites Web (ok) {RABARIJAONA Domoina et BERTHET Vincent}&lt;br /&gt;
#* Virus et antivirus (ok) {EL AZHAR Said}&lt;br /&gt;
#* Présentation et explication de l&#039;attaque par le virus Stuxnet (ok) {PIRAT Victor et MENDES Etienne}&lt;br /&gt;
#* Vulnérabilités des smartphones (ok) {Titouan VAN BELLE et Jean-Baptiste PAUMIER}&lt;br /&gt;
#* L&#039;histoire de la cryptographie (ok) {Costa Jean-Philippe et Morel Julien}&lt;br /&gt;
#* L&#039;Informatique Ambiante et La Sécurité:Quel Protocole? (ok) {Marclin LEON et Farid BOUKHEDDAD}&lt;br /&gt;
#* Systèmes physiques de génération de nombres aléatoires : principes et avantages. (ok) {Florent Carral et Julie Tacheau}&lt;br /&gt;
#* Présentation des Honeypots (ok) {Adiche Rafik et Jean-François Michel-Patrique}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2010/2011 ==&lt;br /&gt;
&lt;br /&gt;
# Les exposés auront lieu le mercredi 23/3/2011 après-midi, et jeudi 24/3/2011 à partir de 13h30 selon le nb d&#039;exposés. Prévoir 15min d&#039;exposé, suivi de 5min de questions. L&#039;ordre proposé est celui ci-dessous. N&#039;hésitez pas à échanger entre vous.&lt;br /&gt;
&lt;br /&gt;
#* Sécurité des réseaux sans fils (ok) { ZHONG Jie et GONZALEZ Miguel }&lt;br /&gt;
#* La cyberguerre (ok) { SOUBEYRAND Martin et ROBART Laetitia }&lt;br /&gt;
#* Le principe de VPN et les attaques de VPN (ok) { DU Peng }&lt;br /&gt;
#* La signature numérique (ok) { DJEDDI Abdelkader }&lt;br /&gt;
#* Présentation de quelques attaques informatiques et quelques solutions proposées pour y remédier dans les réseaux P2P (ok) { Lila Zane et Ouhemmi }&lt;br /&gt;
#* Sécurité dans les cartes à puce (ok) { LAGHA Youssef et Nodari }&lt;br /&gt;
#* Evolution de la cryptologie à travers les âges (ok, mais vaste !) { DEBAENE Aurélien et VINCENT Christophe }&lt;br /&gt;
#* Biométrie (ok) { ZANE Bania et MENTDAHI Houda }&lt;br /&gt;
#* Comparaison de différents logiciels de crackage (ok) { AMBLARD Mathieu }&lt;br /&gt;
#* Construire des bons mots de passe { Liu Siqi }&lt;br /&gt;
#* La Machine Enigma (ok) { JULLIAN-DESAYES Jeremy et GARDET Nicolas }&lt;br /&gt;
#* Calculateurs quantiques et applications en cryptographie { BORCARD Justine et CATHELIN Gaël }&lt;br /&gt;
#* Présentation des Honeypots {Adiche Rafik et Jean-François Michel-Patrique}&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2009/2010) ==&lt;br /&gt;
&lt;br /&gt;
Les exposés se feront dans l&#039;ordre suivant. Vous pouvez vous mettre d&#039;accord entre vous pour échanger.&lt;br /&gt;
&lt;br /&gt;
# Lundi 14/12 après-midi&lt;br /&gt;
#* La virtualisation, facteur de sécurité ou de vulnérabilité (ok) { DIMIER Cédric et CARRIE Antoine }&lt;br /&gt;
#* Comment Aircrack trouve les clés WEP des réseaux wifi (ok) { LANOISELIER Aurélien et MARCHANOFF Jérôme}&lt;br /&gt;
#* Présentation et explication d&#039;une attaque historique (laquelle ?) { FLEUTIAUX Marc et AGUETTAZ Cédric}&lt;br /&gt;
#* La biométrie, une solution miracle pour l&#039;authentification ? (ok) { FERNANDES PIRES Anthony et GAYET Eric}&lt;br /&gt;
#* Stéganographie(ok) { PONCET Johan et MARTIN Romain}&lt;br /&gt;
#* Stéganographie ou les signatures numériques (ok) { TARDY Camille et CASSAGNERES Pierre-André}&lt;br /&gt;
# Mardi 15/12 après-midi&lt;br /&gt;
#* Sécurité anti-piratage (ok) {CHEVALIER Daniel et REIGNIER David}&lt;br /&gt;
#* Tour d&#039;horizon des attaques par Injection SQL. (ok) {MILLER Lucas et VIONNET Jean}&lt;br /&gt;
#* Tunneling, sécurisation et piratage (ok). {COLLEN Cyril et LAQUA Johann}&lt;br /&gt;
# Mercredi 16/12 après-midi&lt;br /&gt;
#* Attaques sur SSL. (ok) {Ferlay Mathieu et Six Lancelot}&lt;br /&gt;
#* Le Phreaking, piratage téléphonique (ok) {Rey Myriam}&lt;br /&gt;
#* Securité des réseaux sans fils (ok) {Tounkara Mounina et Philippe Monteiro}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2009/2010 ==&lt;br /&gt;
&lt;br /&gt;
#* La virtualisation, facteur de sécurité ou de vulnérabilité (ok) { DIMIER Cédric et CARRIE Antoine }&lt;br /&gt;
#* Comment Aircrack trouve les clés WEP des réseaux wifi (ok) { LANOISELIER Aurélien et MARCHANOFF Jérôme}&lt;br /&gt;
#* Présentation et explication d&#039;une attaque historique (laquelle ?) { FLEUTIAUX Marc et AGUETTAZ Cédric}&lt;br /&gt;
#* La biométrie, une solution miracle pour l&#039;authentification ? (ok) { FERNANDES PIRES Anthony et GAYET Eric}&lt;br /&gt;
#* Stéganographie(ok) { PONCET Johan et MARTIN Romain}&lt;br /&gt;
#* Stéganographie ou les signatures numériques (ok) { TARDY Camille et CASSAGNERES Pierre-André}&lt;br /&gt;
#* Sécurité anti-piratage (ok) {CHEVALIER Daniel et REIGNIER David}&lt;br /&gt;
#* Tour d&#039;horizon des attaques par Injection SQL. (ok) {MILLER Lucas et VIONET Jean}&lt;br /&gt;
#* Tunneling, sécurisation et piratage (ok). {COLLEN Cyril et LAQUA Johann}&lt;br /&gt;
#* Attaques sur SSL. (ok) {Ferlay Mathieu et Six Lancelot}&lt;br /&gt;
#* Le Phreaking, piratage téléphonique (ok) {Rey Myriam}&lt;br /&gt;
#* Fuites de donnée en entreprise (ok) {Tounkara Mounina et Philippe Monteiro}&lt;br /&gt;
#* PGP et la sécurité de l&#039;information {Cyrille Mortier}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2008/2009 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 30/1 de 8h à 12h (4CANTONS - 64) et de 13h30 à 17h30 (4CANTONS - 65). Les exposés sont à faire par binôme (ou monôme) et doivent durer 20 minutes environ. Ils seront suivis de 5 à 10 minutes de questions. Tout le monde assiste à tous les exposés. &lt;br /&gt;
&lt;br /&gt;
#* Les Protocoles de sécurité dans les réseaux WiFi (WEP et WPA) &amp;lt;&amp;lt;&amp;lt;&amp;lt; { Mickaël Wang &amp;amp; Arnaud Villevieille } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/Securite-wifi.pdf PDF]&lt;br /&gt;
#* Les outils d&#039;analyse de la sécurité des réseaux : renifleur, scanneurs de ports, outils de détection d&#039;intruison { Anis HADJALI &amp;amp; Vlad VESA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/analyse-securite.pdf PDF]&lt;br /&gt;
#* Google Hacking { Julien ARNOUX &amp;amp; Jeremy DEPOIL } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/ghack.pptx PPTX]&lt;br /&gt;
#* Virus et antivirus { Mehdi M. et Christophe M. }&lt;br /&gt;
#* 3DSecure { Natalia Lecoeur &amp;amp; Cindy Chiaberto } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/3D_Secure.pdf PDF]&lt;br /&gt;
#* Sécurité sous Linux en entreprise { Joël Leroy  Ebouele &amp;amp; Barbier Keller }&lt;br /&gt;
#* Techniques et outils de chiffrements de partitions [Valat Sebastien &amp;amp; Bouleis Romain]&lt;br /&gt;
#* IP Spoofing et DNS Spoofing { Alberic Martel &amp;amp; Fabien Dezempte ) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/ip-dns-spoofing.ppt PPT]&lt;br /&gt;
#* PRA le Plan de Reprise d&#039;Activité {Achraf AMEUR}&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques {Renneville Guybert et Fabrice Noraz}&lt;br /&gt;
#* La gestion des DRM  {Petithory Thomas &amp;amp; Paccard Charléric}&lt;br /&gt;
#* L&#039;introduction SSL,SSH { Julien Roche &amp;amp; Yi Wang }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2007/2008 ==&lt;br /&gt;
&lt;br /&gt;
Exposés le mardi 26/2 de 8h15 à 11h30 et le mercredi 27/2 de 8h15 à 11h30. Les exposés sont à faire par binôme et doivent durer 25 minutes environ. Ils seront suivis de 5 à 10 minutes de questions. Tout le monde assiste à tous les exposés.&lt;br /&gt;
&lt;br /&gt;
# Sujets d&#039;exposés (propositions, à étoffer)&lt;br /&gt;
#* Vulnérabilité du protocole WEP et de RC4 pour les réseaux WiFi   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PAVLOU, DALLACOSTA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Presentation_cryptologie_PAVLOU_DALLA_COSTA_512.mov MOV]&lt;br /&gt;
#* Vulnérabilité du protocole A5/1 des mobiles GSM. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FERNANDES} [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Cryptologie_et_securite_informatique_-_Fernandes.pdf PDF]&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques : Attaque de Mitnick, Morris Worm, DDOS Mafia Boy, etc   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PIPARO, HUMBERT } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Les_attaques_mediatisees_-_PIPARO_HUMBERT.pdf PDF]&lt;br /&gt;
#* La mise en place de la sécurité informatique au niveau national et international : CERTs, sites AntiSPAM&lt;br /&gt;
#* Attaques par injection de code XSS, parades &amp;lt;&amp;lt;&amp;lt;&amp;lt; { SERRA &amp;amp; ROCHE ) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Expose_securite_sur_le_XSS_-_Roche_et_Serra.pdf PDF]&lt;br /&gt;
#* Virus et antivirus&lt;br /&gt;
#* Secure shell (SSH) : protocole, applications, tunnelling &amp;lt;&amp;lt;&amp;lt;&amp;lt; {BODIN}&lt;br /&gt;
#* Le tatouage d&#039;image et de document (watermarking) &amp;lt;&amp;lt;&amp;lt;&amp;lt; {MAESEELE, CIMINERA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Watermarking_Ciminera_Maeseele.pdf PDF]&lt;br /&gt;
#* La gestion des DRM&lt;br /&gt;
#* Les certificats (PGP, X509) et les infrastructures de gestion de clés &lt;br /&gt;
#* IP Spoofing et DNS Spoofing &amp;lt;&amp;lt;&amp;lt;&amp;lt; { DEMOLIS &amp;amp; JUMEAU )&lt;br /&gt;
#* IPsec&lt;br /&gt;
#* Sécurité des réseaux sans fil : authentification, chiffrement, WEP, WPA =&amp;gt;Bugnard/Berthet&lt;br /&gt;
#* Les outils d&#039;analyse de la sécurité des réseaux : renifleur, scanneurs de ports, outils de détection d&#039;intruison  &lt;br /&gt;
#* Sécuriser un réseau : pare-feu, zone démilitarisée, protection des serveurs, adressage local &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FOLLIET et VIALA} [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/presentation_VIALA_FOLLIET.pdf PDF]&lt;br /&gt;
#* OpenBSD : aspects sécurité &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (REVELIN et ERROCHDI) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/OpenBSD_-_Revelin-Errochdi.pdf PDF]&lt;br /&gt;
#* Sécurité GPRS &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (PEHME et REY) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Securite_GPRS_-PEHME_REY.pdf PDF]&lt;br /&gt;
# Planning des exposés Mardi 12/2/2008&lt;br /&gt;
#* Vulnérabilité du protocole A5/1 des mobiles GSM. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FERNANDES}&lt;br /&gt;
# Mardi 27/2/2008, 8h15 -&amp;gt; 11h30&lt;br /&gt;
#* OpenBSD : aspects sécurité &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (REVELIN et ERROCHDI)&lt;br /&gt;
#* Secure shell (SSH) : protocole, applications, tunnelling &amp;lt;&amp;lt;&amp;lt;&amp;lt; {BODIN}&lt;br /&gt;
#* Sécuriser un réseau : pare-feu, zone démilitarisée, protection des serveurs, adressage local &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FOLLIET et VIALA}&lt;br /&gt;
#* Sécurité des réseaux sans fil : authentification, chiffrement, WEP, WPA =&amp;gt;Bugnard/Berthet&lt;br /&gt;
#* Vulnérabilité du protocole WEP et de RC4 pour les réseaux WiFi   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PAVLOU, DALLACOSTA }&lt;br /&gt;
# Planning des exposés Mercredi 28/2/2008, 8h15 -&amp;gt; 11h30&lt;br /&gt;
#* Sécurité GPRS &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (PEHME et REY)&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques : Attaque de Mitnick, Morris Worm, DDOS Mafia Boy, etc   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PIPARO, HUMBERT }&lt;br /&gt;
#* IP Spoofing et DNS Spoofing &amp;lt;&amp;lt;&amp;lt;&amp;lt; { DEMOLIS &amp;amp; JUMEAU )&lt;br /&gt;
#* Attaques par injection de code XSS, parades &amp;lt;&amp;lt;&amp;lt;&amp;lt; { SERRA &amp;amp; ROCHE )&lt;br /&gt;
#* Le tatouage d&#039;image et de document (watermarking) &amp;lt;&amp;lt;&amp;lt;&amp;lt; {MAESEELE, ??? }&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Game_Trainer&amp;diff=10702</id>
		<title>Game Trainer</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Game_Trainer&amp;diff=10702"/>
		<updated>2018-11-15T17:08:01Z</updated>

		<summary type="html">&lt;p&gt;Auger : Page créée avec « ... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;...&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO002_:_Cryptologie&amp;diff=10504</id>
		<title>INFO002 : Cryptologie</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO002_:_Cryptologie&amp;diff=10504"/>
		<updated>2018-11-07T10:19:51Z</updated>

		<summary type="html">&lt;p&gt;Auger : /* Sujets d&amp;#039;exposés pour l&amp;#039;année 2018/2019 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quelques ressources pour l&#039;étudiant ==&lt;br /&gt;
&lt;br /&gt;
# Cours &lt;br /&gt;
#* Support de cours (presentation [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Cours/cours.pdf PDF], article [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Cours/article.pdf PDF])&lt;br /&gt;
# Fiches de TD&lt;br /&gt;
#* TDs 1 : cryptographie élémentaire [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/TDs/td-1.ps PDF]&lt;br /&gt;
# TPs et autres travaux pratiques [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Tests/doc/html/index.html Pages des TPs]&lt;br /&gt;
# Autres ressources&lt;br /&gt;
#* Handbook of Applied Cryptology [http://www.cacr.math.uwaterloo.ca/hac/]&lt;br /&gt;
#* Cryptologie en ligne [http://www.apprendre-en-ligne.net/crypto/menu/index.html]&lt;br /&gt;
# [[Projets étudiants cryptographie et sécurité]]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2018/2019 ==&lt;br /&gt;
&lt;br /&gt;
Créez les liens vers vos wikis ci-dessous (comme les autres).&lt;br /&gt;
&lt;br /&gt;
# Authentification à deux facteurs { R. VIOLETTE, C. THONONT } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Authentification_deux_facteurs Authentification à deux facteurs]&lt;br /&gt;
# Bcrypt { A. PETETIN, F. SEBIRE } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php?title=Bcrypt Bcrypt]&lt;br /&gt;
# Les réseaux euclidiens {A. BROGNA, O. STHIOUL, A. BRUHL} -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Les_r%C3%A9seaux_euclidiens Les réseaux euclidiens]&lt;br /&gt;
# Game Trainer {L. AUGER} -- []&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2017/2018 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Stéganographie { S. BARNIAUDY, S. DUPRAZ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Steganographie stéganographie]&lt;br /&gt;
# Pretty Good Privacy { M. PELLET, B. LE SAUX } [https://lama.univ-savoie.fr/mediawiki/index.php?title=Pretty_Good_Privacy Pretty Good Privacy]&lt;br /&gt;
# Cryptographie Visuelle { T. COUPECHOUX, N. TASCA} -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=CryptographieVisuelle Cryptographie Visuelle]&lt;br /&gt;
# Prise de contrôle à distance de la machine Windows 7 par une faille sur acrobat reader 9, preuve par l&#039;exemple de l&#039;intérêt des mises à jours { A. CHIVOT, P. PASQUIER, T. NOWICKI} -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=HackWind7FailleAcrobR7 Attaque Windows 7 par une faille sur acrobat reader 9 via Metasploit]&lt;br /&gt;
# Authentification via fingerprint { Z. CIMINERA, A. HURSTEL, F. VOUILLAMOZ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Autentification_via_fingerprint Autentification via fingerprint]&lt;br /&gt;
# Ransomwares { L. FERREIRA-GOMEZ, S. BERCHERY } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Ransomware Ransomwares]&lt;br /&gt;
# Cryptomonnaie { A. PORCHERON-ROCHE, L. JOMMETTI } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Cryptomonnaie Crypto-monnaie]&lt;br /&gt;
# Sécurité des réseaux sans fils WEP, WPA { M. LEBLANC, M.-O. DIALLO } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Securite_des_reseaux_WEP_WPA Sécurité des Réseaux WEP &amp;amp;amp; WPA]&lt;br /&gt;
# le chiffre ADFGVX { M. OUALI-ALAMI, O. SOUISSI } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Le_chiffre_ADFGVX le chiffre ADFGVX]&lt;br /&gt;
# La sécurité de la couche physique du RFID { J. MANGANONI, F. PRISCOGLIO } --[https://lama.univ-savoie.fr/mediawiki/index.php/Attaque_des_supports_sans_contact_type_RFID_et_NFC Sécurité du RFID]&lt;br /&gt;
# Blockchains { A. BADAJ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Blochchain Blockchains]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2016/2017 ==&lt;br /&gt;
&lt;br /&gt;
# Carré de Polybe { C. Farnier, B. Lauret } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php?title=Carre_de_Polybe Carré de Polybe]&lt;br /&gt;
# Cryptographie sur courbe elliptique (ECC) et l&#039;échange de clés Diffie-Hellman sur une courbe elliptique (ECDH) { P. Clavier }&lt;br /&gt;
# Sécurité des réseaux mobiles { G. Charvier, G. Yoccoz } -- [https://lama.univ-savoie.fr/mediawiki/index.php/GSM_Security La sécurité du réseau GSM]&lt;br /&gt;
# Sécurité des fichiers de format commun { A. De-Laere, T. Martin } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/S%C3%A9curit%C3%A9_des_fichiers_de_format_commun Sécurité des fichiers de format commun]&lt;br /&gt;
# Sécurité des appareils mobiles { B. Vaudey, B. Toneghin } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Sécurité_appareil_mobile Sécurité des appareils mobiles]&lt;br /&gt;
# Vulnérabilité des réseaux lorawan { H. A. RAKOTOARIVONY, N. Y. P. RANDRIANJATOVO } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Vulnerabilite_du_reseaux_lorawan Vulnerabilite des reseaux lorawan]&lt;br /&gt;
# Injections SQL (SQLi) et méthodes de protection { R. Rebillard, L. Robergeon } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Injections_SQL_et_m%C3%A9thodes_de_protection WikiSQLi]&lt;br /&gt;
# Social engineering { A. Senger, J. Manceaux } [https://lama.univ-savoie.fr/mediawiki/index.php/Social_engineering Social engineering]&lt;br /&gt;
# Courbes elliptiques pour la sécurité informatique {J. Suzan, G. Zablocki }&lt;br /&gt;
# Application &amp;quot;textsecure&amp;quot; { F. Ribard, A. Abdelmoumni } -- [https://lama.univ-savoie.fr/mediawiki/index.php/TextSecure WikiTextSecure]&lt;br /&gt;
# Cryptographie Visuelle { N. Baudon, G. Gomila, A. Vincent } -- [http://www.lama.univ-savoie.fr/mediawiki/index.php/Cryptographie_Visuelle Cryptographie visuelle]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2014/2015 ==&lt;br /&gt;
&lt;br /&gt;
# Cryptologie VS NSA { H. Ramamonjy, N.E. Ould Kadi }&lt;br /&gt;
# le Bitcoin { H. Helbawi, A. Tang, J. }&lt;br /&gt;
# le virus &amp;quot;stuxnet&amp;quot; { N. Challut et T. Chisci }&lt;br /&gt;
# Google Recaptcha { A. SAYAH, A. EL-HARRAS }&lt;br /&gt;
# La cryptographie dans l&#039;antiquité { Y. Lombardi, G. Badin }&lt;br /&gt;
# La sécurité des cartes bancaires { M. Salvat, Y. Salti }&lt;br /&gt;
# Cryptolocker { W. Lecable, M. Genovese }&lt;br /&gt;
# La machine de Turing et ses variantes { C. Laignel, P.E. Roux }&lt;br /&gt;
# La machine ENIGMA { B. Da Silva, G. Ply }&lt;br /&gt;
# La stéganographie { K. Deléglise, Y. Rakotonanahary }&lt;br /&gt;
# Sécurité des cartes bancaires { A. Bigane, F. Way }&lt;br /&gt;
# Le craquage de la cryptographie quantique ? { D. Cauwet, A. Hauguel }&lt;br /&gt;
# Le paiement par NFC { J. Maurice, S. Zehnder }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2013/2014 ==&lt;br /&gt;
&lt;br /&gt;
#* Le cryptosystème Bitcoin { Johanny Clerc-Renaud &amp;amp; Clément Montigny }&lt;br /&gt;
#* La stéganographie { Bosviel Thomas &amp;amp; Tolron Sebastien}&lt;br /&gt;
#* AES { Avet Anthony &amp;amp; Duraz Aurélien }&lt;br /&gt;
#* Payement NFC { Montouchet Raphaël &amp;amp; Marois Jeremy }&lt;br /&gt;
#* La sécurité dans les box de FAI { Charron Thomas &amp;amp; Mesurolle Anthony }&lt;br /&gt;
#* La technologie RFID et la sécurité { CHANTREL Thierry &amp;amp; SEZILLE Aurélien }&lt;br /&gt;
#* Le Cloud et la Cryptologie { Capellaro Alexandre &amp;amp; Chabert Cédric }&lt;br /&gt;
#* La sécurité et les chaines TV cryptées { CINDOLO Giuseppe &amp;amp; NARETTO Benjamin }&lt;br /&gt;
#* Tunneling TCP/IP via SSH {RAHARISON Laurent &amp;amp; JEAN FRANÇOIS Michael}&lt;br /&gt;
#* Principes et techniques de génération de nombres aléatoires {BERTHON Yohann &amp;amp; KELFANI Hugo &amp;amp; REY Anthony}&lt;br /&gt;
#* Sécurité atypique et empreintes des navigateurs {FONTANA Antonin}&lt;br /&gt;
#* La sécurité des monnaies électroniques {BUISSON Valentin &amp;amp; GENY-DUMONT Rémi}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2012/2013 ==&lt;br /&gt;
&lt;br /&gt;
#* Nouvelle philosophie de partage de fichiers avec MEGA { WAYNTAL David et DOMINATI Nicolas } (ok)&lt;br /&gt;
#* La cyberguerre { COLIN François et APPREDERISSE Benjamin } (ok)&lt;br /&gt;
#* Octobre Rouge { REGAZZONI Rudy et LOMBARD Adrien } (ok)&lt;br /&gt;
#* HTTPS et SSL { ASSIER Aymeric et ROLLINGER Claire } (ok)&lt;br /&gt;
#* DMZ { COLLOMB Camille et LAURENT Corantin } (ok)&lt;br /&gt;
#* Failles de sécurité des systèmes informatiques de grandes entreprises (LinkedIn, Apple, Sony, ...) { ARNOULD Mickaël et LEMAIRE Noémie } (ok)&lt;br /&gt;
#* Biométrie { BACART Aurélien et BAH Abdoulaye } (ok)&lt;br /&gt;
#* Sécurité et mobile : nouvelle cible des pirates { GEVET Gwénaël et YANG Yang } (ok)&lt;br /&gt;
#* Sécurité et [http://www.infosafe.fr/Armoirefortedin/Armoirefortedin.htm armoire forte ignifuge] pour les sauvegardes de données&lt;br /&gt;
#* Injections SQL &amp;amp; faille XSS { GUILLOT Pierre &amp;amp; KRATTINGER Thibaut }&lt;br /&gt;
#* La cryptographie militaire { GIUNCHI Ryan &amp;amp; CIMINERA Lary }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2011/2012 ==&lt;br /&gt;
&lt;br /&gt;
A vous de proposer des sujets d&#039;exposés... Prévoir 15min d&#039;exposé, suivi de 5min de questions.&lt;br /&gt;
&lt;br /&gt;
#* La sécurité des cartes bancaires (ok) { DORIEN Christophe et LAPIERRE Rémy }&lt;br /&gt;
#* La cyberguerre (ok) {MAIRE Cyril et MONTCHAL Justine}&lt;br /&gt;
#* La sécurité sur les sites Web (ok) {RABARIJAONA Domoina et BERTHET Vincent}&lt;br /&gt;
#* Virus et antivirus (ok) {EL AZHAR Said}&lt;br /&gt;
#* Présentation et explication de l&#039;attaque par le virus Stuxnet (ok) {PIRAT Victor et MENDES Etienne}&lt;br /&gt;
#* Vulnérabilités des smartphones (ok) {Titouan VAN BELLE et Jean-Baptiste PAUMIER}&lt;br /&gt;
#* L&#039;histoire de la cryptographie (ok) {Costa Jean-Philippe et Morel Julien}&lt;br /&gt;
#* L&#039;Informatique Ambiante et La Sécurité:Quel Protocole? (ok) {Marclin LEON et Farid BOUKHEDDAD}&lt;br /&gt;
#* Systèmes physiques de génération de nombres aléatoires : principes et avantages. (ok) {Florent Carral et Julie Tacheau}&lt;br /&gt;
#* Présentation des Honeypots (ok) {Adiche Rafik et Jean-François Michel-Patrique}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2010/2011 ==&lt;br /&gt;
&lt;br /&gt;
# Les exposés auront lieu le mercredi 23/3/2011 après-midi, et jeudi 24/3/2011 à partir de 13h30 selon le nb d&#039;exposés. Prévoir 15min d&#039;exposé, suivi de 5min de questions. L&#039;ordre proposé est celui ci-dessous. N&#039;hésitez pas à échanger entre vous.&lt;br /&gt;
&lt;br /&gt;
#* Sécurité des réseaux sans fils (ok) { ZHONG Jie et GONZALEZ Miguel }&lt;br /&gt;
#* La cyberguerre (ok) { SOUBEYRAND Martin et ROBART Laetitia }&lt;br /&gt;
#* Le principe de VPN et les attaques de VPN (ok) { DU Peng }&lt;br /&gt;
#* La signature numérique (ok) { DJEDDI Abdelkader }&lt;br /&gt;
#* Présentation de quelques attaques informatiques et quelques solutions proposées pour y remédier dans les réseaux P2P (ok) { Lila Zane et Ouhemmi }&lt;br /&gt;
#* Sécurité dans les cartes à puce (ok) { LAGHA Youssef et Nodari }&lt;br /&gt;
#* Evolution de la cryptologie à travers les âges (ok, mais vaste !) { DEBAENE Aurélien et VINCENT Christophe }&lt;br /&gt;
#* Biométrie (ok) { ZANE Bania et MENTDAHI Houda }&lt;br /&gt;
#* Comparaison de différents logiciels de crackage (ok) { AMBLARD Mathieu }&lt;br /&gt;
#* Construire des bons mots de passe { Liu Siqi }&lt;br /&gt;
#* La Machine Enigma (ok) { JULLIAN-DESAYES Jeremy et GARDET Nicolas }&lt;br /&gt;
#* Calculateurs quantiques et applications en cryptographie { BORCARD Justine et CATHELIN Gaël }&lt;br /&gt;
#* Présentation des Honeypots {Adiche Rafik et Jean-François Michel-Patrique}&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2009/2010) ==&lt;br /&gt;
&lt;br /&gt;
Les exposés se feront dans l&#039;ordre suivant. Vous pouvez vous mettre d&#039;accord entre vous pour échanger.&lt;br /&gt;
&lt;br /&gt;
# Lundi 14/12 après-midi&lt;br /&gt;
#* La virtualisation, facteur de sécurité ou de vulnérabilité (ok) { DIMIER Cédric et CARRIE Antoine }&lt;br /&gt;
#* Comment Aircrack trouve les clés WEP des réseaux wifi (ok) { LANOISELIER Aurélien et MARCHANOFF Jérôme}&lt;br /&gt;
#* Présentation et explication d&#039;une attaque historique (laquelle ?) { FLEUTIAUX Marc et AGUETTAZ Cédric}&lt;br /&gt;
#* La biométrie, une solution miracle pour l&#039;authentification ? (ok) { FERNANDES PIRES Anthony et GAYET Eric}&lt;br /&gt;
#* Stéganographie(ok) { PONCET Johan et MARTIN Romain}&lt;br /&gt;
#* Stéganographie ou les signatures numériques (ok) { TARDY Camille et CASSAGNERES Pierre-André}&lt;br /&gt;
# Mardi 15/12 après-midi&lt;br /&gt;
#* Sécurité anti-piratage (ok) {CHEVALIER Daniel et REIGNIER David}&lt;br /&gt;
#* Tour d&#039;horizon des attaques par Injection SQL. (ok) {MILLER Lucas et VIONNET Jean}&lt;br /&gt;
#* Tunneling, sécurisation et piratage (ok). {COLLEN Cyril et LAQUA Johann}&lt;br /&gt;
# Mercredi 16/12 après-midi&lt;br /&gt;
#* Attaques sur SSL. (ok) {Ferlay Mathieu et Six Lancelot}&lt;br /&gt;
#* Le Phreaking, piratage téléphonique (ok) {Rey Myriam}&lt;br /&gt;
#* Securité des réseaux sans fils (ok) {Tounkara Mounina et Philippe Monteiro}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2009/2010 ==&lt;br /&gt;
&lt;br /&gt;
#* La virtualisation, facteur de sécurité ou de vulnérabilité (ok) { DIMIER Cédric et CARRIE Antoine }&lt;br /&gt;
#* Comment Aircrack trouve les clés WEP des réseaux wifi (ok) { LANOISELIER Aurélien et MARCHANOFF Jérôme}&lt;br /&gt;
#* Présentation et explication d&#039;une attaque historique (laquelle ?) { FLEUTIAUX Marc et AGUETTAZ Cédric}&lt;br /&gt;
#* La biométrie, une solution miracle pour l&#039;authentification ? (ok) { FERNANDES PIRES Anthony et GAYET Eric}&lt;br /&gt;
#* Stéganographie(ok) { PONCET Johan et MARTIN Romain}&lt;br /&gt;
#* Stéganographie ou les signatures numériques (ok) { TARDY Camille et CASSAGNERES Pierre-André}&lt;br /&gt;
#* Sécurité anti-piratage (ok) {CHEVALIER Daniel et REIGNIER David}&lt;br /&gt;
#* Tour d&#039;horizon des attaques par Injection SQL. (ok) {MILLER Lucas et VIONET Jean}&lt;br /&gt;
#* Tunneling, sécurisation et piratage (ok). {COLLEN Cyril et LAQUA Johann}&lt;br /&gt;
#* Attaques sur SSL. (ok) {Ferlay Mathieu et Six Lancelot}&lt;br /&gt;
#* Le Phreaking, piratage téléphonique (ok) {Rey Myriam}&lt;br /&gt;
#* Fuites de donnée en entreprise (ok) {Tounkara Mounina et Philippe Monteiro}&lt;br /&gt;
#* PGP et la sécurité de l&#039;information {Cyrille Mortier}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2008/2009 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 30/1 de 8h à 12h (4CANTONS - 64) et de 13h30 à 17h30 (4CANTONS - 65). Les exposés sont à faire par binôme (ou monôme) et doivent durer 20 minutes environ. Ils seront suivis de 5 à 10 minutes de questions. Tout le monde assiste à tous les exposés. &lt;br /&gt;
&lt;br /&gt;
#* Les Protocoles de sécurité dans les réseaux WiFi (WEP et WPA) &amp;lt;&amp;lt;&amp;lt;&amp;lt; { Mickaël Wang &amp;amp; Arnaud Villevieille } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/Securite-wifi.pdf PDF]&lt;br /&gt;
#* Les outils d&#039;analyse de la sécurité des réseaux : renifleur, scanneurs de ports, outils de détection d&#039;intruison { Anis HADJALI &amp;amp; Vlad VESA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/analyse-securite.pdf PDF]&lt;br /&gt;
#* Google Hacking { Julien ARNOUX &amp;amp; Jeremy DEPOIL } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/ghack.pptx PPTX]&lt;br /&gt;
#* Virus et antivirus { Mehdi M. et Christophe M. }&lt;br /&gt;
#* 3DSecure { Natalia Lecoeur &amp;amp; Cindy Chiaberto } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/3D_Secure.pdf PDF]&lt;br /&gt;
#* Sécurité sous Linux en entreprise { Joël Leroy  Ebouele &amp;amp; Barbier Keller }&lt;br /&gt;
#* Techniques et outils de chiffrements de partitions [Valat Sebastien &amp;amp; Bouleis Romain]&lt;br /&gt;
#* IP Spoofing et DNS Spoofing { Alberic Martel &amp;amp; Fabien Dezempte ) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/ip-dns-spoofing.ppt PPT]&lt;br /&gt;
#* PRA le Plan de Reprise d&#039;Activité {Achraf AMEUR}&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques {Renneville Guybert et Fabrice Noraz}&lt;br /&gt;
#* La gestion des DRM  {Petithory Thomas &amp;amp; Paccard Charléric}&lt;br /&gt;
#* L&#039;introduction SSL,SSH { Julien Roche &amp;amp; Yi Wang }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2007/2008 ==&lt;br /&gt;
&lt;br /&gt;
Exposés le mardi 26/2 de 8h15 à 11h30 et le mercredi 27/2 de 8h15 à 11h30. Les exposés sont à faire par binôme et doivent durer 25 minutes environ. Ils seront suivis de 5 à 10 minutes de questions. Tout le monde assiste à tous les exposés.&lt;br /&gt;
&lt;br /&gt;
# Sujets d&#039;exposés (propositions, à étoffer)&lt;br /&gt;
#* Vulnérabilité du protocole WEP et de RC4 pour les réseaux WiFi   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PAVLOU, DALLACOSTA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Presentation_cryptologie_PAVLOU_DALLA_COSTA_512.mov MOV]&lt;br /&gt;
#* Vulnérabilité du protocole A5/1 des mobiles GSM. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FERNANDES} [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Cryptologie_et_securite_informatique_-_Fernandes.pdf PDF]&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques : Attaque de Mitnick, Morris Worm, DDOS Mafia Boy, etc   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PIPARO, HUMBERT } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Les_attaques_mediatisees_-_PIPARO_HUMBERT.pdf PDF]&lt;br /&gt;
#* La mise en place de la sécurité informatique au niveau national et international : CERTs, sites AntiSPAM&lt;br /&gt;
#* Attaques par injection de code XSS, parades &amp;lt;&amp;lt;&amp;lt;&amp;lt; { SERRA &amp;amp; ROCHE ) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Expose_securite_sur_le_XSS_-_Roche_et_Serra.pdf PDF]&lt;br /&gt;
#* Virus et antivirus&lt;br /&gt;
#* Secure shell (SSH) : protocole, applications, tunnelling &amp;lt;&amp;lt;&amp;lt;&amp;lt; {BODIN}&lt;br /&gt;
#* Le tatouage d&#039;image et de document (watermarking) &amp;lt;&amp;lt;&amp;lt;&amp;lt; {MAESEELE, CIMINERA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Watermarking_Ciminera_Maeseele.pdf PDF]&lt;br /&gt;
#* La gestion des DRM&lt;br /&gt;
#* Les certificats (PGP, X509) et les infrastructures de gestion de clés &lt;br /&gt;
#* IP Spoofing et DNS Spoofing &amp;lt;&amp;lt;&amp;lt;&amp;lt; { DEMOLIS &amp;amp; JUMEAU )&lt;br /&gt;
#* IPsec&lt;br /&gt;
#* Sécurité des réseaux sans fil : authentification, chiffrement, WEP, WPA =&amp;gt;Bugnard/Berthet&lt;br /&gt;
#* Les outils d&#039;analyse de la sécurité des réseaux : renifleur, scanneurs de ports, outils de détection d&#039;intruison  &lt;br /&gt;
#* Sécuriser un réseau : pare-feu, zone démilitarisée, protection des serveurs, adressage local &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FOLLIET et VIALA} [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/presentation_VIALA_FOLLIET.pdf PDF]&lt;br /&gt;
#* OpenBSD : aspects sécurité &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (REVELIN et ERROCHDI) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/OpenBSD_-_Revelin-Errochdi.pdf PDF]&lt;br /&gt;
#* Sécurité GPRS &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (PEHME et REY) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Securite_GPRS_-PEHME_REY.pdf PDF]&lt;br /&gt;
# Planning des exposés Mardi 12/2/2008&lt;br /&gt;
#* Vulnérabilité du protocole A5/1 des mobiles GSM. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FERNANDES}&lt;br /&gt;
# Mardi 27/2/2008, 8h15 -&amp;gt; 11h30&lt;br /&gt;
#* OpenBSD : aspects sécurité &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (REVELIN et ERROCHDI)&lt;br /&gt;
#* Secure shell (SSH) : protocole, applications, tunnelling &amp;lt;&amp;lt;&amp;lt;&amp;lt; {BODIN}&lt;br /&gt;
#* Sécuriser un réseau : pare-feu, zone démilitarisée, protection des serveurs, adressage local &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FOLLIET et VIALA}&lt;br /&gt;
#* Sécurité des réseaux sans fil : authentification, chiffrement, WEP, WPA =&amp;gt;Bugnard/Berthet&lt;br /&gt;
#* Vulnérabilité du protocole WEP et de RC4 pour les réseaux WiFi   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PAVLOU, DALLACOSTA }&lt;br /&gt;
# Planning des exposés Mercredi 28/2/2008, 8h15 -&amp;gt; 11h30&lt;br /&gt;
#* Sécurité GPRS &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (PEHME et REY)&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques : Attaque de Mitnick, Morris Worm, DDOS Mafia Boy, etc   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PIPARO, HUMBERT }&lt;br /&gt;
#* IP Spoofing et DNS Spoofing &amp;lt;&amp;lt;&amp;lt;&amp;lt; { DEMOLIS &amp;amp; JUMEAU )&lt;br /&gt;
#* Attaques par injection de code XSS, parades &amp;lt;&amp;lt;&amp;lt;&amp;lt; { SERRA &amp;amp; ROCHE )&lt;br /&gt;
#* Le tatouage d&#039;image et de document (watermarking) &amp;lt;&amp;lt;&amp;lt;&amp;lt; {MAESEELE, ??? }&lt;/div&gt;</summary>
		<author><name>Auger</name></author>
	</entry>
</feed>