첫 번째 사람이 계산기에 5318008을 작성한 이래로 괴짜들은 PC 내부에 비밀 번호를 숨기고이를 사용하여 애플리케이션과 파일 간의 비밀 핸드 셰이크를 협상했습니다. 오늘 우리는 좀 더 재미있는 예를 간단히 살펴 보겠습니다.
매직 넘버는 무엇입니까?
대부분의 프로그래밍 언어는 32 비트 정수 유형을 사용하여 백그라운드에서 특정 유형의 데이터를 나타냅니다. 내부적으로 숫자는 RAM에 저장되거나 CPU에서 32 개의 1과 0으로 사용되지만 소스 코드에서는 둘 중 하나로 기록됩니다. 일반 10 진수 형식 또는 16 진수 형식으로 0에서 9까지의 숫자와 A에서 F까지의 문자를 사용합니다.
운영 체제 또는 응용 프로그램이 파일 유형을 확인하려는 경우 파일의 시작 부분에서 파일 유형을 나타내는 특수 마커를 찾을 수 있습니다. 예를 들어 PDF 파일은 ASCII 형식의 "% PDF-1.3"에 해당하는 16 진수 값 0x255044462D312E33으로 시작하거나 원래 PKZip 유틸리티에서 파생 된 "PK"와 같은 0x504B로 시작하는 ZIP 파일이 있습니다. 이 "서명"을 보면 다른 메타 데이터 없이도 파일 유형을 쉽게 식별 할 수 있습니다.
Linux 유틸리티 "file"은 터미널에서 파일 유형을 결정하는 데 사용할 수 있습니다. 파일에서 매직 넘버를 읽습니다. "마법"이라고합니다.
응용 프로그램이 함수를 호출하려고 할 때 정수와 같은 표준 유형을 사용하여 해당 함수에 값을 전달할 수 있으며, 이는 16 진수 형식으로 소스 코드로 표현할 수 있습니다. 이는 AUTOSAVE_INTERVAL과 같이 사람이 읽을 수있는 이름으로 정의 된 식별자 인 상수의 경우 특히 그러하지 만 실제 정수 (또는 다른 유형) 값에 매핑됩니다. 따라서 프로그래머가 소스 코드에서 함수를 호출 할 때마다 60과 같은 값을 입력하는 대신 AUTOSAVE_INTERVAL 상수를 사용하여 가독성을 높일 수 있습니다. (상수는 모두 대문자로 작성되기 때문에 일반적으로 쉽게 인식됩니다.)
이러한 모든 예는 매직 넘버 , 함수 나 파일 유형이 제대로 작동하려면 특정 16 진수가 필요할 수 있기 때문입니다. 값이 올바르지 않으면 작동하지 않습니다. 그리고 프로그래머가 약간의 재미를 원할 때, 그들은 영어로 무언가를 나타내는 16 진수를 사용하여 이러한 값을 정의 할 수 있습니다. 헥스 .
매직 넘버의 재미 : 주목할만한 예
잠시 살펴보면 리눅스 소스 코드에 , Linux에서 _reboot () 시스템 호출을 수행하려면 16 진수 0xfee1dead와 동일한 "마법"변수를 전달해야합니다. 마법 값을 먼저 전달하지 않고 해당 함수를 호출하려고하면 오류가 반환됩니다.
GUID (Globally Unique Identifier) BIOS 부팅 파티션 에 GPT 파티셔닝 체계 21686148-6449-6E6F-744E-656564454649는 ASCII 문자열 'Hah! IdontNeedEFI'를 형성하며, GPT가 일반적으로 BIOS를 UEFI로 대체 한 컴퓨터 하지만 반드시 그럴 필요는 없습니다.
마이크로 소프트는 유명하다 숨김 0x0B00B135 Linux에 제출 된 소스 코드를 지원하는 Hyper-V 가상 머신에서 값을 0xB16B00B5로 변경했습니다. , 그리고 마지막으로 십진수로 바꿨어 소스 코드에서 완전히 제거되기 전에.
더 재미있는 예는 다음과 같습니다.
- 0xbaaaaaad – 사용 iOS 크래시 로깅 로그가 전체 시스템의 스택 샷임을 나타냅니다.
- 0xbad22222 – iOS 크래시 로깅에서 VoIP 앱이 오작동으로 인해 iOS에 의해 종료되었음을 나타 내기 위해 사용됩니다.
- 0x8badf00d – (Ate Bad Food) iOS 충돌 로그에서 응용 프로그램이 작업을 수행하는 데 너무 오래 걸리고 감시 시간 초과로 인해 종료되었음을 나타내는 데 사용됩니다.
- 0xdeadfa11 – 사용자가 앱을 강제 종료 할 때 iOS 크래시 로깅에 사용되는 (Dead Fall).
- 0xDEADD00D – Android에서 VM 중단을 나타내는 데 사용됩니다.
- 응용 프로그램이 백그라운드에서 리소스를 잠글 때 iOS 크래시 로깅에 사용되는 0xDEAD10CC (Dead Lock)입니다.
- 0xBAADF00D (Bad Food)는 LocalAlloc 디버깅을 위해 Windows의 기능.
- Java의 pack200 압축에 사용되는 0xCAFED00D (Cafe dude)
- Java에서 컴파일 된 클래스 파일의 식별자로 사용하는 0xCAFEBABE (Cafe babe)
- Nintendo에서 사용하는 0x0D15EA5E (질병) Gamecube 및 Wii 정상적인 부팅이 발생했음을 나타냅니다.
- 0x1BADB002 (1 개의 잘못된 부팅) 멀티 부팅 매직 넘버로 사양
- 0xDEADDEAD – Windows에서 수동으로 시작된 디버그 충돌 , 그렇지 않으면 죽음의 블루 스크린이라고도합니다.
물론 이것 만이 유일한 것은 아니지만 재미있어 보였던 예의 짧은 목록 일뿐입니다. 더 알고 계십니까? 댓글로 알려주세요.
자신을위한 예시보기
16 진 편집기를 연 다음 원하는 수의 파일 유형을 열면 더 많은 예제를 볼 수 있습니다. Windows, OS X 또는 Linux에서 사용할 수있는 프리웨어 16 진 편집기가 많이 있습니다. 프리웨어를 설치할 때주의하십시오 크랩웨어 나 스파이웨어에 감염되지 않도록합니다.
추가 된 예로, ClockworkMod와 같은 Android 휴대폰의 복구 이미지는 "ANDROID!"로 시작합니다. ASCII 형식으로 읽는 경우.
노트 : 주위를 둘러 보는 동안 아무것도 바꾸지 마세요. Hex 편집자는 모든 것을 깨뜨릴 수 있습니다!