Số ma thuật Các mã bí mật mà lập trình viên ẩn trong PC của bạn
Kể từ khi người đầu tiên viết 5318008 trên máy tính, các mọt sách đã ẩn số bí mật bên trong PC của bạn và sử dụng chúng để đàm phán bắt tay bí mật giữa các ứng dụng và tệp. Hôm nay chúng ta hãy xem nhanh một số ví dụ thú vị hơn.
Số ma thuật là gì?
Hầu hết các ngôn ngữ lập trình sử dụng loại số nguyên 32 bit để biểu thị một số loại dữ liệu nhất định phía sau hậu trường - bên trong số này được lưu trữ trong RAM hoặc được CPU sử dụng dưới dạng 32 và 0, nhưng trong mã nguồn, nó sẽ được viết ra định dạng thập phân thông thường, hoặc là định dạng thập lục phân, sử dụng các số từ 0 đến 9 và các chữ cái từ A đến F.
Khi hệ điều hành hoặc một ứng dụng muốn xác định loại tệp, nó có thể nhìn vào phần đầu của tệp để biết một điểm đánh dấu đặc biệt biểu thị loại tệp. Ví dụ: tệp PDF có thể bắt đầu bằng giá trị hex 0x255044462D312E33, bằng với %% PDF-1.3, ở định dạng ASCII hoặc tệp ZIP bắt đầu bằng 0x504B, tương đương với PK PKip gốc, xuất phát từ tiện ích PKZip ban đầu. Bằng cách nhìn vào chữ ký này, có thể dễ dàng xác định một loại tệp tin ngay cả khi không có bất kỳ siêu dữ liệu nào khác.
Các tệp Java Class được biên dịch bắt đầu bằng CAFEBABETiện ích Linux tập tin có thể sử dụng tập tin Linux từ thiết bị đầu cuối để xác định loại tập tin - thực tế, nó đọc các số ma thuật từ một tập tin có tên là ma thuật.
Khi một ứng dụng muốn gọi một hàm, nó có thể truyền các giá trị cho hàm đó bằng cách sử dụng các loại tiêu chuẩn như số nguyên, có thể được biểu thị trong mã nguồn ở định dạng thập lục phân. Điều này đặc biệt đúng đối với các hằng số, là các định danh được xác định bằng các tên có thể đọc được của con người như AUTOSAVE_INTERVAL, nhưng chúng ánh xạ tới các giá trị số nguyên thực (hoặc loại khác). Vì vậy, thay vì một lập trình viên gõ một giá trị như 60 mỗi lần họ gọi hàm trong mã nguồn, họ có thể sử dụng hằng số AUTOSAVE_INTERVAL để dễ đọc hơn. (Các hằng số thường dễ dàng được nhận ra vì chúng được viết bằng tất cả các chữ in hoa).
Tất cả các ví dụ này có thể thuộc thuật ngữ Số ma thuật, bởi vì chúng có thể yêu cầu một số thập lục phân cụ thể để một hàm hoặc loại tệp hoạt động chính xác nếu giá trị không chính xác, nó sẽ không hoạt động. Và khi một lập trình viên muốn vui vẻ một chút, họ có thể xác định các giá trị này bằng cách sử dụng các số thập lục phân đánh vần một cái gì đó bằng tiếng Anh, còn được gọi là hexspeak.
Vui với số ma thuật: Một số ví dụ đáng chú ý
Mỗi AppleScript kết thúc với FADEDEADNếu bạn xem nhanh mã nguồn Linux, bạn sẽ thấy rằng lệnh gọi hệ thống _reboot () trên Linux yêu cầu một biến ma thuật của Ma thuật được truyền qua bằng với số thập lục phân 0xfee1dead. Nếu có thứ gì đó cố gọi hàm đó mà không chuyển vào giá trị ma thuật đó trước, nó sẽ trả về lỗi.
GUID (mã định danh duy nhất toàn cầu) cho phân vùng khởi động BIOS trong sơ đồ phân vùng GPT là 21686148-6449-6E6F-744E-656564454649, tạo thành chuỗi ASCII của HII! IdontNeedEFI, một cách ám chỉ rằng GPT thường được sử dụng trong các máy tính thay thế BIOS bằng UEFI, nhưng nó không nhất thiết phải.
Microsoft nổi tiếng đã giấu 0x0B00B135 trong mã nguồn hỗ trợ máy ảo Hyper-V của họ gửi cho Linux, sau đó họ đổi giá trị thành 0xB16B00B5 và cuối cùng họ đã chuyển nó thành số thập phân trước khi nó bị xóa hoàn toàn khỏi mã nguồn.
Các ví dụ thú vị khác bao gồm:
- 0xbaaaaaad - được sử dụng bởi ghi nhật ký sự cố iOS để chỉ ra rằng nhật ký là một ngăn xếp của toàn bộ hệ thống.
- 0xbad22222 - được sử dụng bởi ghi nhật ký sự cố iOS để chỉ ra rằng một ứng dụng VoIP đã bị iOS giết chết vì nó hoạt động sai.
- 0x8badf00d - (Ate Bad Food) được sử dụng bởi nhật ký sự cố iOS để chỉ ra rằng một ứng dụng mất quá nhiều thời gian để làm một cái gì đó và đã bị giết bởi thời gian chờ của cơ quan giám sát.
- 0xdeadfa11 - (Dead Fall) được sử dụng bởi đăng nhập sự cố iOS khi ứng dụng bị người dùng bỏ quyền.
- 0xDEADD00D - được Android sử dụng để biểu thị hủy bỏ VM.
- 0xDEAD10CC (Khóa chết) được sử dụng bởi ghi nhật ký sự cố iOS khi ứng dụng khóa tài nguyên trong nền.
- 0xBAADF00D (Thực phẩm xấu) được sử dụng bởi chức năng LocalAlloc trong Windows để gỡ lỗi.
- 0xCAFED00D (Cafe dude) được sử dụng bởi nén pack200 của Java.
- 0xCAFEBABE (Cafe Babe) được Java sử dụng làm định danh cho các tệp lớp đã biên dịch
- 0x0D15EA5E (Bệnh) được Nintendo sử dụng trên Gamecube và Wii để chỉ ra một khởi động bình thường đã xảy ra.
- 0x1BADB002 (1 khởi động xấu) được đặc tả multiboot sử dụng làm số ma thuật
- 0xDEADDEAD - được Windows sử dụng để chỉ ra sự cố gỡ lỗi được khởi tạo thủ công, còn được gọi là Màn hình xanh chết chóc.
Tất nhiên, đây không phải là những người duy nhất ngoài kia, mà chỉ là một danh sách ngắn các ví dụ có vẻ vui. Biết gì nữa không? Hãy cho chúng tôi trong các ý kiến.
Xem ví dụ cho chính mình
Bạn có thể xem thêm ví dụ bằng cách mở trình soạn thảo hex và sau đó mở bất kỳ số loại tệp nào. Có rất nhiều trình soạn thảo hex phần mềm miễn phí có sẵn cho Windows, OS X hoặc Linux - chỉ cần đảm bảo bạn cẩn thận khi cài đặt phần mềm miễn phí để không bị nhiễm phần mềm crapware hoặc phần mềm gián điệp.
Như một ví dụ bổ sung, hình ảnh khôi phục cho điện thoại Android như ClockworkMod bắt đầu với, ANDROID !iết nếu đọc ở định dạng ASCII.
Chú thích: đừng thay đổi bất cứ điều gì trong khi bạn đang nhìn xung quanh. Trình chỉnh sửa hex có thể phá vỡ mọi thứ!