Mở đầu
Nhân dịp đầu xuân Giáp Thìn chúc các bạn đọc dồi dào sức khỏe, chúc các bóng hồng trong làng IT luôn trẻ trung, xinh đẹp 🥰
Tiếp nối bài viết hướng dẫn cơ bản về Cheat Engine, bài viết này chúng ta sẽ cùng tìm hiểu về multi-level pointers cũng như cách sử dụng Pointer Scan trong CE. Có thể bạn sẽ thắc mắc tại sao mình không làm tiếp step 7 trong CE tutorial mà nhảy sang step 8 luôn, lý do vì mình muốn đi từ chủ đề đơn giản đến phức tạp, để giải quyết step 7 (code injection) có thể rất đơn giản nhưng để áp dụng vào thực tế thì bạn sẽ cần đọc hiểu code assembly và cơ chế injection.
Multi-level pointers là gì?
Quay lại khái niệm con trỏ đã nêu ở phần 1, con trỏ là một biến mà giá trị của nó là địa chỉ của một vùng nhớ. Nếu vùng nhớ này lại chứa địa chỉ của một vùng nhớ khác nữa thì sẽ tạo nên cấu trúc dữ liệu liên kết nhiều lớp. Hình ảnh minh họa ở phần trước chính là một ví dụ của multilevel pointer.
Địa chỉ tương đối và địa chỉ tuyệt đối
Trong CE ta luôn đề cập đến khái niệm địa chỉ (bộ nhớ RAM), tiếp theo đây ta sẽ tìm hiểu 2 khái niệm địa chỉ tương đối và địa chỉ tuyệt đối để hiểu rõ hơn địa chỉ được hiển thị trong CE.
- Địa chỉ tuyệt đối chính là địa chỉ ô nhớ duy nhất của bộ nhớ RAM, nó giống như vị trí của bạn trên Google map vậy.
- Địa chỉ tương đối là là địa chỉ được biểu diễn tương đối so với một vị trí xác định nào đó. Ví dụ căn nhà có số nhà là 3 trong một con phố X thì số nhà này là địa chỉ tương đối vì chỉ khi ta đến phố X ta mới dùng đến số nhà để xác định vị trí. Số 3 này còn gọi là
Offset
.
Trong CE nếu một địa chỉ là địa chỉ tĩnh (là địa chỉ tương đối, không thay đổi mỗi lần chạy chương trình) thì thường sẽ có dạng: ["ProgramName.exe"+XXXXXX]
và đóng vai trò là base pointer. Mặc định CE sẽ pin những địa chỉ tĩnh (địa chỉ được pin có màu xanh lá và được cập nhật liên tục).
Thực hành Step 8 trong CE tutorial (Password: 525927)
Mở CE lên chọn Help chọn Cheat Engine Tutorial (x86_64) rồi nhập Password ở trên ta sẽ chuyển thẳng tới step 8. Vì tutorial ở mức giới thiệu cho người mới nên sẽ hướng dẫn ta tìm dần dần từng con trỏ đến khi tìm thấy được base address (được hiển thị với màu xanh lá) để giúp ta hiểu bản chất.
Nhưng để giải quyết challenge này một cách chuyên nghiệp hơn, mình sẽ hướng dẫn các bạn cách sử dụng Pointer Scan trong CE. Đầu tiên vẫn là tìm địa chỉ của giá trị ta nhìn thấy, ta dễ dàng tìm được địa chỉ này là 014C3FC8
. Double click to add in address list, click chuột phải vào chọn Generate pointermap
.
Một hộp thoại lưu file hiện ra, mình đặt tên file cần lưu là CETutStep8.scandata
.
Tắt CE Tutorial đi rồi mở lại, attach CE vào process của CE Tutorial và thực hiện tìm địa chỉ của giá trị mới ta nhìn thấy trong CE Tutorial. Như mình tìm được là 000A6098
. Double click to add in address list, click chuột phải vào chọn Pointer scan for this address
.
Hộp thoại Pointerscanner scanoptions
xuất hiện, tick chọn Compare results with other saved pointermap(s)
và chọn file CETutStep8.scandata
đã lưu trước đó như hình dưới đây:
Nhấn OK và chọn tên file muốn lưu, mình đặt là CETutStep8.PTR
. Đợi CE scan và so sánh hai pointermap xong thì kết quả xuất hiện, chỉ còn duy nhất một multilevel pointer.
Double click vào pointer "Tutorial-x86_64.exe"+00325B00
này để add to address list, change value to 5000 và freeze lại. Qua bên CE Tutorial click button Change Pointer
sau 3s thì button Next
được enable, hoàn thành bước 8.
Thực hành tìm pointer của giá trị HP trong game Naruto: Ninja Way 9
Trong game thực tế rất hiếm trường hợp chúng ta scan pointer và tìm được duy nhất một pointer như CE Tutorial Step 8. Nào, chúng ta cùng làm một ví dụ Real World hơn qua game Naruto: Ninja Way 9
, game rất nhẹ chỉ ~9MB và có sẵn trên internet. Hồi nhỏ không biết cách combo các nhân vật muốn test thử thì máy đấm ác quá khó test mà vào chế độ trainning thì thầy Kakashi chỉ toàn đứng yên thôi 😂
Nhưng bây giờ ta đã biết dùng CE, ta sẽ đóng băng HP và bot máy tha hồ đánh hehe. Xác định mục tiêu là giá trị HP của nhân vật P1 điều khiển, ta sẽ chọn mode 2-P
=> Duel
trong game để dễ dàng control HP và thực hiện Scan. Mình chọn P1 là Naruto và P2 là Sasuke, chọn bối cảnh và vào game thôi.
Quay sang CE ta attach vào process của game. Ta chọn tìm giá trị HP của P1 ở đây là HP của Naruto. Đầu tiên ta thực hiện Unknown initial value scan
với First scan
sau đó kết hợp giữa Decreased value
và Unchanged value
để tìm ra địa chỉ chứa HP hiện tại của Naruto. Tiếp theo là generate pointermap cho địa chỉ 0F5EEB70
tìm được, lưu lại với tên là pointermap1.scandata
Như thực hiện với CE Tutorial, ta khởi động lại game, attach CE vào process game và lặp lại các bước scan tìm địa chỉ chứa HP của Naruto ta tìm được địa chỉ 0F932344
. Right click chọn Pointer scan for this address
.
Tick Compare result with other saved pointermap(s)
và chọn file pointermap1.scandata
, cột Address để 0F5EEB70
giống với địa chỉ đã tìm được lần trước. Nhần OK chọn tên tệp lưu kết quả là result.PTR
và đợi CE thực hiện scan.
Kết quả có đến 370 pointer thỏa mãn điều kiện chứ không còn là 1 như trong tutorial nữa.
Để ý rằng trong game khi ta quay về màn hình chính thì cột Points to
vẫn không refresh, đáng lẽ ra bây giờ chúng không chứa địa chỉ giá trị HP nữa. Để refresh cửa sổ Pointer scan: result.PTR
, right click chọn resync modulelist
, chúng ta sẽ cần refresh cửa sổ này thường xuyên theo game để xem giá trị chính xác của cột Points to
.
Kết quả 370 pointer vẫn là khá nhiều, để lọc bớt tiếp các kết quả ta sẽ thử vào các chế độ chơi và chọn bối cảnh khác, chỉ cần chọn đúng player P1 là Naruto là được. Sau khi vào game, refresh cửa sổ kết quả sẽ thấy phần lớn giá trị trong cột Point to
sẽ có một địa chỉ, ví dụ của mình là 0F5F21D8
, ghi nhớ địa chỉ này. Ở menu Pointer scanner
chọn Rescan memory - Remove pointer not poiting to the right address
.
Cửa sổ Rescan pointerlist
xuất hiện với option Address to find:
mặc định, ta điền giá trị 0F5F21D8
và nhấn OK.
Sau khi rescan một vài lần thì danh sách kết quả của mình chỉ còn 49 kết quả như hình dưới.
Nếu bạn scan kỹ hơn thì danh sách sẽ càng chính xác với nhiều mode trong game hơn còn mình sẽ dừng ở đây, cũng đủ dùng rồi. Bây giờ chọn một pointer bất kỳ trong list (thường mình sẽ chọn pointer với ít Offset nhất) và double click để add to address list. Freeze value của pointer này lại
Kết luận
Bài viết này đã hướng dẫn bạn cách sử dụng Pointer Scan trong Cheat Engine để tìm kiếm và thay đổi giá trị của các biến trong game. Vậy là sau này khi muốn test các nhân vật trong game Naruto: Ninja Way 9 chúng ta không cần phải thực hiện scan thủ công để tìm giá trị HP nữa mà có thể load file Cheat Table (.CT) chứa sẵn các Pointer trỏ tới giá trị mong muốn rồi. Để test game thuận tiện hơn ta có thể tìm thêm giá trị Stamina (thanh năng lượng của nhân vật), sau đó là các nhân vật khác nữa (sau một hồi nghịch thử thì mình nhận ra mỗi nhân vật sẽ có chỉ số khác nhau).
Chúc bạn đọc năm nay sẽ học tập nhiệt tình và chơi cũng hết mình, thân!