Mở đầu
Ở bài viết trước, chúng ta đã cùng nhau chinh phục 2 thử thách đầu tiên trong Cheat Engine Graphical Game Tutorial. Bài viết này sẽ tập trung vào thử thách cuối cùng, hứa hẹn nhiều điều mới mẻ và thử thách nâng cao hơn. Đây có lẽ là phần kết cho loạt bài viết hướng dẫn cơ bản về Cheat Engine của mình.
Phân tích thử thách
Đầu tiên chúng ta cùng nhìn sơ qua challenge là gì?
Giao diện thử thách này là một game 2D với một platform màu xanh lá giống như là mặt đất ở dưới và các platform khác ở cao hơn có màu đỏ. Chúng ta sẽ cần nhảy lên các platform màu đỏ để biến chúng thành màu xanh. Khi tất cả các platfrom đều là màu xanh thì cánh cửa kết thúc mới được unlock, tuy cửa được unlock rồi nhưng game sẽ troll chúng ta như thế này đây.
Khi ta chạm vào những mũi nhọn thì nhân vật của ta tan biến và game bắt đầu lại từ đầu. Vậy là chúng ta sẽ không thể hoàn thành challenge này nếu chơi theo cách thông thường rồi. Ta sẽ phải sử dụng CE và thử tìm cách làm theo những gợi ý của challenge như vô hiệu hóa đoạn code phát hiện va chạm với các mũi nhọn, làm cho nhân vật có thể bay, dịch chuyển tức thời, ...
Mục đích của challenge này là giúp chúng ta làm quen với những phương thức áp dụng CE trong game nhập vai nói chung, ta sẽ tìm các cách khác nhau giúp ta có thể chiến thắng challenge này nhẹ nhàng nhất có thể.
Giải quyết Step 3 CE graphical game tutorial
Trong challenge này chúng ta có thể nhấn phím space
để nhân vật nhảy lên, nhưng khi ta nhấn nhiều lần phím space
thì cũng không có tác dụng cho đến khi nhân vật chạm đất. Chắc chắn sẽ có một biến trạng thái nào đó quyết định nhân vật có thể nhảy được hay không. Đây luôn là điều đầu tiên mình nghĩ tới khi thử nghịch các game nhập vai nói chung. Theo phương pháp này, mình sẽ dùng CE scan biến trạng thái quyết định nhân vật có nhảy được hay không.
Hướng giải quyết là như vậy nhưng để thực hành và làm đúng những gì ta suy nghĩ thì cũng mất kha khá thời gian, chưa kể trong quá trình làm ta có thể gặp những vấn đề chưa rõ tại sao và phải quyết định sáng suốt để không bị hiểu sai và đi lệch hướng ban đầu.
Để tìm được biến trạng thái quyết định việc nhân vật của mình có thể nhảy được hay không, đầu tiên mình scan với Unknow initial value. Tiếp theo, mình đổi sang scan Unchanged value để giảm bớt tập kết quả địa chỉ. Tiếp đến là khúc quan trọng nhất, trong CE đổi sẵn sang scan Changed Value, trong game nhấn phím space
để nhân vật nhảy lên, trong thời gian nhân vật chưa chạm đất nhanh tay chọn Next scan
, lần scan này chính là scan cho việc trạng thái nhân vật chuyển từ có thể nhảy sang không thể nhảy. Sau khi scan ở bước trước và nhân vật của mình đã chạm đất, ta tiếp tục scan với Changed value một lần nữa, lần này là scan trạng thái nhân vật từ không thể nhảy sang có thể nhảy, lúc đầu mình đã bỏ quên bước này, sau một hồi suy nghĩ mình mới ngẫm ra. Ngoài ra, nếu cảm thấy tốc độ trong game quá nhanh thì CE cung cấp cho ta tính năng speed hack
giúp tăng giảm tốc độ trò chơi, bạn chỉ cẩn giảm tốc độ trò chơi xuống thì việc scan sẽ dễ dàng hơn, không quá phụ thuộc vào tính năng pause của mỗi trò chơi nữa, chú ý chỉ dùng với game offline thôi nha, game online mà dùng tính năng này là hôm sau bị ban nick luôn he.
Lúc này thì địa chỉ kết quả đã giảm đi rất nhiều rồi, nếu bạn đọc muốn chính xác hơn nữa thì có thể scan với Unchanged value thêm một vài lần nữa. Còn mình nhìn ngay ra một địa chỉ ... chứa value 0 và 1, trong game khi nhân vật nhảy lên thì value là 1, còn khi nhân vật đứng yên trên platform thì value là 0. Mình thử freeze value của địa chỉ này luôn luôn là 0 thì đã có thể nhảy trên không trung được rồi, nhưng vẫn khá là khó điều khiển, vì code change value từ 0 sang 1 vẫn còn và hoạt động cùng với thread freeze value của CE, ta phải sử dụng code injection để hành động nhân vật được mượt mà hơn và đây là thành quả của mình khi sửa đoạn code mov byte ptr [rbx+7C],01
thành mov byte ptr [rbx+7C],00
Vậy là ta gần như có thể bay được rồi, nhưng như vậy thì ta vẫn chưa thể chiến thắng trong challenge này. Trong quá trình tìm biến trạng thái nhảy, mình còn thấy luôn một vài địa chỉ chứa value là một số khá lớn thay đổi theo độ cao của nhân vật so với mặt đất, chắc đây là giá trị tọa độ Y (chiều cao) rồi. Vì đây là game 2D nên hệ tọa độ chỉ có 2 chiều, nếu là game 3D thì hệ tọa độ có thêm một vector nữa và còn có cả các vector direction chỉ hướng di chuyển, hướng nhìn của nhân vật nữa, phức tạp hơn game 2D khá nhiều.
Quay lại với thử thách của chúng ta, như đã phân tích ở trên mọi object trong game sẽ đều có tọa độ của riêng nó vậy nên ta có thể tìm giá trị tọa độ của những mũi nhọn và freeze lại. Như vậy, các enemy sẽ không thể di chuyển về cánh cửa để cản ta nữa. Việc tìm địa chỉ tọa độ của những mũi nhọn này thì có phần dễ hơn tìm địa chỉ trạng thái nhảy của nhân vật, bạn đọc có thể sử dụng nút pause
trong game giúp việc tìm địa chỉ dễ dàng hơn. Nhưng freeze tọa độ vẫn chưa thể ngăn cản các mũi nhọn chặn cửa, ta còn phải theo dõi khi các mũi nhọn chặn cửa thì đoạn code nào cập nhật tọa độ của các mũi nhọn và sửa chúng thành nop. Ví dụ như hình dưới mình đã freeze hoàn toàn được mũi nhọn phía trên cao và có thể tiếp cận mục tiêu cuối rồi:
Bây giờ thì chúng ta có thể chiến thắng thử thách này rồi, nếu có thời gian thì bạn có thể tìm thêm địa chỉ quyết định cửa có khóa hay không nữa, nhưng sẽ mất khá nhiều thời gian vì ta phải làm các platform màu xanh hết thì cửa mới mở mà. Nhưng một khi đã tìm ra thì ta sẽ không quá cần thiết freeze các mũi nhọn nữa vì mũi nhọn chỉ di chuyển chặn cửa khi tất cả các platform chuyển thành màu xanh, trong khi đó ta lại có thể mở cửa mà không cần quan tâm đến các platform.
Cuối cùng, khi game đã trở nên dễ dàng rồi, chúng ta sẽ tìm đoạn code phát hiện va chạm giữa nhân vật và enemy để thực sự trở thành god
trong challenge này. Đây có lẽ là phần khó nhất, vì nhân vật chạm vào kẻ địch là sẽ tan biến luôn, không có chỉ số HP để ta scan nữa. Nhưng để ý kỹ thì tọa độ (theo chiều ngang) điểm va chạm với địch luôn nằm phía bên phải tọa độ (theo chiều ngang) điểm nhân vật của ta bắt đầu. Vậy trước hết ta tìm giá trị tọa độ X của nhân vật, thêm vào cửa sổ địa chỉ ở phía dưới, nhấn chuột phải chọn Browse this memory region
để mở cửa sổ Memory Viewer
. Ta có thể thấy các giá trị của chương trình thay đổi một cách trực quan từ cửa sổ phía dưới của Memory Viewer
.
Quan sát ta thấy có 2 ô địa chỉ gần giá trị X của nhân vật có dạng kiểu boolean thay đổi khi xảy ra va chạm. Thêm 2 địa chỉ này vào danh sách địa chỉ của CE, sau một hồi test thử thì mình nhận ra 2 địa chỉ này đại diện cho thuộc tính IsDead
và IsVisible
của nhân vật. Tiếp tục xem xét sâu hơn biến IsDead
ta sẽ thấy đoạn code xác định va chạm. Chỉ cần sửa đoạn code cmp byte ptr [rbx+40], 00
thành cmp byte ptr [rbx+40], 01
là ta có thể đi qua những mũi nhọn như không có gì xảy ra.
Bypass integrity check
Trong quá trình giải các thử thách trong CE graphical game tutorial, nhiều khi ta thấy title của game window sẽ hiện thêm dòng chữ integrity check error
. Những lúc như này ta sẽ thấy chương trình giật lag hơn bình thường khá nhiều, vì vậy mình quyết định tìm địa chỉ liên quan đến việc hiển thị này. Qua thử nghiệm mình nhận ra chỉ cần sửa đổi assembly code của game thì sẽ xuất hiện lỗi integrity check, còn trả lại giống như ban đầu thì dòng chữ sẽ biến mất. Vì thế mình đã viết một CE script giản và scan địa chỉ integrity check này bằng cách active/deactive CE script.
Hóa ra luôn có một đoạn code liên tục check tính toàn vẹn của process CE game tutorial. Tìm được địa chỉ của đoạn code này rồi thì ta chỉ việc sửa thành nop thôi. Đây là một ví dụ đơn giản của game guard hay anti-cheat của các game thực tế.
Kết luận
Vậy là chúng ta đã giải quyết hết các tutorial và challenge từ chính chủ Cheat Engine. Hy vọng qua loạt bài viết này, bạn đọc đã nắm được những kiến thức cơ bản nhất về Cheat Engine và có thể tự mình khám phá thêm những tính năng thú vị khác của công cụ này. Cheat Engine không chỉ là công cụ để "hack game" mà còn là một công cụ hữu ích cho lập trình viên debug, phân tích game, thậm chí là tạo ra những bản mod độc đáo.
Việc sử dụng Cheat Engine một cách hiệu quả và có trách nhiệm phụ thuộc hoàn toàn vào người dùng. Hãy luôn nhớ rằng, mục đích chính của việc sử dụng Cheat Engine là để học hỏi, nghiên cứu và giải trí lành mạnh. Đừng sử dụng Cheat Engine để gây ảnh hưởng đến trải nghiệm của người chơi khác trong môi trường online.
Chúc bạn đọc có những giờ phút vui vẻ với Cheat Engine!