홈페이지 » 어떻게 » 매직 넘버들 PC에 숨어있는 프로그래머들

    매직 넘버들 PC에 숨어있는 프로그래머들

    첫 번째 사람이 계산기에 5318008을 쓴 이후로, 괴짜들은 PC 내부의 비밀 번호를 숨기고 응용 프로그램과 파일간에 비밀 핸드 셰이크를 협상하는 데 사용했습니다. 오늘 우리는 재미있는 몇 가지 예제를 간략하게 살펴 봅니다..

    마법의 숫자 란 무엇인가??

    대부분의 프로그래밍 언어는 32 비트 정수형을 사용하여 특정 유형의 데이터를 나타냅니다. 내부적으로 숫자는 RAM에 저장되거나 CPU에서 32와 1로 사용되지만 소스 코드에서는 정규 10 진수 형식 또는 16 진수 형식으로 0에서 9까지의 숫자와 A에서 F까지의 문자를 사용합니다.

    운영 체제 또는 응용 프로그램이 파일 유형을 판별하려는 경우, 파일의 시작 부분에서 파일의 유형을 나타내는 특수 표시기를 볼 수 있습니다. 예를 들어 PDF 파일은 16 진수 값 0x255044462D312E33 (ASCII 형식의 "% PDF-1.3"과 동일) 또는 ZIP 파일의 0x504B (PKZip 유틸리티에서 가져온 "PK"와 동일)로 시작될 수 있습니다. 이 "서명"을 보면 다른 메타 데이터없이 파일 유형을 쉽게 식별 할 수 있습니다.

    컴파일 된 Java 클래스 파일은 CAFEBABE로 시작합니다.

    리눅스 유틸리티 "파일"은 터미널에서 파일 형식을 결정하는 데 사용할 수 있습니다 - 사실 "magic"이라는 파일에서 매직 번호를 읽습니다.

    애플리케이션이 함수를 호출하기를 원하면 정수와 같은 표준 유형을 사용하여 함수에 값을 전달할 수 있으며, 소스 코드에서 16 진수 형식으로 표현할 수 있습니다. AUTOSAVE_INTERVAL과 같이 사람이 읽을 수있는 이름으로 정의 된 식별자 인 상수의 경우 특히 그렇지만 실제 정수 (또는 다른 유형) 값에 매핑됩니다. 따라서 프로그래머가 소스 코드에서 함수를 호출 할 때마다 60과 같은 값을 입력하는 대신 가독성을 위해 AUTOSAVE_INTERVAL 상수를 사용할 수 있습니다. (상수는 일반적으로 대문자로 작성되므로 쉽게 인식됩니다).

    이 모든 예제는 함수 또는 파일 유형이 제대로 작동하려면 특정 16 진수 숫자가 필요할 수 있으므로 Magic Numbers라는 용어 아래에 올 수 있습니다. 값이 정확하지 않으면 작동하지 않습니다. 그리고 프로그래머가 조금 재미있게 지내기를 원한다면 16 진수를 사용하여이 값을 정의 할 수 있습니다. 영어로 된 것을 16 진수로 나타냅니다. hexspeak.

    매직 넘버로 즐기기 : 몇 가지 주목할만한 예

    모든 AppleScript는 FADEDEAD로 끝납니다.

    Linux 소스 코드를 살펴보면 Linux에서 _reboot () 시스템 호출에 16 진수 0xfee1dead와 같은 "magic"변수가 전달되어야한다는 것을 알 수 있습니다. 무언가 먼저 그 마법 값을 전달하지 않고 함수를 호출하려고하면 오류가 반환됩니다..

    GPT 파티션 구성표에서 BIOS 부팅 파티션의 GUID (전역 고유 식별자)는 21686148-6449-6E6F-744E-656564454649이며 ASCII 문자열 "Hah! IdontNeedEFI"를 형성하며 GPT가 일반적으로 사용된다는 사실을 암시합니다 BIOS를 UEFI로 대체 한 컴퓨터에서는 반드시 그래야 할 필요는 없습니다..

    Microsoft는 Linux에 제출 된 Hyper-V 가상 머신 지원 소스 코드에서 0x0B00B135를 숨기고 그 값을 0xB16B00B5로 변경했으며 결국 소스 코드에서 제거되기 전에 십진수로 전환했습니다..

    보다 재미있는 예제는 다음과 같습니다.

    • 0xbaaaaaad - 로그가 전체 시스템의 스택 샷임을 나타 내기 위해 iOS 충돌 로그에 사용됨.
    • 0xbad22222 - 오작동하여 VoIP 앱이 iOS에 의해 사망했다는 것을 나타 내기 위해 iOS 충돌 로깅에서 사용됩니다..
    • 0x8badf00d - iOS 충돌 로그에서 응용 프로그램이 너무 오래 걸려서 워치 독 타임 아웃으로 인해 죽었다는 것을 나타내는데 사용되는 (Ate Bad Food).
    • 0xdeadfa11 - 사용자가 앱을 강제 종료 할 때 iOS 충돌 로깅에 사용 된 (Dead Fall).
    • 0xDEADD00D - Android에서 VM 중단을 나타내는 데 사용됩니다..
    • 애플리케이션이 백그라운드에서 리소스를 잠그면 iOS 충돌 로깅에 사용되는 0xDEAD10CC (Dead Lock).
    • 디버깅을 위해 Windows의 LocalAlloc 함수에서 사용하는 0xBAADF00D (Bad Food).
    • Java의 pack200 압축에 사용되는 0xCAFED00D (카페 친구).
    • 컴파일 된 클래스 파일의 식별자로 Java에서 사용하는 0xCAFEBABE (Cafe Babe)
    • 0x0D15EA5E (질병) Gamecube 및 Wii에서 Nintendo가 정상적인 부팅이 발생했음을 나타내는 데 사용됨.
    • 0x1BADB002 (1 부적절한 부팅) 멀티 부팅 사양에서 마법 번호로 사용됨
    • 0xDEADDEAD - 수동으로 시작된 디버그 크래시를 나타내는 데 Windows에서 사용되며, 그렇지 않으면 파란의 죽음의 화면.

    이것들은 물론 거기 밖에있는 것은 아니지만, 재미있게 보인 예제의 짧은 목록입니다. 더 이상 아십니까? 의견으로 알려주십시오..

    자신을위한 예제보기

    16 진수 편집기를 연 다음 원하는 수의 파일 유형을 열어 더 많은 예제를 볼 수 있습니다. Windows, OS X 또는 Linux에서 사용할 수있는 프리웨어 16 진수 편집기가 많이 있습니다. 프리웨어를 설치할 때 crapware 또는 스파이웨어에 감염되지 않도록주의하십시오..

    예를 들어 ClockworkMod와 같은 Android 휴대 전화의 복구 이미지는 ASCII 형식으로 읽으면 "ANDROID!"로 시작합니다..

    노트 : 주위를 둘러 보면서 아무 것도 바꾸지 마십시오. 16 진수 편집자가 일을 망칠 수있다.!