Kể từ khi người đầu tiên viết ra 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 bằng một trong hai đị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. Chẳng hạn, một tệp PDF có thể bắt đầu bằng giá trị hex 0x255044462D312E33, tương đươ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 PK 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 CAFEBABE

Tiện ích Linux có thể sử dụng tập tin dữ liệu 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 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 (hoặc loại khác) thực tế. 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 có một niềm vui nho nhỏ, 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 FADEDEAD

Nế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 chuyển qua bằng với số thập lục phân 0xfee1dead. Nếu một cái gì đó cố gắng gọi hàm đó mà không chuyển vào giá trị ma thuật đó trước, nó sẽ trả về một lỗi.

GUID (mã định danh duy nhất trên 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 trong các máy tính thay thế BIOS bằng UEFI , nhưng nó không nhất thiết phải như vậy.

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 thập phân  trước khi loại bỏ hoàn toàn khỏi mã nguồn.

Các ví dụ thú vị hơn 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 buộc phải thoát.
  • 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 các 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 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.

img_5457b991ed819

Lưu ý:  đừng thay đổi bất cứ giá trị gì trong bảng . hệ thống  có thể hỏng  mọi thứ!

Để lại một bình luận