J'ai une petite heure devant moi, je vais en profiter pour partager mes connaissances.
Ce tuto n'a pour but de vous apprendre le C#, car j'en serais incapable.
Cependant si vous souhaitez apprendre le C# je vous propose de lire le tuto que je link ci dessous ( je sais pas si j'ai le droit ).
Ce tuto, je le réalise sous microsoft visual C# 2008 express ( IDE gratuit ).
Pour commencer il faut déclarer et initialiser un membre "Tcpclient" et un membre "Networkstream" si possible en global ( oui je sais que c'est pas beau mais au début on va pas faire compliquer hein !).
private TcpClient tcpclient = new TcpClient();
private NetworkStream nstream = null;
Ensuite il faut esseyer de connecter ces membres au jeu D. ... Dans un premier temps on va se connecter au jeu D. et après nous verons qu'il faut se connecter au serveur de jeu.
L'ip du jeu D. est "213.248.126.180" et le port "443"
try // essaie ...
{
tcpclient.Connect("213.248.126.180", 443); // de se connecter a l'ip 213.248.126.180 et le port 443
if (!tcpclient.Connected) // si il n'y arrive pas ...
{
Environment.Exit(0); // ferme le programme
}
nstream = tcpclient.GetStream(); // sinon il y a connexion donc on prend sa socket avec laquelle on va intéragir
rcv_thr = new System.Threading.Thread(new System.Threading.ThreadStart(rcv)); // on initialise le thread de reception
rcv_thr.Start(); // on le démarre
}
catch (Exception ex) // si erreur ...
{
Environment.Exit(0); // ferme le programme
}
Pour le thread de reception, la fonction est disponible ICI et elle s'appelle "rcv".
Il faut aussi récuperer la fonction "send" et "receivedata"
Cliquez pour révéler
Cliquez pour masquer
private void rcv()
{
while (tcpclient.Connected) // tant que tcpclient est connecté
{
Byte[] databyt = new Byte[tcpclient.Available];
try
{
nstream.Read(databyt, 0, databyt.Length); // lire la socket
}
catch
{
}
string str00 = Encoding.ASCII.GetString(databyt);
string[] str01 = null;
str01 = str00.Split(new char[] { '\0' });
foreach (string str02 in str01)
{
pck_queue.Enqueue(str02);
ReceiveData();
}
}
}
Cliquez pour révéler
Cliquez pour masquer
private void send(string Data)
{
Data += "\n\0"; //on rajoute les caractères "0A" et "00" à la fin des données
//on encode les données en bytes
byte[] DataToSend = Encoding.UTF8.GetBytes(Data);
nstream.Write(DataToSend, 0, DataToSend.Length); // on écrit sur la socket
}
Cliquez pour révéler
Cliquez pour masquer
private void ReceiveData()
{
if (pck_queue.Count != 0)
{
for (int i = 0; i < pck_queue.Count; i++)
{
Data = pck_queue.Dequeue();
if (Data != "")
{
string donnée = "", pass = "", key="";
try
{
donnée = Data.Substring(0, 2);
}
catch
{
donnée = "";
}
switch (donnée)
{
// c'est la que tout le dialogue avec le serveur va etre repertorié
}
}
}
}
}
Sachez que ces fonctions sont tout à fait utilisable ... Personnelment je n'ai absolument pas touché au fonction "rcv" et "send" car je n'y comprend strictement rien ( enfin si j'ai changé les noms ), j'ai par contre un peu retapé "receivedata" qui en faite sera votre centre de traitement des données, c'est la que en fonction des données reçu le bot va savoir quoi renvoyer.
Vous n'avez également pas de retour pour voir ce qu'il se passe dans ce bot, je vous propose donc d'utiliser la console, il faut donc a l'ouverture d'un nouveau projet mettre "application console". On utilisera "console.writeline" pour faire le retour.
Comme nous passons en console, il faut modifier tous les préfixe de fonction "private" en "static" et enlever tout les "messagebox", vous pouvez les remplacer par "console.writeline"
A partir de ce moment la il vous faudra fermer les membres "tcpclient" et "nstream" si on ferme le programme pour désaloué la mémoire qu'ils occuppent avec la méthode ".close()".
il vous faut aussi déclarer le thread, le queue et le Data en global aussi.
Cliquez pour révéler
Cliquez pour masquer
private static Queue<string> pck_queue = new Queue<string>();
private static System.Threading.Thread rcv_th = null;
private static string Data = null;
voici ce que vous devriez obtenir a ce stade ( avec les retours ) :
Cliquez pour révéler
Cliquez pour masquer
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ComponentModel;
using System.Net.Sockets;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
private static TcpClient tcpclient = new TcpClient();
private static string Data = null;
private static NetworkStream nstream = null;
private static Queue<string> pck_queue = new Queue<string>();
private static System.Threading.Thread rcv_th = null;
static void Main(string[] args)
{
try
{
tcpclient.Connect("213.248.126.180", 443);
if (!tcpclient.Connected)
{
Environment.Exit(0);
}
nstream = tcpclient.GetStream();
rcv_th = new System.Threading.Thread(new System.Threading.ThreadStart(rcv));
rcv_th.Start();
}
catch (Exception expt1)
{
Environment.Exit(0);
}
}
static void rcv()
{
while (tcpclient.Connected)
{
Byte[] databyt = new Byte[tcpclient.Available];
try
{
nstream.Read(databyt, 0, databyt.Length);
}
catch
{
}
string str00 = Encoding.ASCII.GetString(databyt);
string[] str01 = null;
str01 = str00.Split(new char[] { '\0' });
foreach (string str02 in str01)
{
pck_queue.Enqueue(str02);
ReceiveData();
}
}
}
static void send(string Data)
{
Data += "\n\0"; //on rajoute les caractères "0A" et "00" à la fin des données
//on encode les données en bytes
byte[] DataToSend = Encoding.UTF8.GetBytes(Data);
nstream.Write(DataToSend, 0, DataToSend.Length);
Console.WriteLine("snd : " + Data);
}
static void ReceiveData()
{
if (pck_queue.Count != 0)
{
for (int i = 0; i < pck_queue.Count; i++)
{
Data = pck_queue.Dequeue();
if (Data != "")
{
Console.WriteLine("rcv : " + Data);
string donnée = "", pass = "", key = "";
try
{
donnée = Data.Substring(0, 2);
}
catch
{
donnée = "";
}
switch (donnée)
{
}
}
}
}
}
}
}
donc a partir de la tout va se faire tout seul il vous suffit de sniffer et de repporter les paquets sniffés dans votre fonction "receivedata".
Si on compile le bot avec "F6" puis on le démarre avec "F5" ... On obtient un truc comme ça :
Loading Image
Ceci est une clé d'encryptage pour votre mot de passe, votre mot de passe est a noter dans "pass".
Mais d'abord il faut envoiyer la version :
send("1.28.0");
puis on découpe notre clé et on l'envoi en la faisant passer par la fonction "Cryptpassword" qui va crypter le mor de passe :
string key = Data.Substring(2, 32);
send("1.28.0");
send("pseudo" + "\n" + CryptPassword(key, pass));
send("Af");
break;
la fonction cryptpassword est la suivante :
Cliquez pour révéler
Cliquez pour masquer
static string CryptPassword(string Key, string Password)
{
char[] chArray = new char[] {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'};
string str = "#1";
for (int i = 0; i < Password.Length; i++)
{
char ch = Password;
char ch2 = Key;
int num2 = ch / '\x0010';
int num3 = ch % '\x0010';
int index = (num2 + ch2) % chArray.Length;
int num5 = (num3 + ch2) % chArray.Length;
str = str + chArray[index] + chArray[num5];
}
return str;
}
il faut aussi savoir pourquoi on envoi cela ... parce qu'on a reçu le paquet "HC", notre swtich donnera donc :
case "HC": Thread.Sleep(100);
key = Data.Substring(2, 32);
send("1.28.0");
send("pseudo" + "\n" + CryptPassword(key, pass));
send("Af");
break;
puis on suis ce que l'on sniff avec WPE PRO, on reçoit donc "AH", on envoit "Ax", il nous envoit "Ad", on lui envoit "Ax".
puis on reçoit le(s) serveur(s) sur lesquelle(s) vous avez de(s) perso(s) :
AxK0|17,1
AxK0|[ID premier serveur],[Nombre de persos dessus]|[ID 2em serveur],[Nombre de persos dessus]|....
Donc mon cas je suis sur rykke errel ... je renvoi donc "AX16"
A ce moment la nous arrivons a un tournant de la connection puisqu'il faut se deconnecter du serveur du jeu D. et se reconnecter au serveur de jeu.
donc on reçoit un paquet genre :
Loading Image
Tournant d'accord mais plus compliqué ... non. Il suffit de découper ce paquet et de savoir le découper. Donc dans ce paquet nous avons ce que nous appelons un ticket qui est propre a chaque comptes et une addresse IP ( celle du serveur ) crypté et donc qu'il faudra décrypter :
Cliquez pour révéler
Cliquez pour masquer
static string CryptIp(string sExtraData)
{
string loc8, loc9, loc7, loc5 = "";
loc8 = sExtraData.Substring(0, 8);
loc9 = sExtraData.Substring(8, 3);
loc7 = sExtraData.Substring(11);
int loc12, loc13, loc10;
for (int loc11 = 0; loc11 < 8; loc11 += 2)
{
byte code_ascii = (byte)loc8[loc11];
loc12 = code_ascii - 48;
byte code_ascii2 = (byte)loc8[loc11 + 1];
loc13 = code_ascii2 - 48;
loc10 = (((loc12 & 15) << 4) | (loc13 & 15));
loc5 += "." + loc10;
} // end while
loc5 = loc5.Substring(1);
return loc5;
}
pour décrypter l'ip il faut decouper le paquet après le caractère 3 puis pour le ticket, il faudra découper après le caratère 11 :
case "AX": Thread.Sleep(100);
string ip, coupe = "";
coupe = Data.Substring(3);
ticket = coupe.Substring(11);
ip = CryptIp(coupe);
break;
puis il faudra ce reconnecter.
Donc d'abord on libère nos membres "tcpclient" et "nstream" et on redéclare "tcpclient" :
tcpclient = new TcpClient();
on recupere la connection que l'on a fait au début mais cette fois ci, on le connecte avec "ip".
le case en entier donne ça :
Cliquez pour révéler
Cliquez pour masquer
case "AX": Thread.Sleep(100);
string ip, coupe = "", ticket = "";
coupe = Data.Substring(3);
ticket = coupe.Substring(11);
ip = CryptIp(coupe);
tcpclient.Close();
nstream.Close();
tcpclient = new TcpClient();
try
{
tcpclient.Connect(ip, 443);
if (!tcpclient.Connected)
{
Environment.Exit(0);
}
nstream = tcpclient.GetStream();
rcv_th = new System.Threading.Thread(new System.Threading.ThreadStart(rcv));
rcv_th.Start();
}
catch (Exception expt1)
{
Environment.Exit(0);
}
break;
et le script donne ça :
Cliquez pour révéler
Cliquez pour masquer
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ComponentModel;
using System.Net.Sockets;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
private static TcpClient tcpclient = new TcpClient();
private static string Data = null;
private static NetworkStream nstream = null;
private static Queue<string> pck_queue = new Queue<string>();
private static System.Threading.Thread rcv_th = null;
static void Main(string[] args)
{
try
{
tcpclient.Connect("213.248.126.180", 443);
if (!tcpclient.Connected)
{
Environment.Exit(0);
}
nstream = tcpclient.GetStream();
rcv_th = new System.Threading.Thread(new System.Threading.ThreadStart(rcv));
rcv_th.Start();
}
catch (Exception expt1)
{
Environment.Exit(0);
}
}
static void rcv()
{
while (tcpclient.Connected)
{
Byte[] databyt = new Byte[tcpclient.Available];
try
{
nstream.Read(databyt, 0, databyt.Length);
}
catch
{
}
string str00 = Encoding.ASCII.GetString(databyt);
string[] str01 = null;
str01 = str00.Split(new char[] { '\0' });
foreach (string str02 in str01)
{
pck_queue.Enqueue(str02);
ReceiveData();
}
}
}
static void send(string Data)
{
Data += "\n\0"; //on rajoute les caractères "0A" et "00" à la fin des données
//on encode les données en bytes
byte[] DataToSend = Encoding.UTF8.GetBytes(Data);
nstream.Write(DataToSend, 0, DataToSend.Length);
Console.WriteLine("snd : " + Data);
}
static void ReceiveData()
{
if (pck_queue.Count != 0)
{
for (int i = 0; i < pck_queue.Count; i++)
{
Data = pck_queue.Dequeue();
if (Data != "")
{
Console.WriteLine("rcv : " + Data);
string donnée = "", pass = "motdepasse", key = "";
try
{
donnée = Data.Substring(0, 2);
}
catch
{
donnée = "";
}
switch (donnée)
{
case "HC": Thread.Sleep(100);
key = Data.Substring(2, 32);
send("1.28.0");
send("pseudo" + "\n" + CryptPassword(key, pass));
send("Af");
break;
case "AH": Thread.Sleep(100);
send("Ax");
break;
case "Ax": Thread.Sleep(100);
send("AX16");
break;
case "Ad": Thread.Sleep(100);
send("Ax");
break;
case "AX": Thread.Sleep(100);
string ip, coupe = "", ticket = "";
coupe = Data.Substring(3);
ticket = coupe.Substring(11);
ip = CryptIp(coupe);
tcpclient.Close();
nstream.Close();
tcpclient = new TcpClient();
try
{
tcpclient.Connect(ip, 443);
if (!tcpclient.Connected)
{
Environment.Exit(0);
}
nstream = tcpclient.GetStream();
rcv_th = new System.Threading.Thread(new System.Threading.ThreadStart(rcv));
rcv_th.Start();
}
catch (Exception expt1)
{
Environment.Exit(0);
}
break;
}
}
}
}
}
static string CryptPassword(string Key, string Password)
{
char[] chArray = new char[] {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'};
string str = "#1";
for (int i = 0; i < Password.Length; i++)
{
char ch = Password;
char ch2 = Key;
int num2 = ch / '\x0010';
int num3 = ch % '\x0010';
int index = (num2 + ch2) % chArray.Length;
int num5 = (num3 + ch2) % chArray.Length;
str = str + chArray[index] + chArray[num5];
}
return str;
}
static string CryptIp(string sExtraData)
{
string loc8, loc9, loc7, loc5 = "";
loc8 = sExtraData.Substring(0, 8);
loc9 = sExtraData.Substring(8, 3);
loc7 = sExtraData.Substring(11);
int loc12, loc13, loc10;
for (int loc11 = 0; loc11 < 8; loc11 += 2)
{
byte code_ascii = (byte)loc8[loc11];
loc12 = code_ascii - 48;
byte code_ascii2 = (byte)loc8[loc11 + 1];
loc13 = code_ascii2 - 48;
loc10 = (((loc12 & 15) << 4) | (loc13 & 15));
loc5 += "." + loc10;
} // end while
loc5 = loc5.Substring(1);
return loc5;
}
}
}
Si la connection au serveur de jeu a réussi - on recoit "HG".
on lui envoi "AT" et le ticket.
case "HG": Thread.Sleep(100);
snd("AT" + ticket);
break;
A partir de la ça se suit - il faut juste envoyer les bons paquets ... Je vous le donne comme ça car il n'y a rien a comprendre ni a changer.
Cliquez pour révéler
Cliquez pour masquer
case "AT": Thread.Sleep(100);
snd("Ak0");
snd("AV");
break;
case "AV": Thread.Sleep(100);
snd("Agfr");
snd("AL");
snd("Af");
break;
Donc a ce moment la nous recevons les persos présent sur le serveur - il faut découper celon les caractères "|" et ";" pour récuperer l'ID du perso voulu et l'envoyer précedé de "AS". Ce bout de code selectionne le premier perso :
case "AL": Thread.Sleep(100);
string[] perso = Data.Split('|');
string[] perso1 = perso[2].Split(';');
snd("AS" + perso1[0]);
snd("Af");
break;
Ensuite quand on reçoi "AS" on renvoi "GC1" puis notre perso est connecté.
Je vous file le code en entier :
Cliquez pour révéler
Cliquez pour masquer
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ComponentModel;
using System.Net.Sockets;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
private static TcpClient tcpclient = new TcpClient();
private static string Data = null;
private static NetworkStream nstream = null;
private static Queue<string> pck_queue = new Queue<string>();
private static System.Threading.Thread rcv_th = null;
static string ticket = "";
static void Main(string[] args)
{
try
{
tcpclient.Connect("213.248.126.180", 443);
if (!tcpclient.Connected)
{
Environment.Exit(0);
}
nstream = tcpclient.GetStream();
rcv_th = new System.Threading.Thread(new System.Threading.ThreadStart(rcv));
rcv_th.Start();
}
catch (Exception expt1)
{
Environment.Exit(0);
}
}
static void rcv()
{
while (tcpclient.Connected)
{
Byte[] databyt = new Byte[tcpclient.Available];
try
{
nstream.Read(databyt, 0, databyt.Length);
}
catch
{
}
string str00 = Encoding.ASCII.GetString(databyt);
string[] str01 = null;
str01 = str00.Split(new char[] { '\0' });
foreach (string str02 in str01)
{
pck_queue.Enqueue(str02);
ReceiveData();
}
}
}
static void send(string Data)
{
Data += "\n\0"; //on rajoute les caractères "0A" et "00" à la fin des données
//on encode les données en bytes
byte[] DataToSend = Encoding.UTF8.GetBytes(Data);
nstream.Write(DataToSend, 0, DataToSend.Length);
Console.WriteLine("snd : " + Data);
}
static void ReceiveData()
{
if (pck_queue.Count != 0)
{
for (int i = 0; i < pck_queue.Count; i++)
{
Data = pck_queue.Dequeue();
if (Data != "")
{
Console.WriteLine("rcv : " + Data);
string donnée = "", pass = "motdepasse", key = "";
try
{
donnée = Data.Substring(0, 2);
}
catch
{
}
switch (donnée)
{
case "HC": Thread.Sleep(100);
key = Data.Substring(2, 32);
send("1.28.0");
send("pseudo" + "\n" + CryptPassword(key, pass));
send("Af");
break;
case "AH": Thread.Sleep(100);
send("Ax");
break;
case "Ax": Thread.Sleep(100);
send("AX16");
break;
case "Ad": Thread.Sleep(100);
send("Ax");
break;
case "AX": Thread.Sleep(100);
string ip, coupe = "";
coupe = Data.Substring(3);
ticket = coupe.Substring(11);
ip = CryptIp(coupe);
tcpclient.Close();
nstream.Close();
tcpclient = new TcpClient();
try
{
Console.WriteLine(ip + "\n" + ticket);
tcpclient.Connect(ip, 443);
if (!tcpclient.Connected)
{
Environment.Exit(0);
}
nstream = tcpclient.GetStream();
rcv_th = new System.Threading.Thread(new System.Threading.ThreadStart(rcv));
rcv_th.Start();
}
catch (Exception expt1)
{
Environment.Exit(0);
}
Thread.Sleep(100);
break;
case "HG": Thread.Sleep(100);
send("AT" + ticket);
break;
case "AT": Thread.Sleep(100);
send("Ak0");
send("AV");
break;
case "AV": Thread.Sleep(100);
send("Agfr");
send("AL");
send("Af");
break;
case "AL": Thread.Sleep(100);
string[] perso = Data.Split('|');
string[] perso1 = perso[2].Split(';');
send("AS" + perso1[0]);
send("Af");
break;
case "AS": Thread.Sleep(100);
send("GC1");
break;
}
}
}
}
}
static string CryptPassword(string Key, string Password)
{
char[] chArray = new char[] {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'};
string str = "#1";
for (int i = 0; i < Password.Length; i++)
{
char ch = Password;
char ch2 = Key;
int num2 = ch / '\x0010';
int num3 = ch % '\x0010';
int index = (num2 + ch2) % chArray.Length;
int num5 = (num3 + ch2) % chArray.Length;
str = str + chArray[index] + chArray[num5];
}
return str;
}
static string CryptIp(string sExtraData)
{
string loc8, loc9, loc7, loc5 = "";
loc8 = sExtraData.Substring(0, 8);
loc9 = sExtraData.Substring(8, 3);
loc7 = sExtraData.Substring(11);
int loc12, loc13, loc10;
for (int loc11 = 0; loc11 < 8; loc11 += 2)
{
byte code_ascii = (byte)loc8[loc11];
loc12 = code_ascii - 48;
byte code_ascii2 = (byte)loc8[loc11 + 1];
loc13 = code_ascii2 - 48;
loc10 = (((loc12 & 15) << 4) | (loc13 & 15));
loc5 += "." + loc10;
} // end while
loc5 = loc5.Substring(1);
return loc5;
}
}
}
Cliquez pour révéler
Cliquez pour masquer
Ce script est a améliorer car apparement il ne se termine que une fois sur deux :/.
Bon bah en conclusion, bin ça fait une heure =).
Non en vrai certain vont dire que c'est du leech et d'autre qu'il ne comprenne rien mais je vous assure que si j'aurais eu ce tuto pour m'aider la première fois je serais allé beaucoup plus vite.
Il y a des parties qui sont assez difficile a comprendre surtout celle de la reconnection et je n'utilise pas tout les temps les bons mots ... j'en concois mais ces parties ne sont vraiment pas facile a expliqué.
Je vous conseille vraiment de lire le tuto que je link - peut etre pas en entier mais au moins la partie prog internet, ce tuto m'a beaucoup aidé ainsi que le bot de geraff.
je vous donne aussi ce site http://ender.e3b.org/wiki/index.php?title=Accueil qui sera la quand vous aurez besoin d'aller plus loin.
Si vous avez des questions - je serais toujours la pour y répondre du moment que vous soyez motivé et que vous en vouliez !
liike_out-you@hotmail.fr
Je suis bien sur ouvert a toutes critiques, toutes remarques du moment que celles ci soit constructives !
Je ne demande pas que ce tuto soit accepté comme tuto car je sais que c'est le fouilli.
Je suis perfectioniste que sur les choses que je comprend et donc que je peut améliorer.
Voila je vous souhaite bonne chance et un conseil : perseverez !!!!
Hell
EDIT : Personne ne m'a dit que je n'avais pas donner le lien, j'arrive pas a l'uploader ( IE plante a chaque fois ) alors voici le lien du cours en C# http://tahe.developpez.com/dotnet/csharp/