最初の人が電卓で5318008を書き留めて以来、オタクはPC内に秘密の番号を隠し、それらを使用してアプリケーションとファイル間の秘密のハンドシェイクをネゴシエートしてきました。今日は、もっと面白い例をいくつか見ていきます。
魔法数とは何ですか?
ほとんどのプログラミング言語は、32ビット整数型を使用して、舞台裏で特定の種類のデータを表します。内部的には、数値はRAMに格納されるか、CPUによって32個の1と0として使用されますが、ソースコードではどちらかで記述されます。通常の10進形式、または0から9までの数字とAからFまでの文字を使用する16進形式として。
オペレーティングシステムまたはアプリケーションがファイルの種類を判別する場合、ファイルの先頭を調べて、ファイルの種類を示す特別なマーカーを探すことができます。たとえば、PDFファイルはASCII形式の「%PDF-1.3」に等しい16進値0x255044462D312E33で始まる場合や、ZIPファイルは元のPKZipユーティリティの子孫である「PK」に等しい0x504Bで始まる場合があります。この「署名」を見ると、他のメタデータがなくてもファイルの種類を簡単に識別できます。
Linuxユーティリティの「ファイル」をターミナルから使用して、ファイルのタイプを判別できます。実際には、 ファイルからマジックナンバーを読み取ります 「魔法」と呼ばれます。
アプリケーションが関数を呼び出したい場合、整数などの標準タイプを使用してその関数に値を渡すことができます。整数は、ソースコードで16進形式で表現できます。これは、AUTOSAVE_INTERVALのような人間が読める形式の名前で定義された識別子である定数に特に当てはまりますが、実際の整数(または他のタイプ)の値にマップされます。そのため、プログラマーがソースコードで関数を呼び出すたびに60などの値を入力する代わりに、AUTOSAVE_INTERVAL定数を使用して読みやすくすることができます。 (定数はすべて大文字で書かれているため、通常は簡単に認識できます)。
これらの例はすべて、次の用語に該当する可能性があります マジックナンバー 、関数またはファイルタイプが正しく機能するために、特定の16進数が必要になる場合があるためです。値が正しくない場合、機能しません。また、プログラマーが少し楽しみたい場合は、英語で何かを綴る16進数を使用してこれらの値を定義することがあります。 hexspeak 。
マジックナンバーを楽しむ:いくつかの注目すべき例
ざっと見てみると Linuxソースコードに 、Linuxでの_reboot()システムコールでは、16進数の0xfee1deadに等しい「マジック」変数を渡す必要があることがわかります。最初にその魔法の値を渡さずにその関数を呼び出そうとすると、エラーが返されます。
のGUID(グローバル一意識別子) BIOSブートパーティション の中に GPTパーティションスキーム は21686148-6449-6E6F-744E-656564454649であり、ASCII文字列「Hah!IdontNeedEFI」を形成します。これは、GPTが通常で使用されるという事実をほのめかしています。 BIOSをUEFIに置き換えたコンピューター 、ただし、必ずしもそうである必要はありません。
マイクロソフトは有名に 0x0B00B135を非表示にしました Linuxに送信されたソースコードをサポートするHyper-V仮想マシンで 値を0xB16B00B5に変更しました 、そして最後に彼らは 10進数に切り替えました ソースコードから完全に削除される前。
より楽しい例は次のとおりです。
- 0xbaaaaaad –使用者 iOSクラッシュログ ログがシステム全体のスタックショットであることを示します。
- 0xbad22222 – iOSのクラッシュロギングで使用され、VoIPアプリが誤動作したためにiOSによって強制終了されたことを示します。
- 0x8badf00d –(Ate Bad Food)iOSのクラッシュログで使用され、アプリケーションが何かを実行するのに時間がかかりすぎて、ウォッチドッグのタイムアウトによって強制終了されたことを示します。
- 0xdeadfa11 –(Dead Fall)アプリがユーザーによって強制終了されたときにiOSクラッシュロギングによって使用されます。
- 0xDEADD00D –VMの異常終了を示すためにAndroidによって使用されます。
- 0xDEAD10CC(デッドロック)アプリケーションがバックグラウンドでリソースをロックするときにiOSのクラッシュログで使用されます。
- 0xBAADF00D(Bad Food)が使用する LocalAlloc デバッグのためのWindowsの機能。
- 0xCAFED00D(Cafe dude)は、Javaのpack200圧縮で使用されます。
- コンパイルされたクラスファイルの識別子としてJavaによって使用される0xCAFEBABE(Cafe babe)
- 任天堂が使用する0x0D15EA5E(病気) ゲームキューブとWii 通常の起動が発生したことを示します。
- によって使用される0x1BADB002(1つの不良ブート) マルチブート マジックナンバーとしての仕様
- 0xDEADDEAD –Windowsが 手動で開始されたデバッグクラッシュ 、別名ブルースクリーンオブデス。
もちろん、これらだけではありませんが、面白そうな例の短いリストです。もう知っていますか?コメントで教えてください。
自分の例を見る
16進エディターを開いてから、任意の数のファイルタイプを開くと、さらに多くの例を見ることができます。 Windows、OS X、またはLinuxで利用できるフリーウェアの16進エディタはたくさんあります。 フリーウェアをインストールするときは注意してください がらくたやスパイウェアに感染しないようにします。
追加の例として、ClockworkModのようなAndroid携帯のリカバリイメージは「ANDROID!」で始まります。 ASCII形式で読み取った場合。
注意: 見回している間は何も変更しないでください。 16進エディタは物事を壊す可能性があります!