ホームページ » の仕方 » マジックナンバープログラマーがあなたのPCに隠す秘密のコード

    マジックナンバープログラマーがあなたのPCに隠す秘密のコード

    最初の人が電卓で5318008を書き出して以来、オタクはあなたのPCの中に秘密の番号を隠して、アプリケーションとファイルの間の秘密の握手を交渉するためにそれらを使っていました。今日は、もっと面白い例をいくつか見てみましょう。.

    マジックナンバーとは?

    ほとんどのプログラミング言語は、舞台裏で特定の種類のデータを表すために32ビット整数型を使用します - 内部的には数値はRAMに格納されるか、CPUによって32の1と0として使用されますが、ソースコードではどちらかに書き込まれます。通常の10進形式、または0から9までの数字とAからFまでの文字を使用する16進形式.

    オペレーティングシステムまたはアプリケーションがファイルの種類を判別したい場合は、ファイルの種類を示す特別なマーカーをファイルの先頭から探すことができます。たとえば、PDFファイルは16進値0x255044462D312E33で始まり(ASCII形式の「%PDF-1.3」に相当)、ZIPファイルは0x504B(「PK」に相当)で始まります。これは元のPKZipユーティリティから派生したものです。この「署名」を見れば、他のメタデータがなくてもファイルの種類を簡単に識別できます。.

    コンパイルされたJavaクラスファイルはCAFEBABEで始まります

    Linuxユーティリティ“ file”は端末からファイルの種類を決定するために使うことができます - 実際、それは“ magic”と呼ばれるファイルからマジックナンバーを読みます。

    アプリケーションが関数を呼び出したいときは、整数などの標準型を使用してその関数に値を渡すことができます。これは、ソースコードで16進形式で表すことができます。これは、AUTOSAVE_INTERVALのような人間が読める名前で定義された識別子である定数に特に当てはまりますが、それらは実際の整数(または他の型)値にマッピングされます。そのため、プログラマがソースコードで関数を呼び出すたびに60のような値を入力する代わりに、読みやすくするためにAUTOSAVE_INTERVAL定数を使用できます。 (定数はすべて大文字で書かれているので、通常は簡単に認識されます).

    関数やファイルの種類が正しく機能するには特定の16進数が必要になる場合があるため、これらの例はすべてマジックナンバーという用語に分類されます。値が正しくないと機能しません。プログラマーが少し楽しい時間を過ごしたい場合は、16進数を使ってこれらの値を定義することもできます。.

    マジックナンバーを楽しもう:いくつかの注目すべき例

    すべてのAppleScriptはFADEDEADで終わります

    Linuxのソースコードをちょっと見てみると、Linuxの_reboot()システムコールでは、16進数0xfee1deadに等しい「魔法の」変数を渡す必要があることがわかります。何かが最初にその魔法の値を渡さずにその関数を呼び出そうとしたならば、それはただエラーを返すでしょう.

    GPTパーティショニングスキームのBIOSブートパーティションのGUID(グローバルに一意な識別子)は21686148-6449-6E6F-744E-656564454649であり、これはASCII文字列「Hah!IdontNeedEFI」を形成します。これは、GPTが通常使用されるという事実の暗示ですBIOSをUEFIに置き換えたコンピュータでは、必ずしもそうである必要はありません。.

    Microsoftは、Linuxに提出されたHyper-V仮想マシンをサポートするソースコードで0x0B00B135を隠し、それから値を0xB16B00B5に変更し、最後にそれを10進数に切り替えてからソースコードから完全に削除しました。.

    もっと楽しい例は次のとおりです。

    • 0xbaaaaaad - ログがシステム全体のスタックショットであることを示すためにiOSクラッシュロギングによって使用されます。.
    • 0xbad22222 - iOSのクラッシュログ記録によって使用され、VoIPアプリが動作不良のためiOSによって強制終了されたことを示します。.
    • 0x8badf00d - (Ate Bad Food)iOSのクラッシュログで、アプリケーションの実行に時間がかかりすぎ、ウォッチドッグタイムアウトによって強制終了されたことを示すために使用される.
    • 0xdeadfa11 - (Dead Fall)アプリがユーザーによって強制終了されたときにiOSクラッシュロギングによって使用される.
    • 0xDEADD00D - VMの中止を示すためにAndroidによって使用されます.
    • アプリケーションがバックグラウンドでリソースをロックしたときにiOSクラッシュロギングで使用される0xDEAD10CC(デッドロック).
    • デバッグのためにWindowsのLocalAlloc関数で使用される0xBAADF00D(不良食品).
    • Javaのpack200圧縮で使用される0xCAFED00D(Cafe dude).
    • コンパイルされたクラスファイルの識別子としてJavaで使用される0xCAFEBABE(カフェベーブ)
    • 通常の起動が行われたことを示すために、ゲームキューブおよびWiiでNintendoによって使用される0x0D15EA5E(Disease).
    • マルチブート仕様でマジックナンバーとして使用される0x1BADB002(1不良ブート)
    • 0xDEADDEAD - 手動で開始されたデバッグクラッシュを示すためにWindowsによって使用されます。そうでなければブルースクリーンオブデスとして知られています.

    もちろん、これだけではありませんが、面白そうに見える例のほんの一部にすぎません。もう知ってる?コメントで教えてください.

    自分のために例を見る

    16進エディタを開いてから任意の数のファイルタイプを開くことで、他の例を見ることができます。 Windows、OS X、またはLinuxで利用できるフリーウェアの16進エディタはたくさんあります - フリーウェアをインストールするときは、クラップウェアやスパイウェアに感染しないように注意してください。.

    追加の例として、ClockworkModのようなAndroid携帯用のリカバリイメージは、ASCIIフォーマットで読み込まれた場合、「ANDROID!」で始まります。.

    注意: 見回している間は何も変えないでください。 16進エディタは物事を壊すことができます!