31 votes

Comment puis-je inverser un protocole réseau (Metatrader 4)?

J'ai besoin de désosser le Metatrader 4 du protocole réseau. MT4 Serveur n'a pas besoin d'une API et j'ai trouvé zéro de la documentation à propos de son protocole.

Des idées sur où je peux commencer?

Je n'ai jamais fait ce type de travail avant, mais je sais que c'est faisable. Quelqu'un l'a déjà fait et a développé une API propriétaire de la bibliothèque pour parler d'avant en arrière avec n'importe quel serveur MT4.

Mon plan est de l'opensource un MT4-API python de la bibliothèque qui peut être utilisé sans avoir à exécuter un client metatrader à tous (MT4 Conseillers Experts ne sont pas une option).

19voto

Malte Points 930

En fait, il en est un (officiel) MT4 Serveur de l'API. Il se compose d'une .le fichier dll avec un exemple de code en C++ et Delphi. L' .dll expose les fonctions de connexion, de passer des commandes, obtenir votre bilan, etc.

Vous n'avez pas besoin de MetaTrader installé, mais seulement que .dll-fichier.

Malheureusement, la documentation de l'API est pratiquement inexistant. Parfois, le code source n'est commenté en russe. Apparemment, une partie de la documentation est disponible dans un soutien spécial de la zone sur MetaQuote site internet, mais cela nécessite un login et vous obtiendrez seulement si vous avez acheté une licence serveur MT4 (je n'en ai pas).

Maintenant pour répondre à votre question initiale: Si vous voulez à la rétro-ingénierie du protocole que vous avez certainement besoin de démonter le binaire et ont un oeil sur le code. La communication est brouillée par un inconnu algorithme.

Ce que j'ai trouvé jusqu'à présent:

  • Bien qu'ils soient d'utiliser le port 443 pour la communication, ils ne sont pas à l'aide de SSL ou même en HTTPS. Si vous regardez capturé le trafic on dirait parfois qu'ils sont à l'aide de 16 octets taille de bloc sans cbc. (Vous pouvez facilement repérer les modèles qui répètent toutes les 16 octets avec de légères différences).

  • Le Transport est tout simplement TCP, vous pouvez diffuser de multiples commandes avec une connexion jusqu'à ce que vous avez terminé.

  • Commandes (avant le chiffrement) sont lisibles ASCII-textes fini avec un saut de ligne (\n)

  • La connexion est correctement terminée par l'envoi d' QUIT\n

  • Le premier octet après l'ouverture de la connexion spécifie le mode de protocole. Les valeurs possibles sont (au moins) W, Z pour le texte clair ou 0x0 pour le transport chiffré.

Début d'une connexion avec W lance le "Service Web"-mode. Vous pouvez recevoir au moins un devis et une liste de symboles avec qui. Vous pouvez facilement essayer avec telnet:

$ telnet 216.93.169.220 443
Essayer 216.93.169.220...
Connecté à 216.93.169.220.
Caractère d'échappement '^]'.

WINFO

MetaTrader Serveur 4.00 construire 391
Ava Financial Ltd.

QUOTES-EURUSD,EURGBP,

jusqu'EURUSD 1.4105 1.4106 2011.03.24 02:02:49
en bas de l'EURGBP 0.8673 0.8675 2011.03.24 02:02:41
2011.03.24 02:02:49

LIST

CONFIRMLISTS-EURUSDEURGBPAms.AEGNAms.AHLNAms.AKZOAms.ASMLAms.BAMNAms.BOSNAms.CORAms.DSMNAms.ELSNAms.FUGRcAms.HEINAms.INGAms.ISPAAms.KPNAms.PHGAms.RANDAms.RDSaAms.SBMOAms.TNTAms.TOM2Ams.UNcAms.WEHAAms.WLSNcCBOT.WFft.BMWGFft.VOWGHel.NOK1VLSE.AALLSE.ABFLSE.ADMLLSE.AMECLSE.ANTOLSE.AUTNLSE.AVLSE.AZNLSE.BAESLSE.BALFLSE.BARCLSE.BATSLSE.BAYLSE.BGLSE.BLTLSE.BNZLLSE.BPLSE.BSYLSE.BTLSE.CCLLSE.CNALSE.CNELSE.COBLSE.CPGLSE.CPILSE.CWLSE.DGELSE.ENRCLSE.EXPNLSE.FRCLLSE.FRESLSE.GFSLSE.GSKLSE.HOMELSE.HSBALSE.IAPLSE.IHGLSE.IIILSE.IMTLSE.IPRLSE.ISALSE.ISYSLSE.ITRKLSE.JMATLSE.KAZLSE.KGFLSE.LGENLSE.LMILSE.LSELSE.MKSLSE.MRWLSE.NGLSE.NXTLSE.OMLLSE.PFCLSE.PNNLSE.PRULSE.PSONLSE.RBLSE.RDSaLSE.RDSbLSE.RELLSE.REXLSE.RIOLSE.RRLSE.RRSLSE.RSALSE.SABLSE.SBRYLSE.SGELSE.SHPLSE.SLLSE.SMINLSE.SNLSE.SRPLSE.SSELSE.STANLSE.SVTLSE.TCGLSE.TLWLSE.TSCOLSE.TTLSE.ULVRLSE.UULSE.VEDLSE.VODLSE.WOSLSE.WPPLSE.XTAMad.ABEMad.ABGMad.ACSMad.ACXMad.ANAMad.BB

QUIT

Connection closed by foreign host.

Le texte en gras est ce que j'ai tapé dans la session telnet. Z au lieu de W travaille également pour le INFO commande.

Notez que vous avez à la fin de la liste des symboles pour l' QUOTES commande avec une virgule. L' QUOTES commande semble être pas disponibles dans les versions antérieures à 391 (trouvé beaucoup de serveurs exécutant construire 344).

Je sais à propos de l' QUOTES commande (et le W) directement à partir de la documentation, vu l' INFO commande en sniffant le client MT4 et a découvert LIST juste en essayant de certains mots-clés. Laissez-moi savoir si vous trouvez plus. Il devrait y avoir au moins une commande pour recevoir les barres, pour les graphiques.

Je sais que ce n'est pas une bonne réponse à votre question, mais je pense que cette info est pertinente pour beaucoup de gens, pour un point de départ, et il a trop de texte pour un commentaire.

8voto

Andrew Keith Points 5627

ce n'est pas trop dur. Vous devez juste être très méthodologique. Vous aurez besoin de wirehark pour renifler les paquets. Il suffit de parcourir toutes les fonctionnalités du client metatrader et de capturer tous les paquets. Comparez ensuite les données utiles pour trouver des similitudes.

J'interroge souvent les protocoles d'ingénierie inverse lorsqu'il n'y a pas suffisamment de documentation expliquant les fonctionnalités avancées.

6voto

lyricat Points 1480

Plus robuste que l'utilisation de WireShark pour simplement visualiser le trafic réseau, vous pouvez injecter une DLL dans l'application cible et crochet de toutes les activités du réseau. Cela implique de la correction du SIA (Import Address Table) avec l'un de vos fonctions, qui correspond à la signature de la fonction cible. Dans votre fonction, vous pouvez vous connecter/traiter/analyser/quel que soit le réseau de données, puis de le transférer à la fonction correcte.

Vous pouvez trouver une description de ce processus ici: http://www.codeproject.com/KB/DLL/DLL%5FInjection%5Ftutorial.aspx

4voto

fastcall Points 874

Si le protocole n'est pas crypté, vous pouvez utiliser des programmes comme WireShark (anciennement Ethereal) ou Moniteur Réseau Microsoft pour le suivi de vos messages entrants et sortants.

Ensuite, essayez d'effectuer les différentes opérations et de voir comment leurs paquets de comparer. Une autre bonne stratégie est d'essayer la même opération plusieurs fois avec des modifications mineures pour voir comment il modifie les paquets.

Si le protocole est crypté (surtout si c'est un protocole de chiffrement propriétaire), il va être beaucoup plus difficile. Vous auriez besoin d'utiliser beaucoup plus sophistiqués de l'ingénierie inverse des outils comme IDA Pro pour déterminer où le support de données est de venir de l'avant c'est crypté.

Bonne chance! Le Reverse engineering est une compétence rare, mais il peut être amusant.

3voto

mrduclaw Points 1917

À l'aide de Wireshark, comme d'autres l'ont tous prêt a suggéré, est certainement un excellent endroit pour commencer. Et dans de nombreux cas, si l'application est petite et assez simple, il sera tout ce que vous avez besoin.

Si la demande est le chiffrement du trafic, ou tout simplement faire quelque chose d'un peu étrange, il pourrait être utile de joindre à elle avec un débogueur et un set break-points sur l'Api de réseau. Le livre de Reverse Engineering de Code Avec IDA Pro a une grande section de le faire, si je me souviens bien. Il vous aide également à briser quelques simples applications de réseau comme Yahoo! Messenger pour obtenir une sensation pour ce genre de travail.

Vraiment, être méthodique est la clé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X