Bonsoir, j'essaye tant bien que mal de coder un bot en MITM et je me demandais si ce que je faisais était bon ou si je suis complètement à côté... (Enfin, il ne doit pas être si mal que ça puisque ça fonctionne jusqu'au packet 42).
Donc voici mon code (Oui je sais, c'est pas très propre, mais j'aimerais juste arriver à finaliser la connexion avant de rendre ça plus propre).
Cliquez pour révéler
Cliquez pour masquer
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
namespace BotMitm
{
public partial class Form1 : Form
{
Socket _ServeurMitm, _ClientMitm, _Client;
Thread _ClientThread, _ServeurThread;
byte[] _buff;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
_ServeurThread = new Thread(new ThreadStart(ReceptionClient));
_ServeurThread.Start();
}
private void Form1_Load(object sender, EventArgs e)
{
_ServeurMitm = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_ClientMitm = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
private void ReceptionClientMitm()
{
while (_ClientMitm.Connected)
{
// On crée notre buffer dynamique.
_buff = new byte[_ClientMitm.Available];
// Si le buffer n'est pas vide, on le parse.
if (_buff.Length != 0)
{
_ClientMitm.Receive(_buff); // Récéption des données.
ParseData(_buff);
}
}
}
private void ReceptionClient()
{
_ServeurMitm.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555));
Chat("Listening...");
_ServeurMitm.Listen(10);
_Client = _ServeurMitm.Accept();
_ClientMitm.Connect("213.248.126.180", 5555);
Chat("_ClientMitm Connecté");
_ClientThread = new Thread(new ThreadStart(ReceptionClientMitm));
_ClientThread.Start();
while (_Client.Connected)
{
// On crée notre buffer dynamique.
byte[] _buffer = new byte[_Client.Available];
// Si le buffer n'est pas vide, on le parse.
if (_buffer.Length != 0)
{
_Client.Receive(_buffer); // Récéption des données.
_ClientMitm.Send(_buffer);
}
}
}
private void TreatPacket(int PacketID, byte[] PacketContent)
{
Reader reader = new Reader(PacketContent);
Writer writer = new Writer();
switch (PacketID)
{
default:
_Client.Send(_buff);
break;
}
}
private void Chat(string Text)
{
Action log_callback = (Action)delegate
{
textBox1.Text += Text + "\r\n";
if (textBox1.TextLength - Text.Length < 0)
textBox1.SelectionStart = 0;
else
textBox1.SelectionStart = textBox1.TextLength - Text.Length;
textBox1.SelectionLength = Text.Length;
textBox1.SelectionStart = textBox1.TextLength;
textBox1.ScrollToCaret();
};
this.Invoke(log_callback);
}
private void ParseData(byte[] DataToParse)
{
// Déclaration des variables qui seront utilisées
int index = 0;
short id_and_packet_lenght_type, packet_lenght_type, packet_id;
Int32 packet_lenght = 0;
byte[] packet_content;
// Lecture jusqu'à la fin de byte[] data
while (index != DataToParse.Length)
{
// Décodage du header
id_and_packet_lenght_type = (short)(DataToParse[index] * 256 + DataToParse[index + 1]); // Selection des 2 premiers octets du paquet
packet_id = (short)(id_and_packet_lenght_type >> 2); // Récupérer l'ID du paquet
packet_lenght_type = (short)(id_and_packet_lenght_type & 3); // Récupérer la taille de la taille de la longueur du paquet
index += 2; // On se déplace 2 octets plus loin
// Récupération de la taille du paquet
switch (packet_lenght_type)
{
case 0:
packet_lenght = 0;
break;
case 1:
packet_lenght = DataToParse[index];
break;
case 2:
packet_lenght = DataToParse[index] * 256 + DataToParse[index + 1];
break;
case 3:
packet_lenght = DataToParse[index] * 65536 + DataToParse[index + 1] * 256 + DataToParse[index + 2];
break;
}
// Récupération du contenu du paquet
packet_content = new byte[(int)packet_lenght];
Array.Copy(DataToParse, index + packet_lenght_type, packet_content, 0, packet_lenght);
// Création de la variable contenant le contenu du paquet en héxadécimal
string content_hex = string.Empty;
int huit_bytes = 0;
foreach (byte b in packet_content)
{
if (huit_bytes == 8)
{
content_hex += "\r\n";
huit_bytes = 0;
}
content_hex += b.ToString("X2") + " ";
huit_bytes++;
}
// Jounalisation
Chat("[Reçu] ID = " + packet_id + " | Taille du contenu = " + packet_lenght + "\r\n" + content_hex + "\r\n");
// Traitement du paquet
TreatPacket(packet_id, packet_content);
// Définition de l'index qui démarre le paquet suivant
index += packet_lenght + packet_lenght_type;
}
}
}
}
Mais c'est surtout sur cette partie ci que j'aimerais avoir vos avis :
private void ReceptionClientMitm()
{
while (_ClientMitm.Connected)
{
// On crée notre buffer dynamique.
_buff = new byte[_ClientMitm.Available];
// Si le buffer n'est pas vide, on le parse.
if (_buff.Length != 0)
{
_ClientMitm.Receive(_buff); // Récéption des données.
ParseData(_buff);
}
}
}
private void ReceptionClient()
{
_ServeurMitm.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555));
Chat("Listening...");
_ServeurMitm.Listen(10);
_Client = _ServeurMitm.Accept();
_ClientMitm.Connect("213.248.126.180", 5555);
Chat("_ClientMitm Connecté");
_ClientThread = new Thread(new ThreadStart(ReceptionClientMitm));
_ClientThread.Start();
while (_Client.Connected)
{
// On crée notre buffer dynamique.
byte[] _buffer = new byte[_Client.Available];
// Si le buffer n'est pas vide, on le parse.
if (_buffer.Length != 0)
{
_Client.Receive(_buffer); // Récéption des données.
_ClientMitm.Send(_buffer);
}
}
}
private void TreatPacket(int PacketID, byte[] PacketContent)
{
Reader reader = new Reader(PacketContent);
Writer writer = new Writer();
switch (PacketID)
{
default:
_Client.Send(_buff);
break;
}
}
Voila merci d'avance et bonne soirée ^^'