基礎用語 バイナリファイルの解析
バイナリファイルの解析 目次
●概要●ファイル形式の判別
●バイナリファイル解析の初歩
●バイナリファイル解析の汎用アプローチ
●特定ファイル形式への解析アプローチ
●バイナリファイル解析についての補足
●バイナリファイルの解析例
バイナリファイルの解析 概要
この解説は、主にプログラム解析や情報セキュリティに興味のある方を対象として執筆しました。解説にはWindows用の各種解析ツールを使用し、別のOSであるLinuxの使用経験が無い方でも読み進めることができるようにしています。下記で紹介する主要な解析ツールや、解析関連資料については、当ソフトウェア『うさみみハリケーン』製作者のWebサイト「Digital Travesia」に入手先リンク集がありますので、アクセスされることをお勧めします。「バイナリファイル」とは、簡単に言えば、2進数すなわち0と1で構成される「バイナリデータ」のかたまりです。2進数とその関連知識といえる、16進数、ビット、バイト、リトルエンディアン、ビッグエンディアンおよび文字コード等については、当ヘルプの「基礎用語解説」で解説していますので、参照されることをお勧めします。
バイナリファイルには、私たちが普段パソコンで使用するような、ソフトウェアの実行ファイル、画像ファイル、動画ファイル、テキストファイルといった多種多様な形式があります。このうちテキストファイルは、内容がそのまま有意文字列として読めるという特性から、一般的なバイナリファイルと対比する形で「テキストファイル」と明示することもあります。ちなみに、情報セキュリティやプログラミングにおいては、実行ファイルのことを指して「バイナリファイル」あるいは「バイナリ」と呼ぶこともあります。
ファイル形式の判別
まず最初に、解析以前のアプローチとして、バイナリファイルの形式を判別してみましょう。Windowsで使用されるバイナリファイルは、その種類に応じた拡張子がファイル名末尾に付くため、ファイルの形式が分かりやすいといえます。たとえばソフトウェアの実行ファイルならば拡張子は「.exe」など、画像ファイルならば拡張子は「.jpg」や「.png」などです。しかし、ソフトウェアのプログラムの処理で、扱いたいファイルの形式を判別する際には、拡張子だけで判断すると判別ミスを起こしかねません。そこで、たいていのバイナリファイルの形式では、プログラムから判別するための「しるし」が、連続した複数バイトのバイナリデータ(バイトシーケンス)として規定されています。この「しるし」は、「magic」や「magic byte」および「File signature」などいくつかの呼び名があります。なお、「データの属性を示すデータ」という意味の、「メタデータ」という言い方もあります。このように、たいていのバイナリファイルには形式を判別する仕組みが用意されているので、その仕組みを使って色々なファイル形式を判別できる、「ファイルアナライザ」という種類のソフトウェアもあります。当ソフトウェア『うさみみハリケーン』には、汎用ファイルアナライザ「青い空を見上げればいつもそこに白い猫」が付属しています。「青い空を見上げればいつもそこに白い猫」の解説はバイナリファイル解析を理解する上で役立ちますので、参照されることをお勧めします。
<参考>汎用ファイルアナライザ「青い空を見上げればいつもそこに白い猫」によるファイル形式判別例
ファイルアナライザは、たくさんのバイナリファイル形式を判別するためのデータベースを持っており、たとえばファイルアナライザ「TrID」ならば1万7000パターン以上のバイナリファイル形式を判別可能です。また、日本製の拡張子判別ソフト「極窓」と「WinExChange」でも1400ほどの拡張子を判別可能です。バイナリファイルの形式判別と、実行ファイルの作成に用いられたソフトウェアつまり開発言語や、実行ファイルへの圧縮・暗号化適用時に用いられたソフトウェアの判別に対応する、「Detect It Easy」というファイルアナライザもあります。「青い空を見上げればいつもそこに白い猫」は、「TrID」と「Detect It Easy」および「WinExChange」の判別機能を取り込んで使えるようにしており、標準で「TrID」の判別機能の出力結果を表示します。また、「青い空を見上げればいつもそこに白い猫」が「Detect It Easy」の判別機能と新しい判別用データベースを取り入れるための、「Detect It Easy DLL版」を配布しています。
Detect It Easy DLL版 (青い空を見上げればいつもそこに白い猫 専用)
DetectHelper.zip
ファイルアナライザとは別のファイル情報取得ツールを併用し、ファイル形式に関連するより多くの情報を得ることもできます。例えば、画像や動画といった、特定形式のファイルに含まれている各種メタデータを取得・表示する「ExifTool」というツールがあり、ファイル形式判別の補助に役立ちます。
Windowsでは初期設定として、エクスプローラー上でファイル名の拡張子を表示しない設定になっています。バイナリファイルの解析を行う環境としては、拡張子の常時表示が視認性の面で望ましいといえますので、拡張子を表示する設定に変更されることをお勧めします。この設定変更はWindows 10ならば、エクスプローラーからいずれかのフォルダを開き、左上「表示」タブをクリックしてから、「表示/非表示」欄にある「ファイル名拡張子」をチェックすることで行います。Windows 11では、いずれかのフォルダを開いてから、メニューで「表示」→「表示」→「ファイル名拡張子」を選択します。
当ソフトウェア『うさみみハリケーン』には、バイナリファイル解析時の使用も想定した、簡易エクスプローラー「Portable Explorer」が付属していますので、活用されることをお勧めします。「Portable Explorer」は、各種ドキュメントファイルへの全文検索、各種ドキュメントファイルから文字列抽出および、画像ファイルへのOCR(光学式文字認識)による文字列読み取りにも対応しています(追加プログラムの導入や有効化が必要)。また、選択ファイルのパス、ファイル名、各種ハッシュおよび、メタデータである「拡張プロパティ」情報を取得可能です。
バイナリファイル解析の初歩
バイナリファイルの中身がどのようになっているかを解析するにあたり、最も基本的なアプローチは、「ヘキサエディタ」(ヘキサデシマルエディタ・16進エディタ、日本での通称は「バイナリエディタ」)でそのバイナリファイルを開いてみることです。これにより、バイナリファイルを構成するバイナリデータを、16進数で表示されたバイト列として視覚的に認識することができます。ちなみに、バイナリファイル内で先頭からの相対距離を「オフセット」と呼び、バイナリファイル内の特定位置を示す値として使われます。ただし日本製のヘキサエディタには「オフセット」のことを「アドレス」と表示するものもあります。一般的なヘキサエディタでは、バイナリデータの16進バイト列に加えて、バイナリデータを特定の文字コードで文字として解釈した結果や、バイナリデータを各種形式の数値として解釈した結果などを表示します。
<参考>『うさみみハリケーン』同梱のヘキサエディタ「へきさにゃん」でバイナリファイル(JPEG画像ファイル)を開く
表示内容は、オフセット、16進バイト列、Windows ANSI文字列(本来非表示の文字も可視化)、Unicode(UTF-16)文字列、各種形式での数値表現
<参考>「青い空を見上げればいつもそこに白い猫」のヘキサエディタでバイナリファイル(PNG画像ファイル)を開く
ヘキサエディタなどで表示されたバイト列から、目視により特徴的なバイナリデータやパターンを見つけるという「目Grep」というアプローチがあります。しかし、たいていの場合、ヘキサエディタでバイト列を見ただけでは、バイナリファイルの構造は良くわかりません。そこで、ヘキサエディタを使って、バイナリファイルの構造を、構成する項目ごとに分けて表示すると分かりやすくなります。ヘキサエディタの中には、特定バイナリファイル形式の構造に関する情報をあらかじめ用意することで、構成する項目ごとの表示に対応できるものもあります。
<参考>ヘキサエディタ「Moontail」でバイナリファイル(PNG画像ファイル)の構造を表示(画面右下)
これで、特定バイナリファイル形式の構造に関する情報、すなわち仕様と照らし合わせた、バイナリファイル解析が可能になります。PNG画像ファイルなどメジャーな形式の、バイナリファイル内部仕様は、たいていネットでの検索で詳細な解説を得ることができます(解説例「PICS」)。
上画面のPNG画像ファイル解析では、あらかじめMoontail付属の「struct.def」(テキストファイル)に、以下のPNG画像ファイルの構造に関する定義を追加しています。このような定義を記述する書式は、Moontailの説明書に解説があります。
struct PNG_HEADER { char PNG Signature[8]; DWORD ChunkData Size; char IHDR Chunk Header[4]; DWORD Width(BigEndianness); DWORD Height(BigEndianness); byte BitDepth; byte ColorType; byte CompressionMethod; byte FilterMethod; byte InterlaceMethod; DWORD Chunk CRC; };上の画面では、最初の8バイトがPNG画像ファイルであることを示すFile signature、選択されているオフセット0x14以降の4バイトは、ビッグエンディアンで格納された画像の高さの値であることが分かります。
このような、バイナリデータを「構造体」と呼ばれる形式に当てはめた表示と編集を用いるバイナリデータ解析手法があり、「AnalyzeBin」などの構造体編集に特化したヘキサエディタが活用可能です。
また、色々なファイル形式の判別結果と、実際のバイナリデータを見比べることで、特定ファイル形式に特有なバイナリデータのパターンであるFile signatureを知ることができます。例えば、ZIPファイルならば先頭は「50 4B」(文字コードASCIIの文字列としては「PK」)、Windows用実行ファイルは「4D 5A」(ASCIIで「MZ」)、BMPファイルでは「42 4D」(ASCIIで「BM」)で始まります。なお、ZIPファイル形式は、広く普及した圧縮ファイル形式という汎用性から、DOCXファイルやXLSXファイルといった色々なファイル形式としても使用されています。ネットで「File signatures」を検索すれば、このような特定ファイル形式別のリストが見つかります。
バイナリファイルの構造に関するアプローチに併せて、ヘキサエディタの標準的な機能である、書き換え、検索、比較などの機能を試し、それらの機能に慣れておくことをお勧めします。ヘキサエディタでのバイナリデータ書き換えは手動で行いますが、書き換え内容を指定して書き換えを自動化する方法もあります。
<参考> プログラム解析一般Q&A 「ファイルパッチコードの形式について教えてください」
バイナリファイル解析の汎用アプローチ
バイナリファイルに対して、含まれている文字列だけ一括取得して一覧表示するといった、汎用的なアプローチに対しては、ファイルアナライザを使うと便利です。「青い空を見上げればいつもそこに白い猫」では、「文字コード別文字列抽出」機能を実装しており、文字列を一括取得して一覧表示することができます。海外の各種ソフトに文字列抽出機能を持つものもありますが、たいてい日本語の文字列は適切に抽出できませんので注意が必要です。なお、テキストファイルではないバイナリファイルであっても、テキストエディタで開くことで、含まれている有意文字列を読み取れるケースもあります。<参考>「青い空を見上げればいつもそこに白い猫」でバイナリファイルに含まれる文字列を一括抽出
バイナリファイルに含まれている文字列ではなく、含まれている既知の特定データあるいは特定形式バイナリファイルを検索して抽出するというアプローチも、バイナリファイルの解析として有効な汎用アプローチといえます。このアプローチには、「青い空を見上げればいつもそこに白い猫」の「ファイル・データ抽出」機能が使用可能です。ちなみに、このアプローチは、バイナリファイルに単純結合された別のバイナリファイルの検出に加え、バイナリファイル内に隠ぺいされた各種データの解析にも有用です。
<参考>「青い空を見上げればいつもそこに白い猫」で各種ファイル・データ抽出
さらに高度な、バイナリファイルに含まれる各種データや文字列の検索には、「YARAルール」を用いた検索が役立ちます。特に情報セキュリティに興味のある方は、解説「YARAについて」を読まれた上で、「青い空を見上げればいつもそこに白い猫」の「YARAルールでスキャン」機能を使ってみることをお勧めします。ちなみに、当ソフトウェア『うさみみハリケーン』には、対象プロセスあるいは全プロセスのプロセスメモリに対する「YARAルールでスキャン」機能を実装しています(メニューの[検索]→[YARAルールでスキャン])。
<参考>「青い空を見上げればいつもそこに白い猫」でファイルを対象としてYARAルールでスキャン
<参考>「うさみみハリケーン」でプロセスメモリを対象としてYARAルールでスキャン
バイナリファイルを構成するバイナリデータは、ヘキサエディタ等によって可視化することができます。そしてさらに、バイナリデータを色々な条件で色づけして視覚化することにより、特徴のあるバイナリデータやパターンおよび、データに圧縮や暗号化が施されているかの判断材料となる「エントロピー」の値などを、容易に視認することが可能になります。
<参考>「青い空を見上げればいつもそこに白い猫」でバイナリファイルを構成するバイナリデータを視覚化
バイナリファイルの差分解析において、同じオフセット同士でバイナリデータに差異があるかを解析するのは容易ですが、挿入や削除されたバイト(列)を解析するのは簡単ではありません。また、バイナリファイルでのバイト(列)の挿入や削除結果の表示は、ヘキサエディタでの一般的なバイト列の表示に組み合わせると視認性が低下するという問題もあります。そのため、『うさみみハリケーン』では、2つのバイナリファイルの差分解析を行う専用ツール「NekoBinDiff」を同梱しています。「NekoBinDiff」では、バイナリファイル差分解析結果である、バイト(列)の変更・挿入・削除箇所の表示に対応しています。
<参考>「NekoBinDiff」でバイナリファイルを比較し差分解析結果の変更・挿入・削除箇所を表示
特定ファイル形式への解析アプローチ
汎用ファイルアナライザの「青い空を見上げればいつもそこに白い猫」での解析は、あくまで汎用的なアプローチによるごく基本的な解析といえます。実際には、判別されたバイナリファイル形式に応じた専用解析ツールを使って、さらに深い解析アプローチを行います。例えば「Windowsで使われる実行可能ファイル(PEファイル)」ならば、動作解析用の「逆アセンブラ」、「デバッガ」、「逆コンパイラ」、「プロセスメモリエディタ」、「プロセスモニター」他に、PEファイルの解析・編集用「PEエディタ」および「リソースエディタ」といった種類の解析ツールを使用します。PEファイル作成(コンパイル)に用いられたソフトウェアつまり開発言語や、圧縮や暗号化が施された場合に使われたソフトウェアの情報を表示する、PEファイル専用のファイルアナライザ「PEiD」という解析ツールもあります。『うさみみハリケーン』付属のPEエディタ「UMPE」には「PEiD」互換機能を実装しています。特にマルウェア解析においては、ファイルアナライザやPEエディタ等を用いて、本格的な解析アプローチの手がかりとなる情報を得るために行う解析を「表層解析」と呼びます。ちなみに、安全性が不明な実行ファイルを起動して動作等を解析する際には、仮想PCといった隔離された実行環境を使用します。
<参考>『うさみみハリケーン』の逆アセンブラ
<参考>『うさみみハリケーン』付属のPEエディタ「UMPE」(「PEiD」互換)
<参考>『うさみみハリケーン』付属のプロセスモニター「猫原喜雨」さん(特定ファイルへアクセスしたプロセスの解析にも使用可能)
画像ファイルならば、その種類に応じて、PNG画像解析ツール「TweakPNG」といった専用ツールを使用します。また、「ステガノグラフィー」という特殊な方法で画像に隠ぺいされたデータを解析するためには、「青い空を見上げればいつもそこに白い猫」の「ステガノグラフィー解析」機能を使用することができます。ステガノグラフィー解析の詳細については、解説「ステガノグラフィーの解析について」を参照願います。
このような、特定の解析用途に応じた専用の解析ツールは、「Digital Travesia」での紹介分以外にも、ネットで数多く公開されていますので、「自分がどのような解析を行いたいか」に応じてネットで色々と検索されることを強くお勧めします。目的の解析ツールだけではなく、解析例や関連知識など、有益な情報を得ることができるためです。
バイナリファイル解析についての補足
●解析時の各種演算について当ソフトウェア『うさみみハリケーン』には、バイナリファイル解析やプログラム解析の補助に使用可能な、以下の演算ソフトが付属していますので、活用されることをお勧めします。
・式入力演算・進数変換ソフト「UMEC」
・多倍長整数演算・進数変換ソフト 「UMECappend」
●Webツールの活用について
上記では、オフライン環境でも対応可能な、各種解析ツールを使用するアプローチについて述べていますが、実際のバイナリファイル解析においては、各種Webツールを使用するというアプローチもあります。例えば、オンラインでの各種ファイルおよびURLの解析を行いマルウェアを検出する「VirusTotal」では、実行ファイルをアップロードすれば解析結果として詳細な情報を得ることができます。
●エクスプローラーでのコンテキストメニューの活用について
エクスプローラーからバイナリファイルを選択して解析ツールで開く操作を効率化するために、右クリックで表示されるコンテキストメニュー(ポップアップメニュー、右クリックメニュー)に、「青空白猫で開く」や「ヘキサエディタで開く」および「テキストエディタで開く」といったメニュー項目を追加されることをお勧めします。「Digital Travesia」では逆アセンブラ「PeRdr」をコンテキストメニューに追加するための、レジストリ書き換え例の解説を公開していますが、コンテキストメニュー拡張ツールの「拡メ」などを使用して、簡単にコンテキストメニューへ複数の項目を追加することもできます。
●バイナリファイルのハッシュ値について
「青い空を見上げればいつもそこに白い猫」では、開いたバイナリファイルの「MD5」や「SHA-1」および「SHA-256」といった形式の「ハッシュ値」を表示します。このハッシュ値とは、特殊な計算処理(ハッシュ関数)により算出された、基本的にそのバイナリファイルにのみ該当する唯一無二のデータです。ハッシュ値の比較により、オリジナルのバイナリファイルに関する改ざんや破損が検出可能になります。情報セキュリティにおいては、悪意のあるソフトウェア(マルウェア)に関連するバイナリファイルの参照情報として、そのハッシュ値を公開することがあります。
●ヘキサエディタとプロセスメモリエディタの違い
当ソフトウェア『うさみみハリケーン』は、「プロセスメモリエディタ」という種類の解析ツールです。プロセスメモリエディタは、ヘキサエディタとユーザーインターフェイスがとてもよく似ています。しかし、ヘキサエディタが各種ファイルのバイナリデータの解析や編集を行うのに対し、プロセスメモリエディタは実行されているアプリケーションのプロセス(Windows上の実行単位)で使用される、仮想的なメモリ空間「プロセスメモリ」のバイナリデータの解析や編集を行います。プロセスメモリエディタでは、プロセスメモリ上の特定位置をメモリ上の番地である「アドレス」で表示します。関連して、逆アセンブラには、実行ファイルを解析対象とするものと、プロセスメモリに読み込まれた実行ファイル(モジュール)を解析対象とするものがあり、『うさみみハリケーン』が実装している逆アセンブラは後者に相当します。
●文字列とバイナリデータの相互変換について
これは、ヘキサエディタ上で表示されるバイナリデータ「01 02 FE FF」から16進文字列「01 02 FE FF」を得る、あるいは逆に16進文字列「01 02 FE FF」を元にバイナリデータ「01 02 FE FF」を作成しバイナリファイルとして保存するといったケースです。
まず、バイナリデータから16進文字列への変換ならば、ヘキサエディタで対処可能です。『うさみみハリケーン』同梱のヘキサエディタ「へきさにゃん」では、画面上の16進バイト列表示部での選択バイナリデータを、メニュー「編集」から、直接あるいは各種形式の文字列へ変換してクリップボードにコピーすることができます。コピー後にテキストエディタ上で貼り付けて保存します。また、「青い空を見上げればいつもそこに白い猫」や「UMPE」が実装しているヘキサエディタでも、バイナリデータ選択後にツールバーのボタンかCtrl+Dキーから、プログラミングで使用する形式の文字列としてクリップボードにコピーできます。
16進文字列からバイナリデータへの変換は、「へきさにゃん」で新規ファイルを作成し、メニューの「編集」→「16進文字列をバイナリデータ化して貼り付け」で対処できます。また、『うさみみハリケーン』付属の「UMECappend」(UMECappend.exe)で、画面最下部のエディットボックスに、目的のバイト列を16進文字列として入力し「16進保存」ボタンでも対処可能です。
●プログラミングでのバイナリファイル操作について
簡単なバイナリファイルの書き換えは、各種ツールによる対処とは別に、初歩のプログラミングを学んで自作ツールで対処できるようになれば、バイナリファイル解析のより深い理解につながると見られます。現在では、「Visual Studio Community」などの優秀なプログラム開発環境が実質無償で入手可能であり、かつプログラミングに係る膨大な情報へ簡単にアクセスすることも可能であり、開発言語を選択してから簡易バイナリファイル操作ツールを自作することは決して難しいものではありません。たいていの開発言語では、ファイルの読み書き(ファイル入出力)は基礎事項とされるため、参考となるソースコードの入手は容易です。プログラミングに対する適性の有無を判断するという意味でも、一度バイナリファイル操作ツールの自作に挑戦されることをお勧めします。さらに、簡易バイナリファイル操作ツールの自作後は、ヘキサエディタやプロセスメモリエディタ等の解析ツール自作へとステップアップしていくこともできます。
●Linuxディストリビューション上での解析について
ここではWindows環境でのバイナリファイル解析について述べています。しかし、特に情報セキュリティにおいて、マルウェア解析、フォレンジック、CTF(セキュリティコンテスト)など色々な分野で、Linuxの実行環境といえるLinuxディストリビューション上での各種解析が必要となることもあります。そのため、Windows環境での各種解析に慣れている方は、その経験を活かしつつ、必要に応じてLinuxディストリビューション環境を併用できるようになれば、解析スキルの向上につながると見られます。まずは「REMnux」や「Tsurugi Linux」および「Kali Linux」といった、情報セキュリティに関連するLinuxディストリビューションが、どのようなものか調べることから始めればよいでしょう。
バイナリファイルの解析例
バイナリファイルの解析については、その高い有用性から、色々な分野で解析例が公開されています。そのため、自分が興味を持つ分野での、下記のような解析例を探してみることをお勧めします。ファームウェア解析への『うさみみハリケーン』活用について
「PicoCTF 2018 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2019 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2021 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2022 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2023 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2024 Writeup うさみみハリケーンで解いてみた」