2009-10-13 1 views
5

私はバイナリ(テキスト/ JSONではなく残念ながら)Thriftオブジェクトとしてシリアル化されたファイルを処理するよう依頼されましたが、プログラムやプログラマにアクセスできませんので、フィールドの順序などがあります。バイナリファイルを開き、フィールドタイプ、値、ネストなどのリストを取得するために、Thriftライブラリを使用する方法はありますか?バイナリスリフトファイルをリバースエンジニアリングする方法はありますか?

+0

私は、あなたがhttp://incubator.apache.org/thrift/について話していると仮定しています。あなたが使っている言語を投稿/タグしたいかもしれません。 – TrueWill

答えて

7

残念ながら、Thriftのバイナリプロトコルではデータのタグ付けはあまり行われません。それを解読するためには、あなたが手持ちの.thriftファイルを持っていると仮定して、次の4バイトが整数であり、実際には浮動小数点の最初の半分ではないことを知っているように見えます。だから、基本的には、16進エディタ(または同等のもの)のファイルを見て、あなたが見ている正確なパターンに基づいてフィールドを推測しようとしているようです。

は非常にいくつかの有用ビットがあります。

各ファイルは、バージョン、プロトコル識別子の文字列、およびシーケンス番号で始まります。マップは、キーと値のタイプ(最初の2バイト、整数コード)と要素数を4バイト整数で識別する6バイトで始まります。型コードは標準であるように見えます(定義の標準的な位置は、ThriftソースのTProtocol.hと思われます。たとえば、型コード2でブール値が指定され、型コード16でUTF-8文字列などが指定されます) 。文字列の先頭には4バイトの整数長フィールドがあり、リストにはタイプ(1バイト)と4バイト長の接頭辞が付きます。すべての整数フィールドはビッグエンディアンで保存され、浮動小数点はIEEEフォーマットで保存されるように見えます(これにより、double型は比較的簡単に見つかるはずです)。

ThriftのTBinaryProtocol *ファイルには、さらに役立つ情報がいくつかあります。プラスの面では、さまざまな実装が存在するため、最も快適な言語で実装された実装を読むことができます。

申し訳ありませんが、おそらくこれは役に立たないと思いますが、これはThriftバイナリ形式のすべての情報です。はっきりとバイナリ形式は、あなたが常に正確なプロトコル仕様を知っていることを意図して設計されており、盲目的に解読するのを簡単にするのではなく、ワイヤスペースを最小限に抑えることが目的でした。

関連する問題