2009-09-10

Sử dụng Cheat Engine để search base address dùng cho auto play

Xem thêm  Sử dụng Detours để tìm lua_State cho AutoPlay

Có nhiều bạn hỏi mình cách viết auto. Source code và demo thì cũng đã có nhiều rồi. Nhưng sau cái vụ Tru Tiên đổi address trong version 24 thì nhiều bạn muốn tự mình chỉnh lại address cho nhanh chóng thì gặp khó khăn khi tìm lại các địa chỉ này dù rằng ai cũng biết sẽ cần dùng Cheat Engine.
Mình cũng chỉ giới thiệu sơ qua cách dùng Cheat Engine mà mình đã thực hiện cho cả những ai chưa quen cũng có thể thử được. Cách thực hiện cũng chỉ mấy bước và cũng không khó khăn gì.

Bước 1

Ví dụ bạn muốn search địa chỉ của HP, chúng ta đọc thông tin HP của nhân vật giá trị là 5111
Pic 1 thông tin HP 5111
Pic 1 thông tin HP 5111

Bước 2

Dùng cheat Engine chọn process và search giá trị này, là search lần đầu tiên "New Scan", giá trị là decimal ứng với HP, nên không check Hexa
Pic 2: search HP 5111
Pic 2: search HP 5111










Bước 3

Mình có rất nhiều kết quả search và thực hiện filter. Vào game tháo bớt đồ hay làm cách nào thay đổi lượng HP, ở đây mình còn 4715 máu nên bước filter mình chọn "Next Scan" với scan type là chính xác giá trị 4715 (tất nhiên có thể chọn scan type khác ví dụ bạn làm cách sao bị mất HP và chỉ cần chọn decrease tức giá trị HP giảm, nhưng nó lâu hơn)
Pic 3 kết quả search HP 5111

















Pic 4 tháo bớt đồ để thay đổi HP 4715



Pic 5 search HP mới 4715


Bước 4

Sau bước 3 mình còn 4 địa chỉ. Những địa chỉ này chỉ đúng trong game hiện tại đang chạy nên chúng ta không sử dụng được. Nhưng những địa chỉ này sẽ tham chiếu 1 địa chỉ không đổi theo 1 cách nào đó, gọi là base address cần tìm. Kinh nghiệm thì chúng ta nên để ý 2 địa chỉ gần nhau ở vùng chừng 0x09xxxxxx, vì mình biết 1 cái là HP và 1 cái là max HP cùng giá trị. Trước tiên 2 cái này vào khung kết quả bên dưới bằng cách double click hoặc select rồi nhấn button mũi tên nhỏ như trong hình. Nếu mang lại đồ thì max HP đổi còn HP thường ko đổi (trừ khi tự tăng HP).
Pic 6 sau khi filter còn 4 address ứng với 4715


Pic 7 thường HP và max HP gần nhau, base address ưu tiên địa chỉ nhỏ hơn, nhớ 2 địa chỉ này




Bước 5

Chọn một địa chỉ, giả sử mình chọn cái trên là HP (theo suy nghĩ thì cái dưới thường là max HP) rồi thực hiện "Find out what accesses this address" (những các gì truy cập tới địa chỉ này). Chỉ cần scan 1 cái thì cái kia tính theo offset, ở trên là 09xxxxBC tới 09xxxxD4.

Pic 8 thực hiện "Find out what accesses this address"



Sau khi có kết quả scan xong thì mình thực hiện chọn "More information" để có thêm thông tin. Mình không đi sâu vào chi tiết mấy cái thông tin này (nếu biết Assembly thì sẽ dễ hiểu ESI là gì). Mục đích là tìm được address thôi nên không cần tìm hiểu nhiều chỗ này. Hai thông tin cần quan tâm là cái dòng màu đỏ trong cửa sổ "More information" là offset 0x24C và giá trị địa chỉ cần tìm tiếp theo là 0x9A66F70

Pic 9 kết quả




Bước 6

Search địa chỉ kế tiếp. Mình sẽ check và hexa (đây là giá trị địa chỉ), và thực hiện "New Scan". Sau khi ra kết quả cũng có nhiều, mình sẽ lần lượt tìm kiếm vận may từ trên xuống, bắt đầu là 0x02DFFAC8. Sau khi lưu kết quả vào khung results thì mình lưu dạng pointer để có thể nhớ thêm thông tin offset 0x24C.

Pic 10 search tiếp address 0x9A66F70



Pic 11 lưu lại và chuyển thành dạng pointer






Công việc tiếp vẫn là scan "Find out what accesses this address". Nếu scan với pointer khi hiện dialog mình sẽ chọn "Find out what accesses this pointer". Tiếp tục lần theo đầu mối này

Pic 12




Bước 7

Cũng như bước 5 sang bước 6, tại đây mình sẽ có danh sách kết quả.

Pic 13


Đáng chú ý là có một dòng màu xanh lá trên cùng, điều đó cho biết là địa chỉ đó sẽ dẫn đến base address. Tất nhiên mình sẽ thực hiện search ưu tiên địa chỉ đó.

Pic 14 xuất hiện address xanh lá, ưu tiên lần theo address đó. Kết quả search address xanh lá.






Công việc vẫn là kiểm tra tiếp ưu tiên address có đánh dấu màu, đến lúc này cảm giác rất là may mắn và gần như 80% thành công rồi. Kết quả của lần scan tiếp vẫn ra 1 dòng xanh lá.

Pic 15 kết quả tiếp theo




Pic 16



Đến khi mình kiểm tra không còn tham chiếu offset nữa tức giá trị địa chỉ Cheat Engine bảo search tiếp bằng chính giá trị mình vừa scan thì nó là base address.

Pic 17 không còn offset nữa -> base address



Bước 8

Tạo một pointer lưu nguyên path của HP từ base address > 1C > 28 > 24C, max HP chúng ta có thể thấy trong lần search đầu 0x09A671D4 hơn HP là 0x09A671BC nên dễ dàng suy ra từ HP base address> 1C > 28 > 264.

Pic 18 save kết quả kèm các offset từ nãy giờ thành 1 kết quả từ base address tới HP


Pic 19 kết quả dạng pointer



Đến đây có thể kiểm tra bằng cách tắt game, rồi mở lại thử có OK không. Thêm nữa có thể thử trên 1 máy khác. Tương tự như vậy mình có thể search ra MP, max MP (thử theo cách so offset với HP trước như trong trường hợp max HP.

Pic 20



Các trường hợp đặc biệt khác


Bước 9

Tọa độ x, y, z thông thường kiểu int 4 bytes nhưng search hoài không ra nên mình thử search float và cũng ra kết quả khá đơn giản x = 0x00A45EB4 trong 1 bước.


Bước 10

Search những giá trị boolean. Trong auto play mình cần một giá trị gọi là current target, địa chỉ của monster. Mình có thể suy ra khi không có monster giá trị này có lẽ là 0, do đó không focus monster nào search giá trị 0, lần đầu search tất nhiên ra vài trăm ngàn đến vài trăm triệu kết quả.

Pic 21 search không target là 0

Pic 22 search 0

Có target phải khác 0 tức filter tăng

Pic 23 focus vào mob, filter sau khi focus monster giá trị phải tăng lên.

Pic 24 filter increase


Sau đó lại bỏ focus để filter exact 0 .... sau một vài lần thì chỉ còn lại vài trăm, sau khi loại bỏ những giá trị biến đổi liên tục chỉ còn lại một ít.

Pic 25


Pic 26 bỏ các giá trị thay đổi liên tục



Như trong hình mình sẽ chú ý nguyên 1 dãy address liên tiếp nhau, chắc dãy đó là address cần search 0x09A67F22 đến 0x09A67F27.

Pic 27 chú ý các địa chỉ liên tiếp nhau



Thực hiện scan như thao tác tìm HP ở trên ra kết quả offset 0xFB4 và address 0x09A66F70, quá quen thuộc.

Pic 28 kết quả scan

Ngoại lệ

Ngoại lệ khi thực hiện như trên mà vẫn không ra, rất là xui ??? Vậy có một cách khác hơi lâu nhưng đỡ bực bội hơi. Sau khi search lần đầu tiên và filter (bước 4 như trên), mình sẽ thực hiện "Pointer scan for this address", nên chọn default để tránh game process bị die giữa chừng.

Pic 29 thực hiện pointer scan


Pic 30


Bước tiếp là optimize lại vùng scan và tăng số thread lên cho nhanh, chừng 10 thread là được. Sau đó leo lên giường ngủ chờ đến sáng hẵng tính. Sáng dậy nếu chạy xong hoặc cảm thấy thông báo số static base khá khẩm (vài trăm ngàn) thì stop cũng được.

Pic 31


Pic 32



Bước quan trọng tiếp là save lại kết quả 1 đêm này.

Sau đó tắt game, lặp lại bước 1-4 để tìm address thể hiện HP mới, giá trị này không còn như cũ nữa. Rồi chúng ta sẽ lọc trong đám static base chọn rescan đến address mới có thì kết quả sẽ được filter lại.

Pic 33


Double click sẽ cho vào trong results, lại tắt game bật lại thì một số giá trị trong results không đúng mình sẽ bỏ đi. Cuối cùng sẽ ra base address. Dễ dàng hơn nhưng cũng không phải lúc nào cũng được. Risk cũng nhiều ví dụ máy bị sao khi mình đang ngủ. Như mình có tối con mèo làm tắt máy do để cắm điện ẩu.

Còn một phần nữa sẽ nói để hoàn thiện nhưng phải debug và cũng không dùng Cheat Engine nên sẽ nói sau (trường hợp search base address của lua state, cái này thằng nhóc em search bằng VS với mode debug nhưng giờ thì không dùng cách đó được nữa). Dù gì giờ cũng khuya rồi, chúc mọi người ngủ ngon.

1 comment:

  1. tìm hoài ko được nản thật ( game Priston Tale )

    ReplyDelete