バイナリファイルの編集方法

# はじめに
本記事はバイナリファイルを表示したり、編集するための方法について記載しています。

バイナリファイルを表示・編集するためには、[バイナリエディタ](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF)を使用します。

バイナリエディタは、プラットフォームに応じて色々な種類がありますが、本記事ではLinuxを例に記載しています。

## バイナリファイルの表示・編集
Linuxの場合は、以下に記載している外部コマンドを用いてバイナリファイルの表示・編集を行うことができます。

hexeditorは、Kaliにインストールされている[ncurses-hexedit](https://www.kali.org/tools/ncurses-hexedit/)パッケージです。

### xxd
**xxd**コマンドは、指定されたファイルまたは標準入力を16進ダンプで出力します。
また16進ダンプを元のバイナリ形式に変換することもできます。

左からファイルの中の位置、 中央がバイナリデータを16進数で表示、 一番右がバイナリデータをASCIIに変換して表示します。

`$ xxd ＜ファイル名＞`

```console
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
00000010: 0000 0500 0000 02d0 0806 0000 00cf 7ddd  ..............}.
00000020: 5600 0000 0970 4859 7300 000b 1200 000b  V....pHYs.......
00000030: 1201 d2dd 7efc 0000 2000 4944 4154 789c  ....~... .IDATx.
00000040: ecbd 59ac 2cc9 79e7 f745 66d6 5e67 bdcb  ..Y.,.y..Ef.^g..
00000050: b97d 7b21 7b21 7be7 228a 4d71 196e 92b5  .}{!{!{.".Mq.n..
00000060: 5883 3104 db33 b635 9e01 ec37 db30 fcee  X.1..3.5...7.0..
00000070: 078f 013f f8c1 f330 b601 1b03 5bc6 c0c0  ...?...0....[...
00000080: 6830 d658 06a9 9148 5122 25b2 458a dd5c  h0.X...HQ"%.E..\
00000090: ba9b bdb0 9bbd f7dd efd9 b75a 7209 e3ff  ...........Zr...
```

### od
**od**コマンドは、指定されたファイルを指定されたフォーマットで表示することができます。

ファイルを指定しない場合、`od`コマンドは標準入力をダンプします。
ファイルのマジックナンバーなどを調査する場合などに活用できます。

オプションを複数使用することで、複数のタイプが指定できます。
出力フォーマットは`-t`フラグで指定し、フォーマットのタイプを指定しない場合は、`-t o2`がデフォルトとして使用されます。

16進数及びビッグエンディアンかつASCII文字で表示する場合は、以下のコマンドを実行します。

`$ od -tx1c ＜ファイル名＞`

```console
0000000  89  50  4e  47  0d  0a  1a  0a  00  00  00  0d  49  48  44  52
        211   P   N   G  \r  \n 032  \n  \0  \0  \0  \r   I   H   D   R
0000020  00  00  05  00  00  00  02  d0  08  06  00  00  00  cf  7d  dd
         \0  \0 005  \0  \0  \0 002 320  \b 006  \0  \0  \0 317   } 335
0000040  56  00  00  00  09  70  48  59  73  00  00  0b  12  00  00  0b
          V  \0  \0  \0  \t   p   H   Y   s  \0  \0  \v 022  \0  \0  \v
0000060  12  01  d2  dd  7e  fc  00  00  20  00  49  44  41  54  78  9c
        022 001 322 335   ~ 374  \0  \0      \0   I   D   A   T   x 234
0000100  ec  bd  59  ac  2c  c9  79  e7  f7  45  66  d6  5e  67  bd  cb
        354 275   Y 254   , 311   y 347 367   E   f 326   ^   g 275 313
```

:::note
[マジックナンバー](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_(%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E8%AD%98%E5%88%A5%E5%AD%90))は、ファイルのフォーマット識別子のことです。
例えば、[PNG](https://ja.wikipedia.org/wiki/Portable_Network_Graphics)のファイルシグネチャは`89 50 4E 47 0D 0A 1A 0A`です。
:::

### vim
**vim**は、バイナリファイルの編集も行うことができます。

バイナリモードで編集したい場合は、`-b`を指定してバイナリモードでファイルを開きます。

`$ vi -b ＜ファイル名＞`

ダンプ形式の表示に変更するためには、`:%!xxd`を押します。

```console
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
00000010: 0000 0500 0000 02d0 0806 0000 00cf 7ddd  ..............}.
00000020: 5600 0000 0970 4859 7300 000b 1200 000b  V....pHYs.......
00000030: 1201 d2dd 7efc 0000 2000 4944 4154 789c  ....~... .IDATx.
00000040: ecbd 59ac 2cc9 79e7 f745 66d6 5e67 bdcb  ..Y.,.y..Ef.^g..
00000050: b97d 7b21 7b21 7be7 228a 4d71 196e 92b5  .}{!{!{.".Mq.n..
00000060: 5883 3104 db33 b635 9e01 ec37 db30 fcee  X.1..3.5...7.0..
00000070: 078f 013f f8c1 f330 b601 1b03 5bc6 c0c0  ...?...0....[...
00000080: 6830 d658 06a9 9148 5122 25b2 458a dd5c  h0.X...HQ"%.E..\
00000090: ba9b bdb0 9bbd f7dd efd9 b75a 7209 e3ff  ...........Zr...
```

編集後にこの状態のまま保存すると、テキストとして保存されるため、最後に`:%!xxd -r`を実行したあとに`wq`を押して保存します。

:::note
`%!`でvi実行時に、他のコマンドを実行することができるので、`xxd -r（-revert）`コマンドを実行して16進数ダンプ及びバイナリ変換を行なっています。
:::

### hexeditor
**hexeditor**は、ファイルを16進数で表示及び編集ができるバイナリエディタです。

以下のコマンドを実行して、ファイルを開いて編集します。

`$ hexeditor ＜ファイル名＞`

![スクリーンショット 2022-11-03 16.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/609c9490-a493-6aab-3476-56d61968b72d.png)

編集して保存する場合は、`^X`を押して終了します。
変更せずに終了する場合は、`^C`を押します。

# おわりに
Kaliには上記hexeditor以外でも16進数で表示可能なバイナリエディタがあります。

## 参考
- [バイトオーダー （byte order）](https://atmarkit.itmedia.co.jp/icd/root/70/5784470.html)
- [エンディアン](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3)