Merci pour ta réponse @fioutubs ça m'a donné à réfléchir et je pense avoir compris le principe et le principal. En récréant un Serveur/Proxy, je crée directement le MITM. Il s'agit donc de Hooker la fonction connect() vers ma machine.
Après 48h j'ai eu je pense davantage de soucis avec .NET et EasyHook qu'avec le reste... c'est désespérant.
J'avais commencé à créer un DofusHook.cs que je t'ai montré plus haut, j'en ai fais une DLL ("C:\Users\Alexandre\.nuget\packages\easyhook\2.7.7097\lib\net40\EasyHook.dll") pour l'injecter dans mon Program.cs mais problème:
"Le package 'EasyHook 2.7.7097' a été restauré en utilisant '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NE
TFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' au lieu du framework cible du projet 'net6.0'. Ce package n'est peut-être pas totalement compatible avec votre projet. "
--> j'ai testé avec Net 6.0 / 7.0 / 4.7 et c'est la même histoire (pourtant je change bien la version dans la <target> sur .csproj
--> Inlassablement j'obtiens : Could not load file or assembly 'System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. Le fichier spécifié est introuvable.
BREF, je contourne le problème on oublie la DLL, et on insère le DofusHook.cs directement au coeur du program.cs ce qui donne ça :
using System;
using System.Net;
using System.Runtime.InteropServices;
using EasyHook;
public partial class Program
{
// Définir un délégué pour la fonction connect()
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
delegate int ConnectDelegate(int socket, IntPtr addr, int addrlen);
// Fonction connect() originale
[DllImport("Ws2_32.dll", SetLastError = true)]
static extern int connect(int socket, IntPtr addr, int addrlen);
// Notre fonction hook qui sera appelée à la place de connect()
static int ConnectHook(int socket, IntPtr addr, int addrlen)
{
// Ici, vous pouvez rediriger la connexion vers votre proxy MITM
// en utilisant les informations d'adresse et de port de votre proxy.
var proxyIP = "127.0.0.1";
var proxyPort = 8080;
var proxyEndpoint = new IPEndPoint(IPAddress.Parse(proxyIP), proxyPort);
var proxyAddr = Marshal.AllocHGlobal(Marshal.SizeOf(proxyEndpoint));
Marshal.StructureToPtr(proxyEndpoint, proxyAddr, false);
// Pour éviter toute modification non autorisée du client Dofus,
// nous ne ferons rien ici et appellerons simplement la fonction connect() originale.
return connect(socket, addr, addrlen);
}
public static void Main(string[] args)
{
// Obtenez l'ID du processus du client Dofus
int dofusProcessId = GetDofusProcessId();
if (dofusProcessId == -1)
{
Console.WriteLine("Le client Dofus n'est pas en cours d'exécution. Veuillez lancer le client Dofus avant d'exécuter le bot.");
return;
}
try
{
// Afficher un message dans la console
Console.WriteLine("Le hook est maintenant actif et toutes les connexions de Dofus seront redirigées vers le proxy MITM.");
// Installer le hook sur la fonction connect()
LocalHook hook = LocalHook.Create(
LocalHook.GetProcAddress("Ws2_32.dll", "connect"),
new ConnectDelegate(ConnectHook),
typeof(Program));
Console.WriteLine("En attente d'activation du Hook");
// Activer le hook
hook.ThreadACL.SetExclusiveACL(new int[] { 0 });
RemoteHooking.WakeUpProcess();
Console.WriteLine("Le Hook est actif");
// Attendez indéfiniment pour que le hook soit actif (peut être remplacé par une logique de vérification appropriée)
Console.WriteLine("Le hook a été injecté dans le client Dofus. Appuyez sur n'importe quelle touche pour quitter.");
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine("Une erreur s'est produite lors de l'injection du hook : " + ex.Message);
}
}
private static int GetDofusProcessId()
{
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("Dofus");
if (processes.Length > 0)
{
return processes[0].Id;
}
return -1;
}
}
Ce coup-ci, on ne me remonte pas de problème lié DLL manquant.
Si je "run" mon program.cs sans Dofus, j'obtiens bien "Le client Dofus n'est pas en cours d'exécution. Veuillez lancer le client Dofus avant d'exécuter le bot." (ça ça fait plaisir au moins c'est conforme au code :D )
Et avec le client de lancer j'obtiens:
"Le hook est maintenant actif et toutes les connexions de Dofus seront redirigées vers le proxy MITM.
Une erreur s'est produite lors de l'injection du hook : The given library is not loaded into the current process."
Saurais tu me conseiller une solution ou m'éclairer ? Je regarde actuellement des projets qui utilisent WinSockHook mais j'ai remarqué que c'est une dépendance de EasyHook aussi.
Je suis sur le point de tenter ma chance en Python pour abandonner ce .NET qui me donne mal au crâne.
Bien sûr je lache pas le morceau, je suis novice, donc ça prendra du temps.
PS : J'ai écris un sujet similaire "Comment créer un bot MITM (pour de bon) il n'y a pas encore de réponses.
Merci