通信で送受するバイナリデータの読み解き方を, だれでも分かるように解説していきます!
本ブログでは特定秘密・装備品等秘密・企業秘密等に関連する事項に触れる情報は記載していません。
日々大量のデータがネットワーク上を流れている件
スマートフォン通信、衛星通信、航空無線、車載通信、レーダーシステムなど、現代社会を支える多くの機器は「バイナリデータ」によって情報を交換しています。
しかし、通信仕様書が公開されていない装置や、古いシステム、独自プロトコルを採用した機器では、送受信されているデータの内容が分からないことがあります。
そこで利用される技術が**バイナリ解析(Binary Analysis)**です。
バイナリ解析とは、通信で送られている0と1のデータ列を解析し、そこに含まれる情報や通信方式を推測する技術です。
特に通信分野では、単純なデータ解析だけではなく、プロトコル解析、パケット解析、信号処理、暗号解析など、幅広い知識が必要になります。
本記事では、通信におけるバイナリ解析の基本的な考え方から、実際の解析手順まで解説します。
1. 通信データはなぜバイナリなのか
人間が扱う情報は、文章や画像、音声などの形式になっています。
例えば、
「温度25℃」
という情報は人間には理解できます。
しかし、コンピュータや通信機器同士では、そのまま文字として送るわけではありません。
内部では、
01100100 00011001
のような0と1の集合として処理されています。
これがバイナリデータです。
通信では、以下のような理由からバイナリ形式が利用されます。
1.1 データ量を小さくできる
文字情報で送る場合、
Temperature=25
のように多くのバイト数が必要になります。
一方、バイナリなら、
00011001
だけで25という値を表現できます。
通信帯域が限られる無線通信では、この差は非常に重要です。
1.2 高速処理が可能
コンピュータ内部では、最終的にはすべて2進数として処理されています。
そのため、バイナリ形式で直接データ交換することで変換処理を減らし、高速な通信が可能になります。
特に、
- レーダー
- 航空管制通信
- 衛星通信
- 車載CAN通信
などリアルタイム性が重要なシステムでは、バイナリ通信が多く採用されています。
2. バイナリ解析とは何か
バイナリ解析とは、未知のデータ形式を調査し、内部構造を推測する作業です。
例えば、通信ログとして以下のデータが取得できたとします。
AA 01 03 25 00 FF
しかし、この6バイトが何を意味するのかは分かりません。
解析者は以下のような疑問を持ちます。
- AAは開始コードなのか?
- 01は機器IDなのか?
- 03はデータ種類なのか?
- 25は温度なのか?
- FFはエラーコードなのか?
これらを一つずつ検証していきます。
つまりバイナリ解析とは、
「意味のない数字の羅列から、通信機器が持つ規則性を発見する作業」
と言えます。
3. バイナリ解析で見るポイント
通信データを解析するとき、主に以下の項目を確認します。
3.1 ヘッダ部
多くの通信プロトコルでは、データの先頭に識別情報があります。
例:
AA BB CC 01 02 03 ...
この場合、
AA BB CC
が開始位置を示すヘッダである可能性があります。
ヘッダには以下の情報が含まれることがあります。
- 同期パターン
- 通信種類
- 送信元ID
- 宛先ID
- パケット長
3.2 ペイロード
ヘッダ以降の実際のデータ部分です。
例えば、
時間情報
速度情報
位置情報
高度情報
距離情報
角度情報
機器情報
などの情報が格納されています。
レーダーの場合なら、
- 距離
- 方位
- 速度
- 反射強度
などが受信側にバイナリ化されて送られている可能性があります。
それ以外にも機器情報や各モジュールやCPUカードの動かすタイミングなどのデータなども含まれています。
(余談ですが、現場で特に重要になるのは「時間情報」です。他の重要な情報は開発時に定まってしまい、開発案件や試験段階でもないと変えることがありません。
通信速度は一定であっても、その装置のケーブルや地理的要因に起因した物理的遅延やソフトの処理時間の遅延などは現場でしか調整できないからです。)
3.3 チェックサム・CRC
通信ではデータ破損を検出する必要があります。
そのため最後に、
CRC
Checksum
FCS
などの検査値が付加されます。
例えば、
AA 01 02 03 7F
最後の7Fだけ変化する場合、それがエラー検出用データである可能性があります。
現場では「機器故障情報」の確認、カードの物理的破損やCPU処理の遅延などの情報もここにはいることがあります。
4. 実際のバイナリ解析手順
ここから実際の解析方法を紹介します。
Step1 データを取得する
まず通信データを取得します。
方法はいくつかあります。
有線通信
- Ethernet
- RS-232C
- RS-485
- CAN
などの場合、
パケットキャプチャやロガーを利用します。
無線通信
無線の場合は、
- SDR(Software Defined Radio)
- スペクトラムアナライザ
- 通信解析装置
- LANアナライザ
- PC内部の通信情報
などを使用します。
例えば、
・SDRで受信したIQデータから復調し、その後ビット列を解析する流れ
・LANアナライザ(=WireShark等)を使用し機器内のデータを全て取得し必要な情報だけを抜き出す
などです。
Step2 データを16進数で表示する
バイナリは通常、16進数で確認します。
例:
01010101 11110000
↓
55 F0
16進数にすると規則性を見つけやすくなります。
解析では、
- Hex Editor
- Wireshark
- Python
- MATLAB
などが利用されます。
直接バイナリを取得するのではなく機器内部情報から解析する場合は既に16進数になっている場合があります。その場合は2進数に直して確認した方がわかりやすいこともあります。
Step3 固定部分と変化部分を探す
大量の通信ログを比較します。
例えば、
データA
AA 01 10 25 00 FF
データB
AA 01 11 26 00 FE
比較すると、
固定:
AA 01
00
変化:
10→11
25→26
FF→FE
となります。
この変化から意味を推測します。
例えば、
25→26
が温度変化と一致するなら、
そのフィールドは温度データの可能性があります。
Step4 エンディアンを確認する
バイナリ解析で非常に重要なのがエンディアンです。
16bitデータの場合、
01 02
を、
256+2
として読むのか、
2+256
として読むのかで値が変わります。
代表的なものは、
Big Endian
上位バイトから並べる方式
12 34
↓
0x1234
Little Endian
下位バイトから並べる方式
34 12
↓
0x1234
組込み機器ではLittle Endianが多く使われますが、通信規格によって異なります。
手元に仕様書がなく、エンディアンが判断できない場合はLittle Endianとして扱い、それによって出力されたデータを見て整合性がとれていれば問題なく動いていることが判断できます。
たまにBig Endianで書かれたデータがありますが、その場合出力されるデータが可笑しいので可笑しい時のログを解析して入力したバイナリが可笑しければそこをかえましょう。
5. 通信プロトコル解析の考え方
未知の通信を解析するときは、推測と検証を繰り返します。
例えば航空通信の場合、
あるデータ列:
8D 48 40 58 23 A1
を取得したとします。
ここから、
- 先頭ビットは種類識別?
- 続くビットはアドレス?
- 後半は位置情報?
というように解析します。
重要なのは、最初から答えを決めつけないことです。
仮説を作り、実験で確認します。
情報量ですが、巨大機器は32bit程度になることの方がレアです。
2000~5000Byte以上は解析をする必要があります。現実的かと言われると微妙ですが、大概繰り返し情報の場合があるので時間と戦闘の情報から推測する必要があります。
加えて確実にどこかにシステム設計書があり、ソフトウェア屋さんがそのシステムのどのバイナリが何をしているかを教えてくれています。
どんな意味を含んだデータかはそれを見て判断しましょう。
6. レーダー通信におけるバイナリ解析
レーダーシステムでは、バイナリ解析が非常に重要になります。
レーダー内部では、
- ADCデータ
- FFT結果
- ターゲット情報
- 追尾情報
- 制御コマンド
など大量のデータがやり取りされています。
例えば、
距離
=
受信時間 × 光速 ÷ 2
によって求められた距離情報が、
16bitや32bit整数として格納されている場合があります。
また、ドップラー処理後の速度情報も、
固定小数点形式
で保存されていることがあります。
開発段階ではそういった情報よりも器機の整合が取れているかの確認などにもちいられるため、現場の作業者には圧倒的な知識が必要になります。
私の知っている下流工程の作業者たちは「プロジェクトや設計者より計算理論に詳しい」という、、
↑品質管理部門って何なんですかね。ホント怖い
7. 解析でよく使うツール
Wireshark
ネットワーク解析では非常に有名なツールです。
Ethernet通信やTCP/IP通信の解析に利用されます。
Python
バイナリ解析では非常に強力です。
例えば、
- ファイル読み込み
- ビット操作
- 統計解析
- 自動解析
などが可能です。
例:
data = bytes.fromhex("AA BB CC")
print(data)
MATLAB
信号処理系では多用されます。
特に、
- FFT
- フィルタ処理
- IQ解析
などで活躍します。
Excel(マクロ,VBA)
PythonやMATLAB環境がダウンロードなどが出来ないような極めてセキュリティの厳しい現場で重宝します。というかこれ以外使わせてくれません。
ありとあらゆる分野で活躍します。
PythonやMATLABより汎用性があるため、レーダー関係の玄人はこれ1つで何でもこなします。
めっちゃかっこいいです。
8. バイナリ解析で注意すべきこと
バイナリ解析では、単純な数字合わせだけでは不十分です。
注意点があります。
暗号化
暗号化されている場合、データを見るだけでは意味を理解できません。
圧縮
データ量削減のため圧縮されている場合があります。
独自仕様
メーカー独自プロトコルでは、一般的な規格が使われていないことがあります。
9. バイナリ解析を学ぶメリット
バイナリ解析能力は、多くの分野で役立ちます。
例えば、
- 無線通信技術者
- レーダー技術者
- 組込みエンジニア
- セキュリティエンジニア
- IoT開発者
などです。
特に今後、
IoT機器、
自動運転、
ドローン、
スマートファクトリー
が普及すると、通信データを理解できる技術者の価値はさらに高まります。
まとめ
通信におけるバイナリ解析とは、単なる0と1の読み取りではありません。
通信データの中に隠された構造を発見し、機器同士がどのような情報交換をしているのか理解する技術です。
基本的な流れは、
- 通信データを取得する
- 16進数で確認する
- 固定部分と変化部分を探す
- データ形式を推測する
- 実験で検証する
という流れになります。
レーダーや無線通信の世界では、仕様書だけでは分からない実際の動作を理解するために、バイナリ解析能力が非常に重要になります。
今後、高度化する通信システムを扱う技術者にとって、バイナリを読む力は「通信機器の内部を理解するための共通言語」と言えるでしょう。


コメント