Giải mã bảo vệ bản quyền để hồi sinh game Macromedia Director cũ trên máy tính hiện đại

Công nghệ09 tháng 10, 2026·6 phút đọc

Một lập trình viên đã dành thời gian phân tích và vượt qua ba lớp bảo vệ bản quyền của tựa game point-and-click tiếng Đức "Findus bei den Mucklas" để chơi lại nó sau hơn 20 năm. Quá trình này hé lộ cách các game Macromedia Director thời những năm 2000 ngăn chặn sao chép đĩa CD, từ file trùng lặp đánh lừa công cụ giải nén cho đến DLL kiểm tra ổ đĩa CD-ROM bằng mã bí ẩn.

Giải mã bảo vệ bản quyền để hồi sinh game Macromedia Director cũ trên máy tính hiện đại

Giải mã bảo vệ bản quyền để hồi sinh game Macromedia Director cũ trên máy tính hiện đại

Có những tựa game tuổi thơ tưởng chừng đã vĩnh viễn nằm lại trong quá khứ, bị chặn đứng bởi hàng rào bảo vệ bản quyền của chính thời đại chúng ra đời. Mới đây, một lập trình viên đã chia sẻ hành trình phá bỏ ba lớp bảo vệ bản quyền của tựa game point-and-click tiếng Đức "Findus bei den Mucklas" để có thể chơi lại nó sau hơn hai thập kỷ.

Câu chuyện không chỉ là niềm vui cá nhân của một game thủ hoài cổ, mà còn mở ra cánh cửa kỹ thuật để hồi sinh cả một kho tàng game Macromedia Director đang dần bị lãng quên.

Từ đĩa CD hỏng đến file ảnh đĩa hoàn chỉnh

Vào đầu những năm 2000, tác giả thường mượn game từ thư viện địa phương. Phần lớn là các game phiêu lưu point-and-click tiếng Đức, chạy trên chiếc máy Windows 95 của bố anh. Ngay cả khi đó, anh đã cố gắng tìm cách sao chép game để giữ lại chơi sau khi trả đĩa, nhưng tất nhiên đều thất bại.

Bảo vệ bản quyền thời kỳ đầu khiến việc sao chép đĩa trở nên bất khả thiBảo vệ bản quyền thời kỳ đầu khiến việc sao chép đĩa trở nên bất khả thi

Chiếc đĩa CD ghi lại năm xưa giờ đã vô dụng, cả vì đầu ghi CD thời đó thường không đọc ghi đúng đĩa được bảo vệ, lẫn vì hơn 10 năm qua tác giả không còn máy tính nào có ổ đĩa quang.

May mắn thay, một người tốt bụng đã tải lên archive.org bộ ảnh đĩa đầy đủ của tựa game này cùng các phần khác trong series. Bộ file gồm ba phần: .ccd, .cue và .img, được tạo bởi chương trình CloneCD cũ, chứa dữ liệu thô của đĩa kèm thông tin ngoài băng như metadata track.

Đáng chú ý, game còn kèm theo bốn track âm thanh, cho phép người chơi đưa đĩa vào đầu đọc CD để nghe nhạc nền. Để truy cập dữ liệu, tác giả dùng công cụ ccd2iso cũ để chuyển phần đầu file thành ISO thông thường và mount lên.

Lớp bảo vệ thứ nhất: File trùng lặp đánh lừa công cụ

Khi mount file và thử sao chép dữ liệu ra, tác giả gặp ngay lớp bảo vệ đầu tiên. Một số file xuất hiện nhiều lần trong ảnh đĩa: một bản thật, và một bản giả chỉ dài 0 hoặc 256 byte chứa dữ liệu rác ngẫu nhiên.

File trùng lặp hiện ra khi giải nén, đánh lừa các công cụ khác nhauFile trùng lặp hiện ra khi giải nén, đánh lừa các công cụ khác nhau

Nhiều khả năng nhà phát hành cố tình tạo các mục thư mục sai lệch để đánh lừa công cụ sao chép, khiến chúng chỉ hiển thị bản giả thay vì bản thật. Windows dường như luôn đọc đúng file, nhưng mỗi công cụ khác nhau lại hiển thị một tổ hợp file khác nhau.

Sau khi thử kết hợp PeaZip, Ark, Dolphin và 7z, tác giả mới trích xuất được các file đúng — chủ yếu bằng thao tác thủ công, chọn file có kích thước hợp lý và bỏ qua các bản giả.

Lớp bảo vệ thứ hai: Kiểm tra đĩa CD và script Lingo nhúng

Chạy file cài đặt qua Wine thành công, nhưng khi khởi chạy Findus4.exe, game hiện thông báo thiếu đĩa CD. Tìm kiếm chuỗi lỗi bằng rg -a "Lege die CD" cho thấy thông báo này được đọc từ file Pettson3.ini — thậm chí nhà phát triển còn không buồn đổi tên file từ phần game trước.

Điều thú vị là chuỗi lỗi không xuất hiện trong phần dữ liệu PE của file thực thi. Sau khi tìm hiểu, tác giả phát hiện đây là các file Macromedia Director Projector — về cơ bản chứa toàn bộ runtime để chạy file Director, với một file .dxr được ghép nối vào cuối.

Giải mã script Director nhúng trong file thực thi gameGiải mã script Director nhúng trong file thực thi game

Dùng công cụ ProjectorRays — trình dịch ngược dành riêng cho định dạng này — tác giả trích xuất và dịch ngược script Lingo bên trong. Kết quả bất ngờ: script chỉ dài khoảng 150 dòng, chứa toàn bộ logic khởi tạo game với đầy đủ tên hàm và biến gốc.

Trong đó có hàm checkpccdrompath duyệt qua tất cả ổ đĩa Windows từ D đến Z, tìm ổ CD-ROM chứa thư mục p3media. Nếu tìm thấy, game thiết lập đường dẫn tìm kiếm; nếu không, nó hiện thông báo lỗi và gọi quit().

Tác giả quyết định vá script để nhảy thẳng qua nhánh quit(). Do ProjectorRays chưa hỗ trợ assemble lại, anh chỉnh sửa thủ công bằng ImHex. Bytecode Lingo rất đơn giản: mỗi lệnh bắt đầu bằng một byte opcode, theo sau là số nguyên big-endian 1, 2 hoặc 4 byte. Lệnh jmpifz có opcode 0x95 kèm offset tương đối 16-bit. Chỉ cần đổi offset từ 96 byte thành 3 byte để nhảy sang lệnh kế tiếp, và video mở đầu game đã chạy.

Lớp bảo vệ thứ ba: DLL kiểm tra ổ CD-ROM

Tưởng chừng đã xong, nhưng game lại báo lỗi "Disc Error!". Lần này, trong file intro.dxr và huset.dxr có một BehaviorScript có tên khá rõ ràng: "Call Copy-X CD protection DLL (OPTGRAPH.DLL)".

Script này nạp file optgraph.dll nằm cạnh file thực thi game, gọi hàm initdisplay(), rồi kiểm tra giá trị trả về. Nếu không khớp một con số bí ẩn 26079537, game sẽ thoát ngay. Đáng chú ý, lớp bảo vệ này không hề được triển khai cho nền tảng Mac.

Thay vì dịch ngược toàn bộ runtime hay vá logic phát hiện nền tảng, tác giả chọn vá thẳng DLL. Mở file trong Ghidra cho thấy initdisplay() gửi hàng loạt lệnh mức thấp đến ổ CD để dựng nên con số bí ẩn. Anh dùng tính năng Patch Instruction của Ghidra thay vài lệnh đầu bằng một cặp MOV và RET đơn giản để hàm luôn trả về giá trị hằng mong muốn.

Màn hình menu game hoạt động trở lại sau khi vá thành côngMàn hình menu game hoạt động trở lại sau khi vá thành công

Và cuối cùng, game cũng chạy được tới màn hình menu.

Viết công cụ tự động vá

Sau khi hoàn thành, tác giả viết một script Python ngắn tự động áp dụng hai bản vá: một cho Findus4.exe tại offset 0x2252E8, và một cho optgraph.dll tại offset 0x1060. Script kiểm tra mã băm SHA-256 của từng file trước khi vá để đảm bảo đúng phiên bản, tránh làm hỏng file.

Script này chỉ hoạt động với phiên bản tiếng Đức cụ thể, nhưng không khó để điều chỉnh cho các phiên bản khác — thường chỉ cần sửa mã băm và offset.

Ý nghĩa cho cộng đồng game cổ

Điều đáng chú ý là có một số lượng đáng kinh ngạc các game thời đó cũng dùng Macromedia và có cơ chế bảo vệ bản quyền tương tự. Không có cách vá chung cho tất cả, nhưng với chút nỗ lực, quy trình này hoàn toàn có thể áp dụng lại.

Với những người yêu công nghệ và game hoài cổ, câu chuyện này minh họa một bài học quen thuộc: bảo vệ bản quyền cứng rắn thường chỉ gây khó chịu cho người dùng hợp pháp, còn những ai đủ kiên nhẫn và kỹ năng vẫn luôn tìm ra cách vượt qua. Đáng tiếc thay, chính các biện pháp đó lại là rào cản lớn nhất khiến game cũ dần biến mất khỏi lịch sử.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗