(Expert) Les Sockets avec AutoIt

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Bit-X

V
Jan 11, 2012
703
1
924
Dans un livre
Discord
kolibry#8414
Plop les amis ! on continue les aventure AutoIt pour les exprets !

Vous devez savoir lire aisément l'AutoIt pour continuer car vous devrez comprendre seul le fonctionnement des fonctions complexe !

Ce tuto va vous permettre d'utiliser la même technologie que WireShark par exemple.

WireShark utilise un module "WinPcap" qui sert à recevoir les trames de données via une interface choisis. Nous verons donc ici, comment recevoir ces trames (Sockets) et les utiliser. Pour l'envoi de sockets, on verra ça plus tard car c'est plus complexe.

Trouvez vers ce lien, l'installeur WinPcap : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

Sur celui ci, un fichier ".au3" : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
C'est un Zip contenant les fonctions édité par Nicolas Ricquemaque.

Sans ça, ne continuez pas le tutoriel, ça ne pourra pas fonctionner.

Toutes le fonctions qui suivent sont entièrement ma création, veuillez s'il vous plait respecter ce travail.

1. Installez WinPcap.
2. Extraire le fichier ".au3" qui se trouve dans le Zip.

3. Pour plus de confort, nous avons besoin des droits administrateur. placez cette ligne au sommet du projet.
PHP:
#RequireAdmin

4. Incluez ce fichier dans votre projet de la manière suivante.
PHP:
#include "Winpcap.au3"

5. On déclare nos variables.
PHP:
Global $winpcap,$pcap_devices,$pcap,$packet,$src,$int

6. Créons une fonction pour initialiser sans difficulté notre réception. Plusieurs interface sont disponible mais nous utiliserons uniquement celle utile aux Bots.
PHP:
Func Socket_Initialise()
	$winpcap=_PcapSetup()
	If $winpcap=-1 Then MsgBox(0,"WinpCap_Err01","Impossible d'initialiser la liaison. Verifier votre installation de WinpCap")
	$pcap_devices=_PcapGetDeviceList()
	If $pcap_devices=-1 Then MsgBox(0,"WinpCap_Err02","Impossible d'initialiser la liaison. Verifier votre installation de WinpCap")
	For $n = 0 to Ubound($pcap_devices)-1
		If StringInStr($pcap_devices[$n][1], "Microsoft") Then
			$int=$pcap_devices[$n][0]
			ExitLoop
		EndIf
	Next
	$pcap=_PcapStartCapture($int)
	If $pcap=-1 Then MsgBox(0,"WinpCap_Err03","Impossible d'initialiser la liaison. Verifier votre installation de WinpCap")
EndFunc

Cette fonction démarre WinPcap et choisis automatiquement l'interface nécessaire.


7. Je vous donne une belle fonction qui sert à attendre une ou plusieurs informations bien précise ce situant au début de la trame après les informations IP et Protocole. Copiez puis collez la dans votre projet, je vous explique son fonctionnement.
PHP:
Func SEARCH_Packet_OnLeft_Wait($SEARCH_Value,$SEARCH_Time=0,$Search_Verif="",$SEARCH_Value2="",$Search_Verif2="",$SEARCH_Value3="",$Search_Verif3="",$SEARCH_Value4="",$Search_Verif4="")
	Local $Arr_PackSearch[2]
	Local $Timer000001
	If $SEARCH_Time=0 Then
		$Timer000001=-1
	Else
		$Timer000001=TimerInit()
	EndIf
	While TimerDiff($Timer000001)<$SEARCH_Time
		$packet=_PcapGetPacket($pcap)
		If IsArray($packet) Then
			$src=Number(BinaryMid ($packet[3], 27 ,1))&"."&Number(BinaryMid ($packet[3], 28 ,1))&"."&Number(BinaryMid ($packet[3], 29 ,1))&"."&Number(BinaryMid ($packet[3], 30 ,1))
			If StringLeft($src,7)<>"192.168" And StringTrimLeft($packet[3],110)<>"" And StringLeft($src,7)<>"0.0.0.0" Then
				If StringLeft(StringTrimLeft($packet[3],110),StringLen($SEARCH_Value))=$SEARCH_Value Then
					If Not $Search_Verif="" Then
						If StringInStr(StringTrimLeft($packet[3],110),$Search_Verif) Then
							$Arr_PackSearch[0]=1
							$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
							Return $Arr_PackSearch
						EndIf
					Else
						$Arr_PackSearch[0]=1
						$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
						Return $Arr_PackSearch
					EndIf
				EndIf
				If $SEARCH_Value2<>"" And StringLeft(StringTrimLeft($packet[3],110),StringLen($SEARCH_Value2))=$SEARCH_Value2 Then
					If Not $Search_Verif2="" Then
						If StringInStr(StringTrimLeft($packet[3],110),$Search_Verif2) Then
							$Arr_PackSearch[0]=2
							$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
							Return $Arr_PackSearch
						EndIf
					Else
						$Arr_PackSearch[0]=2
						$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
						Return $Arr_PackSearch
					EndIf
				EndIf
				If $SEARCH_Value3<>"" And StringLeft(StringTrimLeft($packet[3],110),StringLen($SEARCH_Value3))=$SEARCH_Value3 Then
					If Not $Search_Verif3="" Then
						If StringInStr(StringTrimLeft($packet[3],110),$Search_Verif3) Then
							$Arr_PackSearch[0]=3
							$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
							Return $Arr_PackSearch
						EndIf
					Else
						$Arr_PackSearch[0]=3
						$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
						Return $Arr_PackSearch
					EndIf
				EndIf
				If $SEARCH_Value4<>"" And StringLeft(StringTrimLeft($packet[3],110),StringLen($SEARCH_Value4))=$SEARCH_Value4 Then
					If Not $Search_Verif4="" Then
						If StringInStr(StringTrimLeft($packet[3],110),$Search_Verif4) Then
							$Arr_PackSearch[0]=4
							$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
							Return $Arr_PackSearch
						EndIf
					Else
						$Arr_PackSearch[0]=4
						$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
						Return $Arr_PackSearch
					EndIf
				EndIf
			EndIf
		EndIf
	WEnd
	Return 0
EndFunc

Cette fonction vérifie dans un premier temps que la trame n'est pas une "envoyé" par notre machine.

Ensuite, elle découpe la trame après les information IP et protocole afin de redécouper encore une fois pour vérifier la présence de la valeur recherché.

La fonction répète ce processus autant de fois qu'il y a de valeur à chercher. (4 maxi)

En cas de succès, la fonction retourne la trame découpé après les information IP et Protocole.
En cas d'échec, elle retourne 0

Comment utiliser cette fonction ?

La syntaxe :
PHP:
SEARCH_Packet_OnLeft_Wait($SockID_0001,$Temp_Avant_Erreur,$Verif_Sock0001,$SockID_0002,$Verif_Sock0002)

Plus d'infos :
PHP:
$SockID_0001= "Première valeur à chercher"
$Temp_Avant_Erreur= "(optionnel) Temps avant que la fonction retourne 0."
$Verif_Sock0001= "(optionnel) Valeur à rechercher n'importe où dans la trame en cas de succès de $SockID_0001."
$SockID_0002= "(optionnel) Seconde valeur à chercher"
$Verif_Sock0002 "(optionnel) Valeur à rechercher n'importe où dans la trame en cas de succès de $SockID_0002."


Voici un exemple utilisable sur le jeux Dofus (2.x) qui attend le changement de carte.
PHP:
Global Const $SockID_0001="038"
Global $Result
While 1
	$Result=SEARCH_Packet_OnLeft_Wait($SockID_0001,15000)
	If $Result<>0 Then
		MsgBox(0,"Yahouuu !","Le changement de carte à été effectué !")
	EndIf
WEnd


8. Une fonction assez similaire à la précédente. Cet fonction recherche n'importe où dans une trame un valeur définie.
PHP:
Func SEARCH_Packet_ValueInPacket_Wait($SEARCH_Value,$SEARCH_Time=0,$SEARCH_Value2="",$SEARCH_Value3="",$SEARCH_Value4="")
	Local $Timer000001
	Local $Arr_PackSearch[2]
	If $SEARCH_Time=0 Then
		$Timer000001=-1
	Else
		$Timer000001=TimerInit()
	EndIf
	While TimerDiff($Timer000001)<$SEARCH_Time
		$packet=_PcapGetPacket($pcap)
		If IsArray($packet) Then
			$src=Number(BinaryMid ($packet[3], 27 ,1))&"."&Number(BinaryMid ($packet[3], 28 ,1))&"."&Number(BinaryMid ($packet[3], 29 ,1))&"."&Number(BinaryMid ($packet[3], 30 ,1))
			If StringLeft($src,7)<>"192.168" And StringTrimLeft($packet[3],110)<>"" And StringLeft($src,7)<>"0.0.0.0" Then
				If StringInStr(StringTrimLeft($packet[3],110),$SEARCH_Value) Then
					$Arr_PackSearch[0]=1
					$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
					Return $Arr_PackSearch
				EndIf
				If $SEARCH_Value2<>"" And StringInStr(StringTrimLeft($packet[3],110),$SEARCH_Value2) Then
					$Arr_PackSearch[0]=2
					$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
					Return $Arr_PackSearch
				EndIf
				If $SEARCH_Value3<>"" And StringInStr(StringTrimLeft($packet[3],110),$SEARCH_Value3) Then
					$Arr_PackSearch[0]=3
					$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
					Return $Arr_PackSearch
				EndIf
				If $SEARCH_Value4<>"" And StringInStr(StringTrimLeft($packet[3],110),$SEARCH_Value4) Then
					$Arr_PackSearch[0]=4
					$Arr_PackSearch[1]=StringTrimLeft($packet[3],110)
					Return $Arr_PackSearch
				EndIf
			EndIf
		EndIf
	WEnd
	Return 0
EndFunc

Comment utiliser cette fonction ?

La syntaxe :
PHP:
SEARCH_Packet_ValueInPacket_Wait($SockID_0001,$Temp_Avant_Erreur,$SockID_0002)

Plus d'infos :
PHP:
$SockID_0001= "Première valeur à chercher"
$Temp_Avant_Erreur= "(optionnel) Temps avant que la fonction retourne 0."
$SockID_0002= "(optionnel) Seconde valeur à chercher"


Voila ! Avec toutes ces belles lignes de code, vous devrez être prêt à faire des merveilles ... Avec vos modifications personnel bien sûre.

N'hésitez pas à poser des questions pour obtenir plus d'informations.

Bye Bye, et à la prochaine pour de nouvelle aventures !
 
Last edited:
Mar 30, 2011
1,014
1
944
In Your Ass
la ça parle de sniffing en faite . . . si tu veut de la gestion de socket tu peu regarder la par exemple

http://www.cheat-gam3.com/2-cours-p...tocole-irc-faire-un-chat-sur-votre-bot-23605/

ou juste l aide sur les commandes TCPxxx d autoit . . . .

Pour l'envoi de sockets, on verra ça plus tard car c'est plus complexe.
en faite tu envois un (ou des) paquet que tu forge, via un socket que tu créer . . . .

Nous verons donc ici, comment recevoir ces trames (Sockets) et les utiliser
la en l'occurrence tu ne reçois rien, tu les captures et "ces trames" et bien ce ne sont pas des sockets ....


Vous devez savoir lire aisément l'AutoIt pour continuer car vous devrez comprendre seul le fonctionnement des fonctions complexe !

c'est sur ça évite de tout mélanger


Ceci dit le post est intéressant ;)
 

Bit-X

V
Jan 11, 2012
703
1
924
Dans un livre
Discord
kolibry#8414
Merci de me reprendre car c'est vrai que moi même je ne savais pas trop comment m'exprimer. Je ferais les modifications dès que possible.

Cette méthode permet de faire un type de Bot Unique en son genre.
Chose que je ne risque pas de partager ...

Cela permet de faire un bot qui utilise les trames envoyé par dofus (donc 0 bug et libre de regarder un film^^) et de garder le côté 99% indetectable. Le 1% étant la façon d'utiliser un compte de jeux. Du style 24h /24 c'est pas bon du tout.

Après ceci dit, la conception du bot en lui même est bien plus complexe et demande un bon niveau en math selon les jeux. Pourquoi? Car il n'y a plus rien de visuel et que le bot continu à utiliser des clics ... Tu as bien compris que je parle d'isométrie ect...
 

Bit-X

V
Jan 11, 2012
703
1
924
Dans un livre
Discord
kolibry#8414
Heu .. non !
Je ne parle pas de programation iso ...
Je te parle math, donc des calculs utiles en rapport à l'isométrie.
 
Jan 6, 2010
1,308
0
942
Non loin de ce forum
Bien le bonsoir,

j'ai pu remarqué des choses intéressantes dans ce post, ainsi je vais faire part de mes réactions et aussi de mes questions, en espérant avoir de bonnes remontées.

Déjà première question, pourquoi utiliser WinCap ? Est-ce dans le but d'optimiser l'effet de réception, modification et transmission de paquets, où est-ce que c'est juste une habitude que tu as prise ?

Personnellement, je connais bien ce type de bot dont tu parles, et comprend ensuite pourquoi tu ne souhaites pas les partager. En même temps, comme tu l'as si bien dit, ils fiables s'ils sont bien fait, et extrêmement utiles, de là à utiliser son bot faisant tout un tas de chose, tout en regardant un film ou à glander sur Facebook, c'est vrai que ça fait rêver.

Je me suis lancé il y a très peu de temps dans un projet où l'on compte faire un bot proxy. Là je m'adresse aux personnes ne comprenant pas trop ce terme, il s'agit en fait de réceptionner les données transmises entre le client de jeu et le serveur, de façon à les modifier et donc, avoir un effet direct et indétectable (tant que c'est pas trop gros) sur le jeu. Ces données sont envoyés par tas, en général ce sont des fonctions complètes que l'on appelle "paquet" ou bien "trame". Bref, j'ai finis l'étape de la connexion, je peux me connecter au serveur et interagir avec tout et n'importe quoi normalement, sans pertes de données, et cela avec les fonctions natives d'AutoIt d'où ma question un peu plus haute. Là où ça va se corser c'est que mes paquets sont cryptés, et donc il me faut la clef de chiffrement et ensuite l'utilisé. Là c'est une autre histoire. Après, je pourrai arriver à l'étape suivante : élaborer une modification des paquets et ajout de fonctionnalités tranquillement.

Ce qui m'apporte à ma dernière question, qu'est-ce que les calculs isométriques ? Si tu pouvais me faire un bref résumé et à quoi ça sert dans la conception de ce genre de bot, ça serait sympa.

Merci d'avance !

PS : joli tutoriel !
 

cbourree

Nouveau membre
Feb 20, 2011
1
0
421
27
Bonjour,
voilà juste histoire de te dire merci, je suis loin d'être un expert en prog, mais après une dizaines d'heure à lire des tutoriels sur les sockets, etc et 3 heures sur ton code je commence à bien comprendre le fonctionnement de tout ça donc merci ^^
 
Last edited:

hashrif

Membre
Sep 9, 2015
25
0
21
28
C'est sympa de nous faire partager ces connaissances mais dans le cas ou les gens ici veulent crée des bot ,
tu va les démoralisé une fois qu'il auront compris qu'il ne peuvent pas faire de bot socket car autoit n'est pas multi-thread
 

Evaelis

La Voix de la Sagesse
V
Ancien staff
Apr 28, 2010
22,949
468
1,699
Valhalla
C'est sympa de nous faire partager ces connaissances mais dans le cas ou les gens ici veulent crée des bot ,
tu va les démoralisé une fois qu'il auront compris qu'il ne peuvent pas faire de bot socket car autoit n'est pas multi-thread
Tu peux en faire, mais c'est juste se faire chier quand tu peux utiliser du C# qui pour le coup est beaucoup plus facile a manipuler et qui t'offrira la possibilite de MT de maniere simple.
De base un gros bot en AutoIt je pense que t'es demoralise avant de commencer.
 

hashrif

Membre
Sep 9, 2015
25
0
21
28
Non , non et encore non :D (j'adore dire sa)
Il n'est pas possible de faire du multi-thread (au sens propre du terme) en autoit.
Quand à c# , c'est bien oui mais trop dépendant c'est pourquoi dans le cas ou je souhaiterais faire un bot (bientôt peut être ),
je me dirigerez plutôt vers Java , enfin les raison sont multiple :D
Après pour les débutant ne vous laissez pas intimidé par le tutoriel sur openclassrooms ,
il est assez complet pour de très bonne base, même les thread sont abordé ,
je pense que c'est le mieux pour commencer même pour continuer si vous aimez bien?
(petite pensez a xvolks qui ma beaucoup inspiré dans mon apprentissage)
 

TheHardButcher

Programmeur C/C++
V
Dec 14, 2009
1,461
58
964
France
Non , non et encore non :D (j'adore dire sa)
Il n'est pas possible de faire du multi-thread (au sens propre du terme) en autoit.
Quand à c# , c'est bien oui mais trop dépendant c'est pourquoi dans le cas ou je souhaiterais faire un bot (bientôt peut être ),
je me dirigerez plutôt vers Java , enfin les raison sont multiple :D
Après pour les débutant ne vous laissez pas intimidé par le tutoriel sur openclassrooms ,
il est assez complet pour de très bonne base, même les thread sont abordé ,
je pense que c'est le mieux pour commencer même pour continuer si vous aimez bien?
(petite pensez a xvolks qui ma beaucoup inspiré dans mon apprentissage)

LOL.

Tu ose critiquer des langages, certes, mais tu choisis le JAVA ? Genre LE langage le moins bien conçu de l'histoire de l'informatique ? (bon d'accord, surtout le moins bien conçu de ce qui est tout de même beaucoup utilisé ^^)

Tout d'abord, AutoIt permet de faire des thread. AutoIt permet de faire tout pour une seul raison (qui est la même que le C et autre hein) :
Tu peux écrire du code assembleur dans ton code.
Donc potentiellement, tu peux faire ce que tu veux :)

En plus de ça il existe des manières détourné (donc c'est vrai, pas au sens propre du terme) de faire des thread en AutoIt de façon assezsimple.


Concernant le C#, oui, c'est vrai, niveau portabilité on a vu mieux, mais il faut savoir que c'est pas si mal, on peut exécuter pas mal de C# sur Unix, et c'est en constante avancement ^^


Donc pour revenir a ton premier message :

C'est sympa de nous faire partager ces connaissances mais dans le cas ou les gens ici veulent crée des bot ,
tu va les démoralisé une fois qu'il auront compris qu'il ne peuvent pas faire de bot socket car autoit n'est pas multi-thread

Bah si, on peut tout à fait créer un bot socket au AutoIt, c'est juste que c'est clairement pas adapté.

Ah, et surtout, n'ai pas l'impression que j'ai voulut t’engueuler ou autre hein, c'est juste que j'ai raison et que tu as tort #LesChevilles ;)
 

hashrif

Membre
Sep 9, 2015
25
0
21
28
Et moi je te dit qu'en autoit propre (pas de c ou asm) il est impossible de faire des thread ,
j'ai penchez sur le sujet il y à quelque année et faire un vrai programme multi-thread (et non plusieurs executable) ,
c'est impossible en autoit. Certes il y à surement divers méthode via le c de faire du multi-thread mais c'est un tout autre langage.
Concernant t'es critique sur java , j'avais les même avant même de connaître le langage mais c'est un langage fabuleux extrêmement simple à maitriser(Si vous n'estes pas fâché avec la POO bien sûr ).
J'aurais pu citer c/c++ mais naturellement plus difficile à apprivoiser , donc beaucoup moins productif.
Bien entendu si on compare un programme C++/java , il est certain que celui en c++ sera plus performant et plus probable qu'il y est de vague erreur concernant l'utilisation de la mémoire.
Développant ou presque (car c'est pas productif) en C , je sais de quoi je parle !
D'ailleurs j'ai commencé par se language et une fois que l'on veut crée des application ,
qu'on cherche dans les libs et qu'on tombe sur des structures et pointeurs partout , sa pique les yeux.
C'est pourquoi je reste sur que le Java est le meilleur language pour débuté si tu veux un programme qui fonctionne sur chaque OS sans problème, ou même pour faire des appli android.
Bien entendu C# est tout à fait plus clair & propre que le java , avec aussi un excellent débugger !
L'inconvénient ici , c'est que c'est du produit fait par Microsoft et à la base pour windows.
N'étant pas du tout ami avec le système windows il est evident que mon choix se porte sur java.