2016-01-31 22 views
6

Cách đây một thời gian dài, tôi đã thử chỉnh sửa hex tệp thực thi của trò chơi "Nguy hiểm Dave". Tôi đã xem xung quanh tệp cho bất kỳ chuỗi nào tôi có thể tìm thấy và thực hiện một số chỉnh sửa ngẫu nhiên để xem liệu nó có thực sự thay đổi văn bản được hiển thị trong trò chơi hay không.Sử dụng lại các ký tự trong tập tin .exe

Tôi rất ngạc nhiên khi nhìn thấy kết quả, mà tôi giờ đây đã tái sử dụng một hex-biên tập viên và DOSBox: enter image description here

Như có thể thấy, chỉnh sửa hai nhân vật "RO" trong chuỗi "Romero" dẫn trong 4 ký tự bị thay đổi, với kết quả trở thành "ZUMEZU". Có vẻ như chương trình đang sử dụng lại hai ký tự và in chúng ở đầu và cuối của chuỗi đó.

Nguyên nhân của việc này là gì? Đoán đầu tiên của tôi sẽ cố gắng làm cho tệp thực thi nhỏ hơn nhưng chỉ mã mà sử dụng lại các ký tự có thể sẽ cần nhiều không gian hơn 2 byte để lưu. Nó chỉ là một thủ thuật được thực hiện bởi các tác giả, hoặc chỉ là một số voodoo biên dịch?

Trả lời

5

Tricky để nói chắc chắn không có kỹ thuật đảo ngược, nhưng tôi đoán là rất nhiều dữ liệu cố định trong chương trình được nén bằng thuật toán từ LZ family. Các lược đồ nén này hoạt động chủ yếu theo cách bạn đã quan sát: chúng mã hóa các phần tử lặp lại làm tham chiếu đến văn bản đã được giải mã trước đó.

Các thuật toán nén này có thể được sử dụng không chỉ cho một chuỗi này, và không chỉ cho văn bản; hoàn toàn có thể là chúng cũng được sử dụng để nén dữ liệu khác, chẳng hạn như đồ họa hoặc bố cục mức. Trong ngắn hạn, có lẽ có tiết kiệm đáng kể được thực hiện bằng cách sử dụng thuật toán này!

Việc sử dụng các thuật toán nén này phổ biến trong các trò chơi cũ như một cách tiết kiệm dung lượng đĩa, nhưng không tự động - việc triển khai thuật toán này có thể sẽ là thứ mà Romero tự thêm vào.

+0

Tương tự, có hai byte bổ sung giữa "SOFT" và "DISK, INC" - cũng là dấu hiệu điển hình của việc nén trước. – usr2564301

Các vấn đề liên quan