13/10/2018, 16:24

[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 ...

Ở 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

0