Voyons maintenant comment faire un trainer en C#. Ce tuto sera exactement le même tout simplement parce que peut-être que comme moi, vous préferez coder en .Net plutot qu'en ASM ou C++. Dans un second tutoriel en C#, je montrerai comment sur certains jeux webs (flash), il est possible de cheater. Voici donc le trainer de base version C#. Par contre, là où dans le premier tuto, nous avions fait une fenêtre console, ici je vous rappelle qu'avec le RAD de Visual Studio .Net, vous pouvez très facilement développer une interface. Néanmoins, chaque personne ayant son propre style de GUI (interface : Graphical User Interface).

ATTENTION ce code peut être copié collé et édité dans vos trainers, pas de lamers ici :D. Deuxième chose, si vous ne connaissez pas grand chose à la programmation .Net, ne lisez pas la suite, vous allez vous abîmer le cerveau ;)

Pour ceux qui sont assez fous pour continuer et qui ont décidé de continuer leur lecture, sachez tout de suite que nous allons utiliser exactement les mêmes fonctions qu'en C++ car ce sont des fonctions API incluses dans windows donc nous ne nous enbêterons pas à les recoder.

Première chose: les inclues. Ceux-ci ne sont nécessaires que si vous comptez coder une winform sinon, pas la peine de les renseigner.

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;



Puis nous écrivons notre fonction main(). Veillez à bien laisser main et non pas autre chose

[STAThread]
static void Main()
{
Application.Run(new CMain());
}


Il nous faut maintenant importer la fonction API située dans kernel32.dll :

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern bool WriteProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int nSize, int lpNumberOfBytesWritten);

 

Il nous faut rajouter la fonction qui va nous trouver l'handle de notre fenêtre.

System.Diagnostics.Process[] prcProcess = System.Diagnostics.Process.GetProcessesByName("igi2");
int iHandle = 0;
try
{

    iHandle = prcProcess[0].Handle.ToInt32();
}
catch
(Exception)
{
    MessageBox.Show("Jeu non lancé");
}

 

On déclare et configure nos variables

int address=0x052858E;
int[] patch={0x90, 0x90 ,0x90};



On écrit à l'adresse mémoire

WriteProcessMemory(iHandle, address,patch,patch.Length, 0);



Pour un bout de code final (juste la fonction de code)

System.Diagnostics.Process[] prcProcess = System.Diagnostics.Process.GetProcessesByName("igi2");
int iHandle;
int address=0x052858E;
int[] patch={0x90, 0x90 ,0x90};
try
{

    iHandle = prcProcess[0].Handle.ToInt32();
    WriteProcessMemory(iHandle, address,patch,patch.Length, 0);
}
catch
(Exception)
{
    MessageBox.Show("Jeu non lancé");
}

 

 

Si vous avez peur de vous tromper dans l'écriture des NOP, voici une mini-fonction qy

private int[] GenNop(int iNumber){

    byte[] Nop = new byte[iNumber];

    for (int i = 0; i < iNumber; i++)
    {
        Nop[i] = 0x90;
    }
    return Nop;
}

Vous pouvez l'appeler de cette façon

int[] patch = GenNop(3);