Autoit Création d'un bot socket

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#1
Salut à tous !

Je me mets à la création d'un bot socket en AutoIt.
J'ai réussi à parser, etc, mais maintenant je bloque sur l'id 3.

Je m'explique. En regardant les sources, je vois :

Code:
        public function deserializeAs_HelloConnectMessage(param1:IDataInput) : void
        {
            var _loc_4:int = 0;
            this.salt = param1.readUTF();
            var _loc_2:* = param1.readUnsignedShort();
            var _loc_3:uint = 0;
            while (_loc_3 < _loc_2)
            {
                
                _loc_4 = param1.readByte();
                this.key.push(_loc_4);
                _loc_3 = _loc_3 + 1;
            }
            return;
        }// end function

Alors je me dis "Parfait ! Si j'arrive à déserializer ce qu'il m'envoie, je pourrai faire la suite". Seulement, je ne comprends pas le

Code:
this.salt = param1.readUTF();
ainsi que :

Code:
var _loc_2:* = param1.readUnsignedShort();
A ce que j'ai pu comprendre, lorsqu'on fait un readShort, en réalité il prend les deux premiers octets. Dans ce cas, que veut dire ce readUTF?

J'ai donc cherché sur les sources OverEdge, et je vois :

Code:
        Public Function ReadUTF()
            Return ReadString()
        End Function

        Public Overrides Function ReadString() As String
            Dim ByteArray() As Byte = MyBase.ReadBytes(ReadUInt16())
            Return System.Text.Encoding.UTF8.GetString(ByteArray)
        End Function

Et là, le grand vide dans ma tête !
Que dois-je récupérer lorsque je fais un ReadUTF(), en fait?

J'avais suivi un tuto sur ce forum pour démarrer et comprendre le protocole D.2, et comme je disais, j'ai réussi à faire quelques petites choses, comme par exemple :

Code:
        $hiheader = StringLeft($data, 4)
	$hiheader = Dec($hiheader)

	$packet_id = BitShift($hiheader, 2)
	$lenType = BitAND($hiheader, 3)

Alors on ne peut pas dire que je ne cherche pas ! :).

Voilà, merci à tous ;)

EDIT : Finalement, je pense avoir compris ces ReadUTF() et compagnie...

Dites-moi, si j'obtiens (pour le deserializeAs_HelloConnectMessage()) :

- Comme salt : 0x30303032 (dois-je enlever le 0x ? Et j'ai TOUJOURS ce 30303032, il ne varie jamais, contrairement à la key)
- Et comme key : 020683177717462706E7E78567B6D4E3D61535, toujours 19 Bytes, et qui commence toujours avec 02

c'est possible que ce soit correct, non?

Si c'est le cas, pourriez-vous me donner des pistes pour le cryptage RSA sur AutoIt..? Je sais que ce sera dur m'enfin :).

(Si besoin est, je peux vous donner mes fonctions ReadUTF etc)
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#2
pour utf il faut lire 2 octets qui te donneront la taille de la chaine , par exemple 00 08 ca te donnera une chaine de 8 caracteres , les 8 caracteres seront les 8 octets qui suivront les 2 de la taille
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#3
Euh... Tu en es sûr?
Sur OverEdge j'ai :

Code:
        Public Function ReadUTF()
            Return ReadString()
        End Function

        Public Overrides Function ReadString() As String
            Dim ByteArray() As Byte = MyBase.ReadBytes(ReadUInt16())
            Return System.Text.Encoding.UTF8.GetString(ByteArray)
        End Function
Et donc chez moi :

Code:
Func ReadString()
	Dim $ByteArray = ReadBytes(ReadUInt16())
	$return = UTF8(GetString($ByteArray))
	ConsoleWrite("ReadString => " & $return & @CR)
	Return $return
EndFunc
Ce que tu me dis, j'ai l'impression que c'est un ReadUInt16(), qui me donne juste le message. Ce qui est pas utile...
J'ai déjà réussi à parser. A récupérer l'id ainsi que le lenType et le length par la même occasion. Je l'ai dis dans mon post.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#4
oui j'en suis sur la source que tu cites c'est moi qui l'a ecrite , le uint16 (2 octets) sert a savoir la longueur de la chaine puis apres tu lis le nombre d'octets que uint16 te donne et ca sera ca la chaine

donne moi le paquet complet (en octets) que tu recuperes via le socket (sans parser ni rien) et je te montre en couleurs
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#5
Y'a qqch que j'ai pas pigé dans ce que tu me dis alors. Tu expliques ce qu'il faut passer à ReadUTF() là?
Je crois que je suis beaucoup trop perdu dans tous ces codes là...
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#6
La conversion est vraiment trop difficile...
J'essaie de voir la définition du ReadBytes, et je vois
Lit le nombre d'octets spécifié à partir du flux actuel dans un tableau d'octets et avance la position actuelle de ce nombre d'octets.
Mais WTF? J'comprends rien ! Ca veut dire quoi "avance la position actuelle de ce nombre d'octets"? Quelle position actuelle? Le nombre d'octets, c'est celui passé en paramètre?
J'suis perdu...

EDIT : A la base, ces fonctions travaillent sur quoi exactement? Parce qu'on ne leur envoie jamais aucun paramètre ! Du genre ReadInt(), ok mais ReadInt(de quoi?)?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#7
ca travail sur un stream des octets recus , on vas dire que tu recois 00 01 02 03 04 05 ... , au depart tu es sur 00 ,
tu fais un readbytes(2) par exemple, ca va te renvoyer 00 01 puis ca va se positionner 2 octets plus loin donc sur 02 ,
tu refais un readbytes(3) ca renverra 02 03 04 puis ca se positionnera 3 octets plus loin donc sur 05 etc ...

pour un utf on va dire que tu as un readutf et que tu es sur (xx xx xx ca c'est deja lu ca contient dans ton cas l'id , lenType et le length , en fait le header du message) puis tu as 00 05 54 6F 6F 6E 73 06 07 ...
donc il faut lire 2 octets donc readbytes(2) pour connaitre la longueur de la chaine a lire : 00 05 -> 5 de longueur
donc on lit les 5 suivants donc reaadbytes(5) qui sont 54 6F 6F 6E 73 <-- donc ca c'est la chaine (en hexa)
puis en caracteres : http://www.asciitable.com/ ca donne au final : Toons (54 = T , 6F = o , 6E = n , 73 = s)
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#8
Donc, sur un paquet qui ressemble à ça, on aurait :

00 05 08 00 00 05 A4 00 00 05 A4
ID + LenType Length (puisque lenType = 1) Message

Et si j'ai bien compris, sur ce que ReadInt(), ReadUInt16() etc travaillent, c'est la partie Message?

Et si je fais donc, sur cette partie message, un ReadBytes(2), on commence sur l'octet 00, et on aura 00 00.
Puis, un ReadBytes(1) commencera à 05, et renverra 05.
Finalement un ReadBytes(5) commencera à A4, et contiendra A4 00 00 05 A4.

Est-ce correct?

Et ReadUInt16() fonctionne-t-il de la même manière?
Aussi, est-ce qu'il recommence de 00 ou bien de la dernière position connue?

Merci de ton aide ToOnS :)
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#9
Super, merci de cette info ! Je ne récupérais pas mon message de cette manière moi :).
Mais tu peux répondre à mes questions ci-dessus s'te plaît?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#10
Code:
Et si j'ai bien compris, sur ce que ReadInt(), ReadUInt16() etc travaillent, c'est la partie Message?
ca travail sur tout le paquet recu , mais dans mon post precedent je suposais que tu avais deja lu 00 05 08 (c'est mes xx xx xx) , donc que tu es possitioné sur 00 (le 2iem 00 de 00 05 08 00) , ca c'est a toi de voire comment te positionner apres le header , tu as compris deja comment le header marche puisque tu lis ID + LenType Length (puisque lenType = 1) ca devrait etre facile de te positionner au depart du message

une fois que tu es au depart du message alors oui ca c'est correct :
Et si je fais donc, sur cette partie message, un ReadBytes(2), on commence sur l'octet 00, et on aura 00 00.
Puis, un ReadBytes(1) commencera à 05, et renverra 05.
Finalement un ReadBytes(5) commencera à A4, et contiendra A4 00 00 05 A4.

Est-ce correct?
pour ReadUInt16() ca fonctionne pareil c'est en realité un ReadBytes(2)
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#11
Ok c'est parfait.
Mais ce que je voulais savoir, c'est si la dernière position connue retenue est celle sur laquelle tous les ReadXX() travailleront ou bien s'ils sont complètement indépendants les uns des autres?

Par exemple, si j'ai :

00 00 05 A4 00 00 05 A4

Puis que je fais ReadBytes(2) (et donc d'après ce que tu viens de me dire un ReadUInt16()), ça me sort 00 00.
La suite est donc :

05 A4 00 00 05 A4

Mais est-ce que ceci est la suite seulement pour le ReadBytes ou bien pour tous les autres ReadXX()?

EDIT : Comment j'ai pu oublier ! Merci énormément !! Tu m'éclaires comme jamais ! C'est super de savoir tout ça :). Merci ;)
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#12
Et par conséquent, si je fais sur le paquet :

00 00 05 A4 00 00 05 A4

un ReadBytes(2), suivi d'un ReadUInt16(), et un ReadBytes(4), et que je tente un ReadByte(), ça devrait me retourner une erreur, je me trompte?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#13
heu oui ca va donner ca :
00 00 05 A4 00 00 05 A4
un ReadBytes(2), suivi d'un ReadUInt16(), et un ReadBytes(4), et que je tente un ReadByte() -> erreur , plus rien a lire
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#14
Wahou... Super, j'ai compris! :D.
Un grand merci à toi ToOnS. Ainsi, je devrai recréer TOUTES mes fonctions :D.

Et ce ReadUTF(), en fait, il me retourne ce que j'ai appelé tout à l'heure Message? Et il l'encode ou bien quoi?
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#15
Si c'est le cas, alors ReadUTF() = ReadBytes($length), j'ai tort?
Parce que si c'est ça, alors ça voudrait dire qu'après un ReadUTF(), on peut plus rien faire...

Ou bien, c'est un ReadBytes($length) qui ne se positionne pas après?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#16
readutf c'est ca :
00 05 54 6F 6F 6E 73 06 07
taille=ReadUInt16() , chaine en hexa = ReadBytes(taille) , rien ne t'empeche apres de lire 06 07
en basic c'est compressé comme ca : ReadBytes(ReadUInt16())

bon apres il faut convertire chaine en hexa (en realité le tableau d'hexa) en chaine de caracteres , et ca je sais pas faire en autoit
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#17
Donc ReadUTF() retourne la taille du packet + le contenu correspondant? D'accord.

Là je bloque en revanche. Apparemment, ReadBytes() prend comme paramètre un nombre, on est d'accord? Dans ce cas, je ne comprends pas :

ReadBytes(ReadUInt16())

ReadUInt16(), ça retourne pas, par exemple 546F ?
Parce que si c'est le cas, ReadBytes n'obtient pas un nombre mais deux octets...
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#18
oupsss j'ai edité trop tard , en fait je reedite avec les couleurs
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#19
:o Tu vas pas me dire que tous ces ReadUInt16(), ReadBytes(x), ReadByte(), etc, retournent des nombres décimaux?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#20
en autoit je sais pas , en basic si (comme l'autoit c'est du basic deguisé je pense que oui)
 
Haut Bas