2

多くの場合、データは、ドキュメントがほとんどまたはまったくないプログラム固有のバイナリファイルに保存されます。私たちの分野の典型的な例は、機器からのデータですが、問題は一般的なものだと思います。データを理解して解釈しようとするためにどのような方法がありますか?

いくつかの境界を設定します。ファイルは暗号化されておらず、DRMもありません。ファイルのタイプと形式は、プログラムの作成者に固有です(つまり、IDが失われた* .tarなどの「標準ファイル」ではありません)。(おそらく)意図的な難読化はありませんが、スペースを節約するためのアマチュアの努力があるかもしれません。データが何であるかについての一般的な知識があり、フィールドと配列の一部(おそらくすべてではない)を認識できると想定できます。

データの大部分が数値であり、スカラーと配列(おそらく1次元と2次元、場合によっては不規則または三角形)であると想定します。いくつかの文字列、おそらく人の名前、サイト、日付、そしておそらくいくつかのキーワードもあります。バイナリファイルを読み取るプログラムにコードがありますが、ソースまたはアセンブラにアクセスできません。例として、VAX Fortranプログラム、初期のUnix、またはWindowsによってOLEオブジェクトとして記述されている場合があります。数値はビッグエンディアンまたはリトルエンディアン(最初は不明)の場合がありますが、おそらく一貫しています。マシン(Crayなど)によってバージョンが異なる場合があります。

かなり大きなファイルのコーパスがあると想定できます。たとえば、数百になります。

2つのシナリオを想定できます。

  1. さまざまな入力を使用してプログラムを再実行できるため、実験を行うことができます。
  2. プログラムを再実行することはできません。固定されたドキュメントのセットがあります。これは、未知の言語(線文字Bなど)での歴史的文書のデコードと穏やかに類似しています。

部分的な解決策は受け入れられるかもしれません-すなわち、生きている人が今理解していないいくつかの分野があるかもしれませんが、他のほとんどは解釈可能です。

私はオープンソースのアプローチにのみ興味があります。

更新関連するSOの質問(互換性の目的でバイナリファイル形式をリバースエンジニアリングする方法)がありますが、強調は多少異なります。 @brianeggeからアドレス(1)への巧妙な提案を更新します。プログラム内のすべてのwrite()および同様の呼び出しをダンプするためにtruss(またはおそらくLinuxで)使用します。straceこれにより、少なくともディスクに書き込まれたレコードのコレクションが可能になります。

4

5 に答える 5

2

トラスを提供するシステムを使用している場合は、システムコールの書き込みを監視するだけで、おそらく良いアイデアが得られます。プログラムがファイルをmmapしてメモリから直接コピーする可能性もありますが、それはあまり一般的ではありません。

$ truss -t write echo foo
foowrite(1, " f o o", 3)                                = 3
write(1, "\n", 1)                               = 1

バイナリを確認することも理にかなっています。Unixシステムでは、objdumpを使用してバイナリのレイアウトを表示できます。これは、コードセクションとデータセクションを指します。次に、バイナリが16進エディタであるを開き、特定のオフセットに移動できます。Solarisバイナリファイルに関する私のヒントに興味があるかもしれません。

于 2009-11-26T07:18:00.827 に答える
2

すべてのファイルにヘッダーがあります。そこから始めて、2つのファイルの類似点を確認し、一般的な「署名」を削除して、相違点を処理します。レコード数、エクスポート日などをマークする必要があります。

2つのヘッダー間の共通部分は、一般的な署名と見なされる可能性があり、無視してかまいません。

于 2009-11-26T09:21:18.643 に答える
1
  • 2つ以上のファイルを比較して類似点を探します。これは多くの場合、ヘッダーブロックとファイルのさまざまなセクションを識別するのに役立ちます。

  • エンディアンは通常、非常に簡単に解決できます。重要度の高いバイトは、重要度の低いバイトよりも多くの場合ゼロになる傾向があるため、「0078」や「7800」のようなパターンが表示された場合は、次のように推測できます。どのバイトがmsbです。ただし、これは、前のデータが何であるかを(大まかに)理解して、データがどのように整列されているかを理解している場合にのみ役立ちます。

  • 簡単に識別できるデータを探します。文字列は簡単に見つけることができるため、最初に開始します。これらは通常、関連データの近くに埋め込まれ、ヘッダーなどの標準アイテムとして使用されるため、手がかりを与えることがよくあります。文字列がユニコードの場合、通常、テキストの文字が0バイトで区切られているので、エンディアンを識別するのに役立ちます。 、およびデータ内のそのポイントでのデータアライメント。

  • 一般的な形式のアプローチ(IFFなど)は、それぞれが小さなヘッダーを持つデータのチャンクを格納することです(たとえば、2または4バイトのID、次にブロックの2または4バイトのサイズ、次にブロックのデータ)。一般に、人々は意味のある(彼らにとって)チャンクIDを使用するので、簡単に見つけることができます-タグのように見えるものを見つけたら、次のデータをチェックして、長さのように見えるかどうかを確認します(データのバイト数を確認してください)別のヘッダーがあるように見えるかどうかを確認します)。このような形式を特定できれば、「1つの大きなファイル」の問題を「多くの小さなファイル」の問題に分解できるため、はるかに簡単になります。(ただし、多くのデバイスデータは、コンパクトにするために「最適化」される傾向があります。その場合、プログラマーは便利な拡張可能な形式を破棄し、すべてをまとめて詰め込むことがよくあります。

  • 既知の値を探します。デバイスに「温度:40」が表示されている場合は、その値がファイルに直接保存されている可能性があります。(スケーリング係数または固定小数点値を使用することも一般的であるため、40は(たとえば)40 * 10=400または40*256 = 10240として表される場合があります)

  • デバイスを十分に制御できる場合:いくつかの単純なファイルを作成します。達成しようとしているのは、調査する必要のあるデータを最小限に抑えるためにデバイスから取得できる最小のファイルです。次に、ファイルを変更するデバイスに変更を加え、変更の数を最小限に抑えて、ファイルを再度取得します。ファイル形式が「オープン」(圧縮または暗号化されていない)の場合、変更されたバイトを識別できるはずです。

  • ファイルをデバイスに「ロード」して戻すことができる場合は、独自のファイルを作成することもできます。1つの値を変更するだけで、デバイスの動作の変化に気付くことができるかどうかを確認できます。単純な値をヒットすることができれば、これはうまくいく可能性がありますが、多くの場合、ファイル形式を壊すだけで、デバイスはそれらのデータをまったく読み取ることができなくなります。

于 2011-12-07T07:49:18.440 に答える
0

パターンを作成したり、さまざまなエンディアンを試したりできる魔法のユーティリティがあることを期待していました。しかし、そうではないようです。

于 2009-12-18T19:18:34.927 に答える
0

これは興味深い質問です。答えは、バイナリ形式のリバースエンジニアリングは習得したスキルであると思いますが、役立つツールがあります。

1つのツールはWinOLSで、これは車両エンジン管理コンピューターのバイナリイメージ(主にルックアップテーブルの数値データ)を解釈および編集するために設計されています。さまざまなエンディアン形式(PDPではないと思います)をサポートし、さまざまな幅とオフセットでデータを表示し、配列領域(マップ)を定義し、あらゆる種類のスケーリングとオフセットオプションを使用して2Dまたは3Dで視覚化します。また、ヒューリスティック/統計の自動マップファインダーがあり、これが役立つ場合があります。

これは商用ツールですが、無料のデモでは、バイナリへの変更を保存し、不要なエンジン管理機能を使用する以外はすべて実行できます。あなたはオープンソースソリューションにのみ興味があると言いましたが、これはStackoverflowであり、他の誰かはそれほどうるさくないかもしれません。

于 2011-12-07T07:22:36.467 に答える