備忘録1：バイナリ解析１　バイナリとは

<h2>バイナリ</h2>

<h6><INS>バイナリとは</INS></h6>
バイナリ（binary）とは２進法のことです。デジタルコンピュータが扱う全ての
データはバイナリデータです。ファイルに保存されるデータや通信パケットなどは、
バイナリデータとして読み書きされたり送受信されたりします。

<h6><INS>バイナリデータとテキストデータ</INS></h6>
バイナリデータであっても、ASCIIやUnicodeなどの文字コードに対応したデータ
のことをテキストデータといいます。テキストデータは人間が見て認識できるデー
タです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531099/19e463eb-3478-ec3d-0c39-32cc85da1bc5.png)

<h2>ビットとバイト</h2>

<h6><INS>ビット</INS></h6>
ビット（bit）は２進数の１桁のことです。ビットはbinary digitの略です。
ビットは情報の最小単位です。1ビットで1か0の2つの状態を表現できます。
2bitでは00、01、10、11の4つの状態、3bitでは000、001、010、011、100、
101、110、111の8つの状態を表現できます。nビットで２nの状態を表現できます。

<h6><INS>ビットと数値</INS></h6>
ビットの集まりを２進数と考えると、数値として捉えることができます。
たとえば、10(2)は2(10) 、11(2)は3(10) 、100(2)は4(10) 、101(2)は5(10) のように、
２進数を10進数に変換して対応させることができます。

<h6><INS>バイト</INS></h6>
ビットを８個集めた単位をバイト（byte）といいます。1バイトは8ビットなので、
00000000～11111111までの256個の状態を表現できます。正の整数値と考えると、
0～255を、負の数も考慮すると-128～+127を表現することができます。

<h2>16進数</h2>
<h6><INS>N進数</INS></h6>
１桁にN個の数字を使うのがN進数です。２進数は0と1の2個、8進数は0～7の８個、
10進数は0～9の10個の数字を使います。N個の数字で表せない時に桁上がりします。

<h6><INS>16進数</INS></h6>
10進数より大きいN進数では数字が0～9では足りません。そのため、16進数では
AからFまでの6個のアルファベットを数字の代用にします。
16進数のaは10進数の10、bは11、cは12、dは13、eは14、fは15になります。
※ a～fは、大文字のA～Fでもかまいません。

<h6><INS>16進数の表記方法</INS></h6>
16進数は、数値の先頭に0xを付加して、0x1、0xa、0x3bのように表記することが
あります。0h、0ah、3bhのように末尾にhを付加して表記することもあります。
（a～fで始まる数値は先頭に0を付加します）。
※ 0xは0X、hはHのように、大文字で表記してもかまいません。

<h2>バイナリファイル</h2>

<h6><INS>バイナリファイル</INS></h6>
テキストデータを格納したファイルをテキストファイルといいます。
テキストデータはバイナリデータの一種なので、テキストファイルを含む全ての
ファイルはバイナリファイルです。

<h6><INS>バイナリファイルの種類</INS></h6>
バイナリファイルには次のような種類があります。
⚫ 画像ファイル
⚫ オーディオファイル
⚫ 動画ファイル
⚫ アーカイブファイル
⚫ 圧縮ファイル
⚫ アプリケーションデータファイル
⚫ <font color="Red">実行形式ファイル</font>

<h6><INS>ビューワ</INS></h6>
バイナリファイルを表示するためには、対応するビューワ（viewer）を使用します。


<h2>ファイルフォーマット</h2>

<h6><INS>ファイルフォーマットとは</INS></h6>
ファイルフォーマットは、ファイルを保存する形式のことです。ファイルフォーマッ
トはファイルの種別と考えることもできます。
ファイルフォーマットには、ISOやJISなどの標準化団体が制定した規格や、特定の
OSやアプリケーション用に独自に定められた規格があります。

<h6><INS>ヘッダ情報</INS></h6>
フォーマットによっては、ファイルの先頭にファイルのメタ情報を格納することが
あります。これをヘッダ情報といいます。

<h6><INS>マジックナンバー</INS></h6>
ファイルは拡張子によって種別を判断できる場合もありますが、完全ではありません。
ファイルの種別をあらわすために、ファイルの先頭に格納された数バイトのデータを
マジックナンバー(magic number)といいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531099/5fe90f41-f69b-546c-31f3-4ef724bd9005.png)

<h2>ダンプ</h2>

<h6><INS>ダンプ</INS></h6>
データの解析や修復のために、ファイルやメモリの内容を出力することをダンプ
（dump）といいます。ダンプの出力先はファイルや画面などです。
バイナリファイルをダンプすることを、バイナリダンプといいます。
バイナリダンプでは16進数を用いるのが一般的です。

<h6><INS>odコマンド</INS></h6>
od（octal dump）コマンドは、バイナリファイルの内容を8進数や16進数でダンプ
するコマンドです。ASCIIコードに対応する文字を表示することもできます。
odコマンド以外に、hexdumpコマンド、xxdコマンドでダンプすることもできます。
xxdコマンドは-bオプションを指定することで、2進数でダンプすることができます。

<h6>[odの実行例]</INS></h6>
<font color="DarkOrange">odはオプションを指定しないと8進数でダンプする</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531099/73866070-4073-3d01-f9d4-f2ad5f790d4d.png)

<font color="DarkOrange">-Axでアドレスを16進数、-txでデータを16進数でダンプする</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531099/0dff119a-545b-21ba-efd8-0f530daaba5f.png)
<font color="Blue"> リトルエンディアンなのでバイトが逆順で表示される</font>

<font color="DarkOrange">-t1でデータを1バイトずつ、-tzでASCIIコードを表示する</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531099/4843b29c-d85f-c427-c361-9ace637fa9ac.png)
<font color="Blue">対応するASCII文字 文字として表示できない場合ドットで表示される</font>

<h6>[hexdumpとxxdの実行例]</h6>
◆<font color="DarkOrange">hexdumpで16進数ダンプする（-C オプションはASCIIコードも表示する）</font>

```
$ hexdump -C random.dat
00000000 f5 38 56 16 32 6c 35 bc cc ac 23 c3 e8 3b 1b 7b |.8V.2l5...#..;.{|
00000010 ab 4b 13 e7 bd c3 7e 19 7d 43 41 07 6e 37 71 e7 |.K....~.}CA.n7q.|
00000020
```
◆<font color="DarkOrange">xxdで16進数ダンプする（ASCIIコードも表示される）</font>
```
$ xxd random.dat
00000000: f538 5616 326c 35bc ccac 23c3 e83b 1b7b .8V.2l5...#..;.{
00000010: ab4b 13e7 bdc3 7e19 7d43 4107 6e37 71e7 .K....~.}CA.n7q. 13 e7 bd c3 7e 19 7d 43 41 07 6e 37 71 e7 |.K....~.}CA.n7q.|
00000020
```
◆<font color="DarkOrange">xxdで2進数ダンプする（-b オプションは2進数でダンプする）</font>
```
00000000: 11110101 00111000 01010110 00010110 00110010 01101100 .8V.2l
00000006: 00110101 10111100 11001100 10101100 00100011 11000011 5...#.
0000000c: 11101000 00111011 00011011 01111011 10101011 01001011 .;.{.K
00000012: 00010011 11100111 10111101 11000011 01111110 00011001 ....~.
00000018: 01111101 01000011 01000001 00000111 01101110 00110111 }CA.n7
0000001e: 01110001 11100111
```
<h6>[odによるマジックナンバーの確認]</INS></h6>

```
ELF形式（Linuxの実行形式）
$ od -Ax -tx1z what-1 | head -1
000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 >.ELF............<
ZIP圧縮形式
$ od -Ax -tx1z what-2 | head -1
000000 50 4b 03 04 14 00 00 00 08 00 55 50 44 4e ea f3 >PK........UPDN..<
PNG画像形式
$ od -Ax -tx1z what-3 | head -1
000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 >.PNG........IHDR<
GZIP圧縮形式
$ od -Ax -tx1z what-6 | head -1
000000 1f 8b 08 08 ab de 4d 5c 00 03 6c 65 61 66 2e 70 >......M¥..leaf.p<
```