Bloger
Trở lại danh sách

Hướng dẫn hackgame với Cheat engine

August 11, 2021 18 min read

1.Giới thiệu về quét bộ nhớ

Muốn hack được game phải làm gì?

Đầu tiên và cũng là cơ bản nhất để hack được một game thì chúng ta phải quét bộ nhớ của game để tìm các giá trị muốn hack. Các game khi thực thi sẽ lưu thông tin như tiền, HP, MANA trong bộ nhớ. Vì vậy mình sẽ phải quét bộ nhớ để tìm ra các địa chỉ lưu các giá trị mà mình muốn hack. Sau khi tìm được địa chỉ các bạn có thể truy cập vào và sửa đổi nó như vậy là các bạn đã hack được game.

Quét bộ nhớ là bước quan trọng nhất để có thể hack được một game. Bạn hãy tưởng tượng bộ nhớ là một mảng byte lớn. mỗi phần tử trong mảng sẽ chứa giá trị. Phần mềm quét bộ nhớ sẽ chạy qua toàn bộ mảng này và lấy giá trị của mỗi phần tử ra so sánh với giá trị chúng ta tìm.

Tuy nhiên bộ nhớ của trò chơi rất lớn nên khi quét sẽ có rất nhiều giá trị giống nhau, con số này rất lớn có thể lên tới hàng triệu kết quả. Bạn không thể biết được chính xác đâu là địa chỉ mình cần tìm. Do đó để loại bỏ những giá trị không liên quan phần mềm quét bộ nhớ sẽ cho bạn quét lại danh sách kết quả để loại bỏ những giá trị không mong muốn. Việc bạn cần làm là làm cho giá trị thay đổi và lọc lại kết quả một lần nữa.

Ví dụ:

Level trong game của bạn là 10. Bạn quét nó ra 200 kết quả. bạn không thể biết trong 200 kết quả này đâu mới là địa chỉ lưu level của bạn. Bạn cần phải thay đổi level của bạn để quét lại. Bạn cày lên level 11. lúc này giá trị lưu level trong bộ nhớ sẽ chuyển sang 11. Bạn sẽ quét lại trong 200 kết quả đó cái nào có giá trị là 11. cứ như vậy bạn sẽ rút ngắn được số kết quả và bạn sẽ tìm được địa chỉ lưu level.

Đoạn mã giả sau mô tả một chương trình tự động tăng HP khi HP thấp hơn 500

int health = readMemory(game, HEALTH_ADDRESS)
if(health < 500){
    pressButton(HEALTH_BUTTON)
}

Phần mềm quét bộ nhớ sẽ giúp bạn tìm ra HEALTH_ADDRESS để chương trình có thể đọc được giá trị tại địa chỉ này.

Ở phần sau mình sẽ hướng dẫn các bạn sử dụng phần mềm để quét bộ nhớ cơ bản.

2.Quét bộ nhớ cơ bản

Ở bài số 2 này mình sẽ hướng dẫn các bạn quét bộ nhớ cơ bản bằng phần mềm Cheat Engine các bạn có thể tải nó tại đây. Sau khi tải về các bạn cài đặt như bình thường và mở nó lên. giao diện nó sẽ như thế này.

Để bắt đầu quét bộ nhớ của game, hãy nhấp vào biểu tượng ở mục số 1 để đính kèm game muốn hack vào. Một cửa sổ hiện lên các bạn chọn game muốn hack sau đó nhấn vào nút Open. Sau đó các bạn nhập giá trị muốn quét vào ô ở mục số 3. Và chọn kiểu quét ở mục số 4.

Scan Types

Ở mục số 4 Cheat Engine cho phép bạn thay đổi 2 tùy chỉnh là Scan Type và Value Type.

Scan Type cho bạn chọn các cách so sánh giá trị trong bộ nhớ. Ở lần đầu tiên quét nó sẽ có các tùy chọn sau:

  • Exact Value: Trả về các giá trị bằng với giá trị muốn tìm. Chọn tùy chọn này khi bạn biết chính xác giá trị muốn tìm. HP, Mana, level thường sử dụng kiểu quét này.
  • Bigger Than: Trả về các giá trị lớn hơn so với giá trị muốn tìm. Thường sử dụng để tìm các giá trị tăng đều như chức năng đếm thời gian tăng.
  • Smaller Than: Trả về các giá trị nhỏ hơn so với giá trị muốn tìm. Nó giống như Bigger Than và nó sử dụng trong trường hợp thời gian đếm ngược.
  • Value Between: Trả về các giá trị nằm giữa hai giá trị muốn quét. Tùy chọn này là sự kết hợp của Bigger Than và Smaller Than. Khi bạn chọn tùy chọn này thì ở mục số 3sẽ chuyển thành 2 ô cho phép bạn nhập vào 2 giá trị.
  • Unknown Initial Value: Trả về tất cả địa chỉ trong bộ nhớ của game. Tùy chọn này thường sử dụng để tìm những thứ bạn không biết lưu trong bộ nhớ là gì như Item, Quái vật, NPC. Khi chọn tùy chọn này thì mục ở ô số 3 sẽ bị ẩn đi. Vì nó lấy toàn bộ địa chỉ trong bộ nhớ nên không cần điền gì vào cả.

Ở ô Value Type cho phép bạn chọn kiểu dữ liệu mà bạn muốn tìm kiếm.

Quét bộ nhớ lần đầu tiên

Sau khi xác định được Scan Type và Value Type muốn quét. Các bạn chọn vào nút First Scan ở mục số 2. Các kết quả tìm được sẽ được hiển thị vào mục số 5. Ở trong mục số 5 này nó có 2 loại địa chỉ, một cái màu xanh lá cây và một cái màu đen. Cái địa chỉ màu xanh lá cây là địa chỉ tĩnh. Giá trị của nó sẽ không bị thay đổi khi khởi động lại game. Còn địa chỉ màu đen là địa chỉ động. Nó sẽ được cấp phát khi chương trình chạy và sẽ bị thay đổi khi game khởi động lại. Các bạn để ý trong mục số 5 nó có 3 cột.

Cái ô mình khoanh đỏ là số giá trị tìm thấy.

  • Address: là địa chỉ trong bộ nhớ
  • Value: là giá trị đang chứa trong địa chỉ đó. Giá trị này được cập nhật liên tục. Nếu giá trị này bị thay đổi nó sẽ chuyển sang màu đỏ.
  • Previous: là giá trị của lần quét trước đó.

Quét lần tiếp theo

Sau khi quét bộ nhớ lần đầu tiên thì nút Next Scan ở mục số 2 sẽ được bật lên, và Ô Scan Type ở mục số 4 sẽ có thêm các tùy chọn mới để giúp bạn thu hẹp các kết quả quét. Các tùy chọn mới như sau:

  • Increased Value: Trả về các giá trị đã tăng lên so với trước đó. Tùy chọn này bổ sung cho Bigger Than. Nó sẽ trả về nếu giá trị hiện tại lớn hơn so với lần quét trước đó.
  • Increased Value By: Trả về các giá trị đã tăng lên một số chính xác. Ví dụ như giá trị hiện tại tăng lên 20 so với lần quét trước đó. Sử dụng tùy chọn này các bạn phải biết chính xác số lần tăng lên.
  • Decreased Value: Tùy chọn này ngược lại với Increased Value
  • Decreased Value By: Tùy chọn này ngược lại với Increased Value By
  • Changed Value: Trả về các giá trị đã thay đổi so với lần quét trước đó. Loại này sử dụng khi bạn biết nó đã thay đổi nhưng không biết nó tăng hay giảm.
  • Unchanged Value: Trả về các giá trị không thay đổi so với lần quét trước đó. Loại này thường được sử dụng để giảm bớt các giá trị sai. Ví dụ bạn đang level 10. Bạn quét ra 1 triệu kết quả. Sau đó bạn di chuyển. các giá trị bị thay đổi nhưng level của bạn vẫn là 10. khi đó các giá bị bị thay đổi sẽ bị loại bỏ
  • Compare to first scan: bình thường khi quét lại Cheat Engine sẽ so sánh với lần quét trước đó. Khi bạn chọn tùy chọn này nó sẽ so sánh với kết quả ở lần quét đầu tiên.

Công việc của bạn là áp dụng các tùy chọn này để thu hẹp kết quả xuống đến khi còn 1 kết quả. Nhưng đời không như mơ đôi khi các bạn quét hoài nó cũng không xuống được 1 kết quả. Lúc này bạn phải thử từng kết quả 1.

Ví dụ bạn đang tìm HP của nhân vật trong game. Và bạn quét hoài nó cũng chỉ xuống được 10 địa chỉ bạn không thể làm nó xuống được nữa. lúc này bạn cần thử từng địa chỉ một. bạn thay đổi giá trị tại địa số 1 trong 10 địa chỉ. Sau đó nhìn lại vào game và nếu thấy HP thay đổi theo giá trị bạn đã sửa thì địa chỉ đó chính là địa chỉ chứa HP nếu không thay đổi bạn sẽ thử tiếp các giá trị còn lại đến khi tìm ra.

Cheat Table

Vậy làm sao để chỉnh sửa được giá trị tại một địa chỉ. Bạn chỉ cần nhấn đúp vào nó lúc này địa chỉ đó sẽ được đưa xuống mục số 6.

Ở mục số 6 sẽ có các cột sau:

  • Active: Khi bạn check vào cột này giá trị ở cột đó sẽ bị đóng băng. Bạn có thể check vào cột này để kiểm tra thay vì sửa địa chỉ. Ví dụ như bạn đang HP 100 bạn check vào nó để đóng băng lúc này bạn có bị quái đánh cũng không tụt HP.
  • Description: Cột này để mô tả. bạn có thể nhấn đúp vào nó để sửa mô tả.
  • Address: Cột này là địa chỉ
  • Type: Kiểu dữ liệu
  • Value: giá trị tại địa chỉ. Bạn có thể nhấn đúp để sửa giá trị

Bạn có thể lưu lại các giá trị mà bạn đã tìm ra trong mục số 6 bằng cách nhấn File > SaveHoặc File > Save as. Để mở các file đã lưu các bạn chọn File > Load.

Sử dụng với game online có được không?

Cheat Engine thay đổi giá trị trong bộ nhớ để hack được game. Nhưng trong hầu hết các game online các giá trị này được điều khiển bởi server và chuyển đến máy của bạn thông qua internet do đó chỉnh sửa giá trị chỉ làm thay đổi giá trị tại máy của bạn trên server không bị ảnh hưởng do đó để hack được game online bạn cần phải có kiến thức cao hơn. đối với game offline thì bạn có thể sửa đổi các giá trị này theo ý muốn của mình.

Như vậy là các bạn đã biết cách sử dụng Cheat Engine để quét bộ nhớ. Các bạn có thể kiếm một số game offline nhỏ để thử nghiệm.

[Hack Game] 3. Giới thiệu con trỏ

Ở phần trước mình đã đề cập tới địa chỉ tĩnh (xanh lá cây) và địa chỉ động (màu đen). Đa số các giá trị trong game như HP, Mana đều là địa chỉ động. khởi động lại game là sẽ bị thay đổi, Nhiều khi không cần khởi động lại nó cũng thay đổi nữa cơ. Vấn đề đặt ra là chẵng lẽ mỗi lần hack lại phải đi quét lại bộ nhớ. Lúc này ta cần sử dụng tới con trỏ (pointer).

Vậy con trỏ là gì?

Nó rất là đơn giản. một địa chỉ bình thường sẽ chứa giá trị còn một địa chỉ con trỏ nó sẽ chứa địa chỉ của thằng khác. có thể trỏ nhiều cấp. A trỏ tới B trỏ tới C

Tại sao phải dùng con trỏ?

các bạn hình dung như sau. trong game nó cấp phát bộ nhớ động để lưu HP thì nó phải sử dụng con trỏ để tìm đường tới được cái chỗ để lưu HP để lấy ra. lợi dụng điều này mình sẽ tìm con trỏ tĩnh (màu xanh) đang trỏ đến HP. lúc đó thì bạn có tắt đi mở lại con trỏ đó vẫn sẽ trỏ đến phần HP.

Các bạn nhìn vào hình sau. ví dụ khi chạy file game.exe thì địa chỉ của nó bắt đầu ở địa chỉ 0x00400000. sau đó nó sẽ thực hiện tuần tự lệnh và đến đoạn địa chỉ 0x00400010 nó sẽ trỏ tới đối tượng Player.

Vậy đường đi để tới được đối tượng player là Game.exe + 10 tương đương với 0x00400000 + 10. Cái này được gọi là Base Address. nó sẽ không thay đổi. bởi vì bạn có thể lấy được địa chỉ của Game.exe(Cách lấy chưa bàn ở đây) sau đó + 10 vào sẽ ra con trỏ trỏ tới đối tượng Player.

tiếp đến các bạn nhìn qua bên player các bạn thấy base address trỏ đến giá trị HP lúc này đường đi để lấy các giá trị như sau:

  • HP: "Game.exe" + 10 -> 0x004D4000 + 0
  • Mana: "Game.exe" +10 -> 0x004D400 + 4

tiếp đến là đường dẫn lấy tọa độ

  • X: "Game.exe" + 10 -> 0x004D4000 + 8 -> 0x004E4000 + 4
  • Y: "Game.exe" + 10 -> 0x004D4000 + 8 -> 0x004E4000 + 8
  • Z: "Game.exe" + 10 -> 0x004D4000 + 8 -> 0x004E4000 + C

Vì các đối tượng sẽ tạo các biến liên tiếp nhau nên các con trỏ sẽ trỏ vào đầu của đối tượng. sau đó cộng thêm để lấy địa chỉ tiếp theo. Cái này các bạn hay gọi là Offset đó.

Sau đây là một đoạn mã khai báo một chuỗi con trỏ:

list<int> chain = {start, offset1, offset2[, ...]};

cái start là địa chỉ base address.

Và đoạn mã sau là cách đọc một con trỏ:

int readPointerChain(chain) {
    ret = read(chain[0])
    for i = 1, chain.len - 1, 1 {
        offset = chain[i]
        ret = read(ret + offset)
    }
    return ret
}

Ở bài sau mình sẽ hướng dẫn các bạn quét con trỏ bằng Cheat Engine

[Hack Game] 4. Quét con trỏ bằng Cheat Engine

Quét con trỏ

Để quét con trỏ bạn cần phải có địa chỉ đã tìm thấy như HP từ đó bạn mới tìm con trỏ trỏ tới địa chỉ HP. Để quét con trỏ các bạn ấn vào địa chỉ muốn quét chọn Pointer scan for this address.

Sau khi ấn vào nó sẽ mở một cửa sổ như thế này.

đầu tiên các bạn check vào Show advanced options để show toàn bộ tùy chọn nâng cao. lúc đó giao diện nó sẽ như thế này

cái textbox đầu tiên các bạn nhập địa chỉ của ô HP. nó sẽ quét con trỏ đang trỏ tới chỉ này.

Các tùy chọn chính:

  • Addresses must be 32-bits aligned: tùy chọn này là chỉ quét con trỏ có địa chỉ chia hết cho 4. Sử dụng tùy chọn này có thể giúp bạn quét nhanh hơn. Nên bật
  • Only find paths with a static address: Chỉ tìm một chuỗi pointer trong đó có địa chỉ bắt đầu là tĩnh. Mục đích của chúng ta là tìm pointer tĩnh nên mục này phải luôn chọn.
  • Don’t include pointers with read-only nodes: Không lấy con trỏ chỉ đọc. Chọn tùy chọn này sẽ quét nhanh hơn và loại bỏ các giá trị rác. Nên chọn.
  • Stop traversing a path when a static has been found: Ngừng quét chuỗi con trỏ nếu đã tìm thấy địa chỉ tĩnh. Kích hoạt để tăng tốc độ quét.
  • Pointer path may only be inside this region: phạm vi quét từ from đến to. Nên để nguyên.
  • First element of pointerstruct must point to module: Chỉ lấy khi con trỏ đang trỏ vào đối tượng. Nên tắt
  • No looping pointers: kết quả không bị lặp ví dụ base->p1->p2->p3->p1.
  • Max level: Độ sâu khi tìm kiếm. tức là chiều dài của con trỏ tìm ra. nên 6 hoặc 7. càng sâu quét càng lâu. ví dụ độ sâu bằng 3 thì chuỗi con trỏ là: base->p1->p2.

Các tùy chọn theo tình huống:

  • Improve pointer scan with gathered heap data : Sử dụng heap để xác định giới hạn offset thay vì đoán nó.
  • Only allow static and heap addresses in the path: khi chọn sẽ không đoán offset nếu nó không phải là địa chỉ heap và bỏ qua nó.
  • Max different offsets per node : Giới hạn số kết quả cùng trỏ tới một địa chỉ ví dụ bạn nhập 3 nhưng nó ra 5 kết quả nó sẽ lấy 3 kết quả đầu tiên.
  • Allow stack addresses of the first thread(s) to be handled as static: Quét các tham số local trong chuỗi hàm được gọi. dùng để tìm các giá trị được sử dụng bởi hàm main. sử dụng khi không tìm thấy trong địa chỉ heap. cái này mình không hiểu lắm xem thêm ở đây
  • Stack addresses as only static address: Chỉ chấp nhận các địa chỉ trong ngăn xếp.
  • Pointers must end with specific offsets: Trong chuỗi con trỏ, offset cuối cùng phải bằng với số nhập trong tùy chọn này.
  • Nr of threads scanning Determines how many threads the scanner will use: Số luồng muốn sử dụng để quét. nhiều thì quét nhanh tùy cấu hình máy.
  • Maximum offset value: giá trị offset tối đa trong chuỗi con trỏ.

Sau khi xác định được các tùy chọn các bạn nhấn OK. thường thì mình để default.sau đó các bạn chọn nơi lưu file. nhớ chỗ lưu để còn rescaning lại.

Quét lại con trỏ

Cheat Engine cho phép bạn quét lại con trỏ để loại bỏ các kết quả sai. sau khi bạn quét con trỏ lần đầu tiên.

Để quét lại các bạn chọn như hình sau:

Một hộp thoại hiện lên như sau.

Loại bỏ các pointer bị thay đổi

Các bạn chọn Only filter out invalid pointers và Repeat rescan until stopped sau đó nhấn ok và lưu thành một file khác. Khi bạn làm như vậy nó sẽ tự động scan lại liên tục. nếu có một địa chỉ nào không trỏ đến địa chỉ ta tìm nữa sẽ bị bỏ đi. mục đích của việc này là để loại bỏ các giá trị sai. các bạn chạy khoảng vài phút rồi ấn Stop rescan loop để dừng.

Tắt game và quét lại

Vì bạn muốn kiếm pointer mà khi tắt game đi sau đó bật lại vẫn còn trỏ tới địa chỉ mà bạn muốn tìm nên cách tốt nhất là bạn tắt game đi sau đó mở lại. Ví dụ bạn đang tìm pointer cho HP. bạn tắt đi sau đó bạn mở lại game và tìm địa chỉ HP như bình thường. sau khi tìm thấy địa chỉ HP các bạn mở lại danh sách con trỏ ở lần trước rồi rescan lại xem trong list đó cái nào đang trỏ vào cái địa chỉ HP mới này. bạn cứ tắt đi làm lại vài lần lúc đó bạn sẽ thấy được pointer không bị thay đổi khi tắt. lúc đó bạn đã thành công.

Để mở rescaning lại từ màn hình chính của Cheat Engine các bạn nhấn ctrl+m sau đó nhấn ctrl+p. sau đó các bạn chọn file -> open chọn file mà bạn lưu ở trên (file số 2 đã loại kết quả rác). Trên menu các bạn chọn Pointer scan -> rescan memory.... sẽ hiện hộp thoại sau:

lúc này các bạn nhập địa chỉ của HP mới tìm lại vào textbox đầu tiên sau đó nhấn OK và lưu thành 1 file khác.

bạn làm như vậy vài lần để loại các địa chỉ bị thay đổi. bạn có thể lấy kết quả xuống thanh kết quả bằng cách nhấn đúp vào nó như hình sau:

Cách mình hay làm là mỗi lần quét lại mình lấy 10 địa chỉ xuống (ưu tiên lấy cái ít offset xuống trước) sau đó mở lại game nếu trong bảng kết quả nó vẫn đang trỏ đúng thì tắt đi bật lại vài lần. nếu thấy sai thì tiếp tục scan lại và lấy 10 kết quả xuống.

Như vậy là các bạn đã biết cách quét con trỏ. các bạn có thể thử một vài game nhỏ trước tiên nhé.

Cheat engine C++

Caught a mistake or want to contribute to this blog post? Edit this page on GitHub!