2 điểm bởi GN⁺ 2024-11-08 | 1 bình luận | Chia sẻ qua WhatsApp
  • Ecco the Dolphin: Defender of the Future trên Dreamcast có các cheat ẩn được kích hoạt bằng cách nhập ký tự viết tắt trong file lưu, và ngoài GYUGYU+XXX đã biết từ trước còn xác nhận thêm nhiều chuỗi nhập đặc biệt khác
  • Phân tích bắt đầu từ việc nạp ảnh chụp bộ nhớ của flycast vào Ghidra để tìm bộ đệm nhập và hàm xử lý, rồi lần theo cấu trúc trong đó kết quả chuyển đổi được so sánh với 6 giá trị đặc biệt
  • Việc xác định cheat không dựa trên chính chuỗi nhập mà dựa trên khóa được giải mã bằng passphrase và giá trị sau khi tính checksum, nên rất khó tìm ra nếu chỉ đọc chuỗi trực tiếp
  • Dùng brute force bằng Python để kiểm tra các chuỗi từ 1 đến 8 ký tự cho thấy SOCCER, EXBBERX, QQRIQ, XYZZYX, POPELY... tương ứng với màn thưởng, chế độ bất tử, hiển thị FPS và hiển thị thời gian
  • Chuỗi nhập tạo ra cùng một hiệu ứng không bị cố định ở một giá trị duy nhất; NNSET, SOCCER, ADEMVSSF đều mở minigame bóng đá thưởng, còn AFTJSXOT cũng mở khóa toàn bộ màn chơi giống GYUGYU

Cheat ẩn kích hoạt bằng tên file lưu

  • Ecco the Dolphin: Defender of the Future là game Ecco cuối cùng được phát hành chính thức, còn phần tiếp theo đã bị hủy
  • Cheat đã biết trước đây hoạt động bằng cách chọn New Game trên màn hình VMU, nhập GYU vào phần ký tự viết tắt, sau đó không nhấn End mà tiếp tục nhập lại GYU và thêm ba ký tự bất kỳ
    • Sau khi nhập theo dạng GYU GYU XXX rồi thoát menu, có thể chọn mọi màn trong mục Load game
  • Các chuỗi nhập đặc biệt đã được xác nhận và hiệu ứng của chúng như sau
    • GYUGYU+XXX: mở khóa mọi màn
    • SOCCER+XXX: mở khóa màn thưởng
    • EXBBERX+XXX: chế độ bất tử
    • QQRIQ+XXX: hiển thị FPS
    • XYZZYX+XXX: hiển thị thời gian
    • POPELY+XXX: hiệu ứng chưa rõ

Lần theo routine xử lý nhập liệu bằng Ghidra

  • Trong ảnh chụp bộ nhớ của trình giả lập flycast, có thể thấy một phần ký tự viết tắt đang hiển thị trên màn hình được lưu vào bộ đệm 8cfffb34
  • Khi tiếp tục nhập, các ký tự đã nhập trước đó bị đẩy sang bộ đệm 8c3abf18, và vùng này được dùng để xác định cheat
  • Sau khi nạp snapshot vào Ghidra, có thể tìm thấy hàm tại vị trí 8c0334d8 đang đọc bộ đệm đó
  • Hàm này biến đổi bộ đệm rồi kiểm tra xem kết quả có trùng với một trong danh sách 6 giá trị đặc biệt hay không
    • GYU GYU XXX được chuyển thành 9388D627, trùng với giá trị đặc biệt đầu tiên trong danh sách

Cách biến đổi và cấu trúc checksum

  • Theo kết quả decompile từ Ghidra, luồng xử lý của hàm biến đổi như sau
    • Đọc passphrase
    • Dùng passphrase để giải mã khóa 1024 byte
    • Dùng khóa đó để tính checksum cho bộ đệm nhập
    • Mã hóa lại khóa
  • Vì checksum là hàm một chiều, rất khó suy ngược trực tiếp bằng mắt để tìm chuỗi nhập tạo ra giá trị đặc biệt
  • Trong bản cập nhật sau đó, metalliczx và SideQuark xác nhận rằng sau khi giải mã, cấu trúc này chính là đa thức CRC32 checksum tiêu chuẩn
    • Vì vậy tồn tại cách lấy giá trị đích hiệu quả hơn brute force

Các chuỗi nhập được tìm ra bằng brute force Python

  • GYUGYU dài 6 ký tự, nên số tổ hợp 6 ký tự có thể có là 26^6 = 308,915,776
  • Với 7 ký tự, số tổ hợp tăng lên 8 tỷ; với 8 ký tự là 208 tỷ, đủ nặng để gây áp lực lớn cho laptop
  • Bản triển khai Python kiểm tra chuỗi nhập theo quy trình sau
    • Sao chép khối bộ nhớ chứa bộ đệm nhập chưa khởi tạo, passphrase và khóa
    • Dùng passphrase để giải mã khóa
    • Ghi chuỗi từ 1 đến 8 ký tự vào bộ đệm nhập
    • Tính checksum cho từng chuỗi nhập
    • So sánh kết quả tính được với giá trị mục tiêu
  • Toàn bộ mã được công khai trong gist
  • Chỉ với bản đơn luồng cũng đã cho ra các kết quả cần thiết, trước cả khi kịp viết xong bản song song

Các ánh xạ được phát hiện và hiệu ứng thực tế

  • Cột cuối trong kết quả đầu ra cho biết chuỗi nào khớp với giá trị đặc biệt nào
    • NNSET, SOCCER, ADEMVSSF đều khớp cùng một giá trị và mở khóa minigame bóng đá thưởng
    • AFTJSXOT mở khóa toàn bộ màn giống như GYUGYU
  • Khi nhập SOCCER+XXX làm ký tự viết tắt, Bonus Game sẽ mở và có thể chơi bóng đá dưới nước
    • Thiết lập bit 0x2 trong cờ tại 8c3ac00c
  • EXBBERX+XXX khiến màn hình Options hiển thị Immortality Enabled
    • Khi bật, người chơi không bị chết đuối hoặc chết
    • Thiết lập bit 0x400 trong cờ 8c3abe48 và bit 0x4 trong cờ 8c3abb00
  • QQRIQ+XXX hiển thị tốc độ khung hình của game và một số giá trị debug
  • XYZZYX+XXX hiển thị giá trị đồng hồ hiện tại
    • Hai chuỗi nhập này thay đổi các giá trị tại địa chỉ 8c35659c8c3565a4
  • Hiệu ứng của POPELY+XXX vẫn chưa được xác nhận
    • Có vẻ nó định kích hoạt cờ tại 8c3b0e44, nhưng cờ này chỉ hiển thị thông báo Cheats Enabled mà không thấy thêm tác dụng nào khác

1 bình luận

 
GN⁺ 2024-11-08
Ý kiến trên Hacker News
  • Hàm băm thực ra chỉ là CRC32, chính xác hơn là dùng đa thức này (0x77073096, mã trong bài bị sai)

    https://web.mit.edu/freebsd/head/sys/libkern/crc32.c

    Các số nguyên được giải mã trong bài viết là các hằng số của CRC32 này. Nếu biết đó là CRC32 và biết đa thức, có thể suy ngược đáp án bằng toán học mô-đun trên vành đa thức trong thời gian logarit thay vì thời gian mũ

    • Nghe nói Binwalk nhận diện được bảng đa thức CRC, nên tự hỏi liệu nó có thể tìm ra cả bảng này không

      Có ai đó nên tích hợp Binwalk và Ghidra. Hai công cụ này hợp nhau quá tốt

    • Tò mò không biết có mẹo nào để nhận ra một giá trị là kết quả CRC32 hay biết được đa thức/giá trị khởi tạo đã dùng không

  • Khi bản Ecco gốc ra mắt trên Megadrive (Genesis), tôi đã dồn toàn bộ số tiền khó khăn lắm mới dành dụm được để mua nó. Trò này khó đến mức vô lý, và trong cơn bực tức tôi đã ngồi cả buổi chiều với bút và giấy rồi cuối cùng cũng giải mã được hệ thống mật khẩu bằng cách nào đó

    Tôi dịch chuyển thẳng tới màn cuối và hôm sau đã phá đảo, rồi bị ám ảnh bởi cảm giác tội lỗi vì đã tiêu sạch tài sản của mình cho một trò chơi mà tôi hoàn thành trong hai ngày

    • Giải mã được hệ thống mật khẩu chỉ bằng bút và giấy nghe thật ấn tượng, nếu còn nhớ gì thì tôi rất muốn nghe thêm

    • Về mặt triết học, tôi không nghĩ như vậy có thể tính là đã phá đảo trò chơi

      Bạn đã bỏ qua nhiều màn, nghĩa là chỉ thấy một phần nội dung, lối chơi và câu chuyện như đã được thiết kế. Với Ecco the Dolphin cũng như nhiều trò khác, hành trình thường quan trọng hơn đích đến. Bạn đã bỏ lỡ các chủ đề và trải nghiệm như sự cô lập, kết bạn với kẻ ngoài cuộc, bảo tồn, du hành thời gian, giao cảm với khủng long, và dĩ nhiên là cả du hành vũ trụ

      Vì vậy bạn không cần phải cảm thấy tội lỗi đến thế

    • Dù sao thì màn cuối cũng rất ấn tượng. Tò mò không biết khi nhìn thấy nó sau khi bỏ qua một phần lớn trò chơi thì bạn có thấy bất ngờ không

    • Dù có dùng cheat hay không, có khi bạn là người duy nhất trên thế giới từng phá đảo trò này

  • QQRIQ là dạng rút gọn theo âm của “kukuriku”, nghĩa là tiếng gà gáy trong tiếng Hungary và nhiều ngôn ngữ khác. Ví dụ như tiếng Ba Lan “kukuryku”, tiếng Hebrew “קוקוריקו”

    Điều đó làm tôi tò mò không biết quá trình chọn các mật khẩu đã diễn ra như thế nào

    • Gyugyu cũng có thể là một tham chiếu đến phim Hungary “The Fifth Seal”

      “Hãy tưởng tượng bạn sắp chết và sẽ tái sinh thành một trong hai người: một nô lệ hoặc một ông chủ giàu có. Người nô lệ bị chủ hành hạ, mất lưỡi và một mắt, còn vợ con cũng bị giết. Anh ta vẫn sống tiếp vì tin rằng mình là người tốt, bởi anh ta chưa từng làm điều khủng khiếp và tàn bạo với người khác như ông chủ đã làm. Người chủ giàu thì hoàn toàn không có day dứt đạo đức. Ông ta không cho rằng những việc mình làm là sai, và tin rằng người nô lệ xứng đáng bị trừng phạt. Bạn phải chọn: làm một nô lệ nghèo nhưng chính trực, hay một ông chủ giàu có nhưng sa đọa.”

      Gyugyu là tên của người nô lệ đó

      https://www.imdb.com/title/tt0075467

    • Vì các lập trình viên của trò này ở Budapest, đây là một phỏng đoán khá hợp lý

    • Popely với chữ “ly” kiểu tiếng Hungary cũng là một manh mối

    • Trong tiếng Pháp là Cocorico nên cũng rất giống

    • Nó cũng gợi nhớ đến làng Kakariko trong Zelda, nơi lúc nào cũng có gà

  • Một chi tiết bên lề thú vị là khi được hỏi về nguồn cảm hứng, nhà phát triển Ecco Ed Annunziata đã trả lời: “Tôi chưa từng dùng LSD, nhưng tôi đọc rất nhiều John C. Lilly”. Lilly nổi tiếng với những công trình tiên phong về trí thông minh động vật, liệu pháp tâm lý bằng ketamine, bể cách ly cảm giác và nghiên cứu ý thức

    Tên “Ecco” là một tham chiếu đến ECCO (Earth Coincidence Control Office) của Lilly. John giả định rằng có một căn cứ siêu nhiên/ngoài hành tinh ở mặt khuất của Mặt Trăng để điều phối mọi “sự trùng hợp” trên Trái Đất. Ông cũng là một trong những người sớm nhận ra cá heo thông minh đến mức nào, và từng ám ảnh với việc tìm cách giao tiếp với chúng đến mức làm ngập một nửa ngôi nhà ở Caribe để sống cùng chúng. Đây mới chỉ là phần nổi của tảng băng; nếu thấy hứng thú thì tôi rất khuyên đọc hồi ký The Center of the Cyclone của ông. Một nhân vật thật sự cuốn hút

  • Tò mò không biết có tài liệu nào tốt để bắt đầu dịch ngược game Dreamcast không. Tôi muốn thử vài thứ với Skies of Arcadia, nhưng sẽ hay hơn nếu có kỹ thuật bài bản nào đó ngoài kiểu “xem giá trị nào thay đổi giữa các ảnh chụp bộ nhớ”

    • Với việc tìm vị trí của một giá trị trong RAM, cách đó thực tế gần như là kỹ thuật tiêu chuẩn. Nó thật ra hoạt động khá tốt

      Một số trình giả lập như Dolphin có tích hợp sẵn công cụ như vậy. Các công cụ hack game cũ như Gameshark cho N64 cũng dùng cùng kỹ thuật đó với giao diện console. Tôi không rõ trình giả lập Dreamcast có công cụ tương tự không

      Tôi từng viết một bài dùng kỹ thuật này trong Dolphin, và bài tiếp theo cũng nói về hack game console bằng Ghidra: https://www.smokingonabike.com/2021/01/17/hacking-super-monk...

    • Tôi từng xem qua trò đó một chút. Mẹo cốt lõi là dump ảnh chụp bộ nhớ ra file rồi nhập vào Ghidra. Có nhiều cách để dump, và cũng có nhiều người thích Cheat Engine

      Ghidra có thể phân tích native mã máy của bộ xử lý SuperH, nên chỉ cần chạy phân tích tự động là đã lộ ra khá nhiều hàm

  • Vài năm gần đây tôi bị hấp dẫn bởi các game cũ nhiều hơn hẳn, và dù không biết diễn đạt vậy có đúng không, chúng cho cảm giác có linh hồn hơn rất nhiều

    Và vụ chiếc xe thì thật đáng tiếc. Cảm ơn vì lời cảnh báo, từ giờ tôi sẽ không để nó nổ máy không tải ngoài lối xe vào nữa

    • Chắc chắn là bạn không nhớ nhung những tính năng hiện đại như kết nối mạng bắt buộc và vi thanh toán chứ?
    • Tôi không biết đã có chuyện gì với chiếc xe. Tôi không thấy trong bài hay trong bình luận
  • Tôi luôn thắc mắc nên bắt đầu học dịch ngược từ đâu. Hầu hết mọi người đều nói trước hết phải học assembly, nhưng sau đó thì dường như không có nhiều thông tin cụ thể trên mạng

    Không rõ có phải là kiểu dần dần học các mẫu phổ biến của x86, arm và các nền tảng arcade bằng thử-sai hay không. Khó tìm được các cuộc thảo luận đi vào chi tiết trên mạng

    • Nó khá giống debug. Có lẽ bạn từng phải tiếp quản một codebase xa lạ và tự tìm hiểu nó; chỉ khác là thay vì source thì bạn chỉ có binary

Có thể dùng các công cụ như Ghidra để dần ghép khớp với mã nguồn, nhưng cuối cùng vẫn phải suy luận theo cách giống như khi cố hiểu một codebase xa lạ. Điểm khác biệt lần này là hoàn toàn không có chú thích, nhưng cũng có khá nhiều dự án công khai mã nguồn mà chẳng có chú thích nào.

Xem như đã đi được khoảng nửa chặng rồi, và nếu quen với mã assembly thì đương nhiên sẽ rất có ích
  • Ví dụ thực tế hơn thì nên thử giải http://microcorruption.com hoặc https://crackmes.one/

  • Cá nhân tôi đã học được rất nhiều khi nghịch Cheat Engine. Hồi nhỏ tôi dùng nó là chính rồi sau này không đụng lại nữa nên không biết, nhưng hóa ra đây là một công cụ mạnh hơn tôi tưởng rất nhiều

    Trình disassembler đủ tốt, và còn có thể viết thứ mà nó gọi là “assembly scripts”, nên rất phù hợp để học những bước cơ bản của việc vá bộ nhớ bằng assembly x86. Từ đó có thể bắt đầu tạo các tiện ích riêng để vá game theo ý mình

    Chỉ riêng Cheat Engine thôi cũng có thể vá game để tạo ra những mức cheat điên rồ

  • Dù đã học một ít ở trường, nhưng việc chạy từng bước bằng debugger với những trò chơi điện tử tôi nhớ từ nhỏ lại dạy tôi về khoa học máy tính nhiều hơn hẳn những gì học trên lớp

  • Tôi muốn xem video cheat bóng đá dưới nước thực sự hoạt động

  • Thật thú vị khi các game tương tự dùng số nguyên cố định để khớp checksum. Pitfall: The Lost Expedition cũng dùng một cách rất giống: chuyển các nút bấm thành chuỗi ASCII của chính các nút đó rồi tính CRC

    Cách tiếp cận cũng là gần như brute-force bằng Python rồi so với cheat hash đã trích xuất. Cũng có thể thấy bảng CRC32 ẩn trong decrypted_ints. Các bảng tạo sẵn thì bị tìm ra quá dễ. Tôi tự hỏi vì sao người ta vẫn thường gặp chúng ở dạng bị làm rối để tăng độ khó, thay vì tạo một bảng mới bằng đa thức riêng

  • Thật bất ngờ khi có một blog tập trung vào Sega Saturn

    Cách đây không lâu tôi tìm thấy một chiếc Saturn cùng một chồng nhỏ đĩa game trong tủ ở nhà bố mẹ. Tôi không nhớ mình từng sở hữu nó, nên đoán là em trai tôi kiếm được sau khi tôi lên đại học. Dù sao thì khi cắm vào thử, mọi game đều chạy tốt. Nhưng ngoài ra tôi hoàn toàn không biết nên làm gì với nó. Dĩ nhiên không có chuyện vứt đi

    • Mấy trò đó có giá trị cực lớn. Tôi đã cho luôn bộ của mình vào năm 2005, và giờ mỗi lần tra giá trên eBay là tim lại đập thình thịch

    • Cứ vui vẻ tận hưởng thôi

      https://terraonion.com/en/producto/terraonion-mode/