Mở đầu
Sau khi hoàn thành step 9 trong CE tutorial chúng ta được chuyển sang một process mới: CE Game tutoritals
. Đây là phần mới được thêm vào Cheat engine trong những phiên bản gần đây, bao gồm 3 thử thách. Những thử thách này được thiết kế giống như một game có đồ họa chứ không chỉ là các dòng chữ và nút bấm có phần khô khan như CE tutorial nữa. Có thêm hứng thú rồi, chúng ta cùng thực hành những kiến thức đã học từ CE tutorial để giải quyết các thử thách mới nào. Bài viết này mình sẽ giải quyết 2 thử thách đầu tiên.
Thực hành Step 1 trong CE Game tutorials
Challenge 1 hiện ra với 2 object: một bia hình tròn phía trên và một hình khá giống một con tàu vũ trụ phía dưới mà ta có thể bắn đạn bằng phím space
. Số đạn hiển thị ở phía bên phải con tàu, ta chỉ có thể bắn 5 viên đạn liên tục, hết 5 viên sẽ phải chờ nạp đạn mới có thể bắn tiếp được. Ngay khi ta tiến vào trạng thái nạp đạn thì bia phía trên sẽ miễn nhiễm sát thương và hồi đầy máu, nhưng khi bắn đến viên thứ 5 mà mục tiêu vẫn chưa hết máu. Vậy là ta sẽ không thể bắn hạ được mục tiêu này theo cách thông thường rồi.
Ý tưởng vượt qua cơ chế bất tử của bia mục tiêu theo mình là phải tiêu diệt nó trong khi vẫn còn đạn, sẽ có rất nhiều cách có thể áp dụng như là tăng số lượng đạn có thể bắn trong một lần thay đạn hay đóng băng số đạn, tăng sát thương của đạn hay khiến máu của bia chỉ còn lại rất ít. Trong các ý tưởng thì mình chọn cách chỉnh sửa HP của mục tiêu cho đơn giản.
Trong CE thực hiện First Scan với Unknown initial value, bắn 1 viên đạn để giảm HP của mục tiêu, sau đó là Next Scan với Decreased value, nếu mục tiêu hồi đầy máu thì ta chuyển thành Next Scan với Increased value và lặp lại đến khi tìm ra địa chỉ chứa HP của mục tiêu. Tiếp theo thêm địa chỉ này vào Cheat Table và sửa giá trị HP của mục tiêu thành 1 (lưu ý sửa lúc số đạn của tàu vũ trụ lớn hơn 1) và bắn một phát đạn là tiêu diệt được mục tiêu.
Thực hành Step 2 trong CE game tutorial
Challenge 2 chúng ta vẫn điều khiển tàu vũ trụ, thậm chí còn có thể tiến lên với phím W
. Kẻ địch là 2 tàu khác có nhiều máu hơn ta, khi ta bắn đạn thì địch cũng bắn và ta sẽ nhận lại x2 sát thương 🤕.
Đầu tiên ta thử tìm HP của mình, freeze lại thấy tàu ta đã có thể tấn công địch mà không mất máu.
Nhưng khi tiêu diệt một kẻ địch thì kẻ địch còn lại sẽ khởi động mega bom có sát thương vô hạn và tự động đuổi theo tàu của ta. Vậy là cách đóng băng HP không được rồi, ta sẽ phải dùng đến code injection, cụ thể là chỉnh sửa logic cập nhật HP của mình. Right click vào địa chỉ HP của tàu ta, chọn Find out what write to this address, qua game nhận ít sát thương thì ta thấy chỉ có một đoạn code write HP xuất hiện sub [rax+60],edx
. Thử Replace do nothing đoạn code này lại thấy cả tàu mình và 2 tàu địch không nhận sát thương nữa. Đoạn này có phần giống với CE tutorial step 9, ta sẽ tìm cách phân biệt giữa mình và địch và sử dụng code injection để khiến đoạn code update HP không ảnh hưởng đến mình.
Ta sẽ sử dụng tính năng Commonality scanner của CE để xác định teamId
và địa chỉ của nó (bao gồm thanh ghi và offset), sau đó dùng địa chỉ này (rax+70) để viết code assembly inject vào game. Đoạn code mình dùng để giải quyết challenge này như sau:
[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048,"gtutorial-x86_64.exe"+400E3) label(returnhere)
label(mylogic)
label(enemylogic)
label(exit) newmem: //this is allocated memory, you have read,write,execute access
//place your code here
cmp [rax+70],0 //so sánh giá trị của [rax+70] với 0 (check có phải là tàu mình không)
je mylogic //jump if equal, nếu bằng thì jump đến code block mylogic
jne enemylogic //jump if not equal, nếu không bằng thì jump đến code block enemylogic
jmp exit // enemylogic:
sub [rax+60],edx
ret add [rax],al mylogic:
ret
add [rax],al exit:
jmp returnhere "gtutorial-x86_64.exe"+400E3:
jmp newmem
nop
returnhere: [DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"gtutorial-x86_64.exe"+400E3:
db 29 50 60 C3 00 00
//sub [rax+60],edx
//ret //add [rax],al
Đoạn code trên đã có thể giải quyết được challenge rồi nhưng khi quay ảnh gif demo cho mọi người thấy bắn lâu quá nên mình đã chỉnh thêm logic trừ máu của enemy sub [rax+60],edx
, thay edx
thành một giá trị cố định, 9 chẳng hạn, vậy là sát thương của tàu ta đã lớn hơn rất nhiều rồi 😁
Kết luận
Bài viết này là phương pháp mình dùng để giải quyết các thử thách, chắc chắn sẽ còn nhiều cách làm khác nữa. Bạn đọc có thể tham khảo những solution khác để tìm cho mình cách làm phù hợp với bản thân. Ví dụ solution trên github này https://github.com/Jim00000/Cheat-Engine-Tutorial-Games-Cheat-Table tác giả đã hoàn toàn dùng code injection để giải quyết các challenge một cách điệu nghệ, chúng ta hoàn toàn có thể import Cheat Table từ repository này và đọc code mà tác giả viết để học hỏi.
Như đã đề cập ở bài viết trước, tutorial game này được CE tạo ra để chúng ta có thể hack, khi sử dung CE với những ứng dụng hay game khác thì kết quả sẽ rất khác nhau tùy thuộc vào từng game. Điều chúng ta cần làm là kiên nhẫn tìm hiểu dần dần những hiện tượng xảy ra để hiểu cơ chế hoạt động của game và cũng là nâng cao hiểu biết về IT nói chung.
Hy vọng bài viết này đã giúp bạn giải mã 2 thử thách đầu trong Cheat Engine Graphical Game Tutorial và nâng cao kỹ năng và kiến thức IT của bạn.
Chúc các bạn thành công!