拡張子がわからなくて開けないって時どうする? (マジックナンバー) 

# はじめに
みなさんが普段業務をしている中でこんなこと経験したことはありませんか？

?? 「 お手元でこちらのファイルを開いていただいてもよろしいですか？ 」
僕 「 こちらのyouknowmeというファイルでよろしいですかね?　」
![スクリーンショット 2021-01-29 9.26.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255007/3d4396bb-2394-18a7-ea02-024afa703544.png)
僕 「 開きますね〜 」
![スクリーンショット 2021-01-29 9.27.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255007/46ea0829-3fc7-18f0-f662-3d634c89df3f.png)

僕 「 !? 」

いただいた(ダウンロードした)ファイルが開けないというようなことって少なからず経験したことありますよね。
大体の場合は拡張子がファイル名に無いため適切な方式で開くことができない時に表示されることが多いと思います。
拡張子がついているファイルで開けないという時には
適切に表示するためのソフトウェアを入れることで対応できると思いますが、
今回のような拡張子が付与されていない時には調べるためのとっかかりもなく大変困るかと思います。

こういう時にどうすれば開くことができるのかについてを記載していこうと思います。


# TL;DR
**マジックナンバー（フォーマット識別子）を確認**して、
対応する拡張子を確認して適切に**ファイルに拡張子を付与**し、
適切に**ファイルを開く**手法を選択

(appendix) マジックナンバーを確認せず一気に拡張子をしりたいならfileコマンドを利用する

# 解決方法
拡張子が記載されていないファイルを渡されて、そのファイルが開けなかった時には
何かしらの方法でもともとどのようなフォーマットで作られたファイルなのかを確認しましょう。

今回述べる確認方法はマジックナンバー（フォーマット識別子）より判別する方法について記載します。


## マジックナンバー？
ファイルのデータの中には、**マジックナンバー**と呼ばれる、自分自身が何のファイルなのかを示す部分があります。
ファイルの種類を識別するのに使われるファイル本文中の特定の位置にある特定の数値のことで、
ほとんどの場合、マジックナンバーはファイルの先頭の数バイトに記載されています。

我々が普段ファイルの種類を識別する方法としてはファイルの拡張子やプロパティを確認するといった操作を思いつきますが、
これらの利用ができない場合にも確認することができるわけですね。

## マジックナンバーの確認方法
マジックナンバーが分かれば、ファイルの拡張子を特定することができることがわかったので、
続いてはマジックナンバーの確認方法を記載します。
ファイルの本文にあると言いましたが、実際に開いて先頭に書いてあるわけではなく、
ファイルのバイナリを確認する必要があります。
なので、unixコマンドの**xxd**コマンドを利用して、ファイルを16進数として表示するのが良いと思います。
xxdコマンド自体は、ファイルや標準入力から受け取った内容を16進数、または2進数でダンプするコマンドです。

```bash
$ xxd youknowme
00000000: 1f8b 0800 f75d fd5f 0003 edd3 3d4e c330  .....]._....=N.0
00000010: 1407 f04c 0c19 3981 4f50 de87 f39c 0c1d  ...L..9.OP......
00000020: 4cdd 8809 3180 c4c0 62a9 11ca 9020 25a9  L...1...b.... %.
00000030: 9a0d 5646 8ec1 7538 0147 c17c 4642 7429  ..VF..u8.G.|FBt)
00000040: ad2a 447e cbb3 5e3c fcad e87f e6fb 93c2  .*D~..^<........
00000050: 2f8a e6c8 d7ed aa68 265d df45 5b06 00a2  /......h&].E[...
00000060: b58a cc9b 61c2 0704 50c8 6145 4942 220a  ....a...P.aEIB".
00000070: 08d0 40a4 fa6d 07f9 c9b2 ed7c 13a2 ac7c  ..@..m.....|...|
00000080: e76b df94 ebee 9dce 2fcf afdc 4de5 cb5a  .k....../...M..Z
00000090: 5db4 45d3 7efb fefe 14f5 35ff 0834 eaba  ].E.~.....5..4..
000000a0: 5c4c 19c5 0009 6471 582c c302 114d 46e1  \L....dqX,...MF.
000000b0: 9fc4 0caa eaca aa98 a220 68ce 3881 09b1  ......... h.8...
000000c0: 664c 8378 dff9 47bf b3bb d60f 3efb 7f17  fL.x..G.....>...
000000d0: ce07 8f4f f7af f3f0 f9f6 616d ffd1 3098  ...O......am..0.
000000e0: 48c1 ee22 0dfe 79ff 5367 0967 908a 7500  H.."..y.Sg.g..u.
000000f0: 2ecf 520b c4e4 00d1 ced1 e93c 9199 b0c9  ..R........<....
00000100: 0d38 c92c 9163 7b2c da60 4aa0 c525 96f7  .8.,.c{,.`J..%..
00000110: 9d7f 341a 8d46 9b79 01a1 c206 7e00 0c00  ..4..F.y....~...
00000120: 00
```

この時最初の```1f8b```を```マジックナンバー 1f8b```とかで調べてあげると何かしら引っかかると思います。
ちなみに```1f8b```はgzip圧縮されたデータということを意味しています。


## いろんな拡張子のマジックナンバー

マジックナンバーのリストはUNIX系OSの場合には以下のディレクトリの中に定義ファイルが存在しています。

```
/usr/share/file/magic
```


例えばjpegファイルを開いてみると
```0xffd8```と記載されているのが確認できると思います。
こちらがjpegのマジックナンバーです。

その他の代表的なものはまとめて記載してくださっているかたがいるので、
一気に確認されたい方はこちらを確認いただけると良いかと思います。
[マジックナンバーまとめ](https://qiita.com/forestsource/items/15933888466ba9c3f048) 

また、ディストリビューションごとに```/usr/share/file/magic```内に存在するファイルは異なるので、
ディストリビューションによっては全ての拡張子に対応していない可能性はあります。

## (Appendix) fileコマンドでの確認方法
ファイルを確認する場合に上記のようにバイナリから判断しなければならないのか？
と言われると実はそうではありません。
上記の作業を内部的に行ってくれるすごく優しいコマンドがあります。
それが、fileコマンドです。
fileコマンドはファイルを引数としてとり、
ファイルの内容を見ることでそのファイルのファイル形式を表示してくれるコマンドですが、
これはfileコマンドがファイルの内容を見るときに、
上記で説明したマジックナンバーを見てそのファイルが何なのであるかを判別しているということです。

```bash
$ file youknowme
youknowme: gzip compressed data, last modified: Tue Jan 12 08:29:43 2021, from Unix, original size modulo 2^32 3072
```

これだけわかりやすく簡単ならfileコマンドだけ教えろよということなんですが、
たまに拡張子がついているファイルにもかかわらず、
マジックナンバーが別のものである場合があります（CTF等の問題の中でが多いです）。
そういった場合にファイルの中のマジックナンバーを書き換えることになるので、
xxdとかでの確認方法も知っておいた方が良いかと思います。

# おわりに
開けないファイルへの対応方法という題名で記述しつつ、実際には一部のファイル形式は
識別子としてヘッダー (マジック ナンバー) を定義しているものがあり、
そちらでファイルのフォーマットを確認することができるよということに焦点を当てた内容で記述させていただきました。
意外と知られていないマジックナンバーだと思いますが、
知っていると普段の本当に些細なトラブルシューティングとしてちょっとだけ武器が増えて解決しやすくなるかもしれませんね。