2009-10-13 3 views
5

On m'a demandé de traiter des fichiers sérialisés comme des objets binaires (pas de texte/JSON malheureusement) Thrift, mais je n'ai pas accès au programme ou au programmeur qui a créé les fichiers, donc je n'ai aucune idée de leur structure, Ordre des champs, etc. Est-il possible d'utiliser les bibliothèques Thrift pour ouvrir un fichier binaire et l'analyser, obtenir une liste des types de champs, des valeurs, des imbrications, etc.?Comment pouvez-vous effectuer l'ingénierie inverse d'un fichier d'épargne binaire?

+0

Je suppose que vous parlez de http://incubator.apache.org/thrift/ - vous voudrez peut-être publier/marquer la langue que vous utilisez. – TrueWill

Répondre

7

Malheureusement, il semble que le protocole binaire de Thrift n'effectue pas beaucoup de balisage de données; Pour décoder, il semble supposer que vous avez le fichier .thrift en main, donc vous savez, disons, que les 4 octets suivants sont censés être des entiers, et ne sont pas en fait la première moitié d'un float. Donc, il semble que vous êtes bloqué avec, fondamentalement, en regardant les fichiers dans un éditeur hexadécimal (ou équivalent) et en essayant de déduire des champs en fonction des modèles exacts que vous voyez.

Il y a très peu de bits utiles:

Chaque fichier commence par une version, chaîne d'identification de protocole, et le numéro de séquence. Les cartes commencent par 6 octets qui identifient les types de clé et de valeur (les deux premiers octets, en tant que codes entiers) plus le nombre d'éléments sous la forme d'un entier de 4 octets. Les codes de type semblent être standard (l'emplacement canonique de leurs définitions semble être TProtocol.h dans les sources Thrift, par exemple une valeur booléenne est spécifiée par le type code 2, UTF-8 chaîne par le type code 16, et ainsi de suite) . Les chaînes sont préfixées par un champ de longueur entière de 4 octets, et les listes sont préfixées par le type (1 octet) et une longueur de 4 octets. Il semble que tous les champs entiers soient enregistrés en big-endian, et les points flottants sont sauvegardés au format IEEE (ce qui devrait rendre les doubles relativement faciles à trouver, au moins).

Les fichiers TBinaryProtocol * dans Thrift contiennent d'autres informations utiles; Sur le plan positif, il existe un certain nombre d'implémentations différentes afin que vous puissiez lire celles qui sont implémentées dans la langue avec laquelle vous êtes le plus à l'aise.

Désolé, je sais que ce n'est probablement pas très utile, mais il semble vraiment que ce soit toutes les informations que le format binaire Thrift fournit; Il est clair que le format binaire a été conçu avec l'intention que vous connaissiez toujours la spécification exacte du protocole, et que le but était de minimiser l'espace de câblage, plutôt que de le rendre facilement décodable à l'aveugle.

Questions connexes