itprofes
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Cơ chế Hook và ứng dụng to lớn của nó (Phần 3)

Go down

Cơ chế Hook và ứng dụng to lớn của nó (Phần 3) Empty Cơ chế Hook và ứng dụng to lớn của nó (Phần 3)

Bài gửi  admin 7/5/2010, 10:14 am

Bài viết liên quan: Cơ chế Hook và ứng dụng to lớn của nó (Phần 2)/Cơ chế Hook và ứng dụng to lớn của nó (Phần 4)



tiếp theo bài này em xin viết về cơ chế của AutoPlay

các pm autoplay bây h đọc thông tin từ bộ nhớ game và dùng hook để thay đổi các thông tin cần thiết.

đến đây em chia thành 2 phần, phần 1 là đọc thông tin từ bộ nhớ game, phần 2 là ghi thông tin.

phần 1: đọc thông tin game
phần này thì kô cần dùng đến Hook vì bản thân ta kô tác động gì đến game cả ("đọc" theo đúng nghĩa đen của nó)
các thông tin trong bộ nhớ game được lưu trong các địa chỉ (có thể tĩnh hoặc động), vấn đề ở đây chỉ là làm sao "lấy" được các địa chỉ cần thiết và "đọc" nó như thế nào???
để "lấy" đc các địa chỉ cần thiết là rất phức tạp, phải biết debug game may ra mới lấy đc Sad nhưng ma thay các việc đó đã có các bậc tiền bối của chúng ta lo roài Very Happy, thay vì phải ngồi hàng h để debug game, ta có thể search trên mạng trong vài giây là dc Very Happy

lấy ví dụ với game VLTK, điều ta quan tâm nhất là thông tin vê char và mob (quái vật)

Tất cả các nhân vật (người chơi, quái, Npc...) được lưu thông tin trong mảng gồm 256 đối tượng, mỗi đối tượng kích thước 0x7E4C, địa chỉ lưu địa chỉ của mảng trên là 0x00D3A570. Đối tượng 0 để trống, đối tượng 1 là người chơi, còn lại là quái & Npc.

như vậy ta đã có đc các địa chỉ cần thiết rồi (trong mảng trên thì phần tử a[1] lưu thông tin về người chơi, các phân tử còn lại(từ a[2] đến a[255]) lưu thông tin về mob. mảng a có địa chỉ tĩnh là 0x00D3A570).
với các game khác thi các pác tự search trên google sẽ thấy thôi

bi h đến bước thứ 2 là đọc dữ liệu như thế nào?
tất cả các nhân vật(người chơi, mob, npc...) đều thuộc cùng 1 lớp chung(không biết các nhà lập trình game gọi thế nào nhưng em tạm gọi đó là class CNpc
cấu trúc của class này tùy từng game sẽ khác nhau, ở đây em xin lấy ví dụ về game VLTK

class CNpc
{
...
DWORD m_NpcKind; //0x0020 1=mod, 1=player,...
...
DWORD m_Doing; //0x00EC 1=stand, 2=walk, 3=run...
...
int m_CurLife; //0x0B44
int m_CurLifeMax;
int m_CurLifeRep;
int m_CurMana;
int m_CurManaMax;
...
BOOL m_bRideHorse; //0x0D58
char Name[32]; //0x0D5C Tên nhân vật
int m_n***;
...
BOOL m_FightMode; //0x0EAC

};

vi kô tìm đc class đầy đủ nên các pác cần chú ý tới các địa chỉ OFFSET của từng biến thành viên để việc đọc dữ liệu đc chính xác, với các biến thành viên trên thì cũng đã đủ dùng để làm 1 autoplay tự buff máu, mana, và tự rao bán đồ.
để đọc dữ liệu trong bộ nhớ game các pác dùng hàm API ReadProcessMemory

nói qua về hàm này, hàm này có 5 tham số, tham số đâu tiên là handle của game vltk, tham số thứ 2 là địa chỉ offset mà ta sẽ lấy ra để đọc, tham số thứ 3 là buffer ta dùng để đọc dữ liệu, tham số thứ 4 là kích thước của dữ liệu ta sẽ đổ vào buffer, tham số cuối kô cân xét, cứ để NULL

sau đây là các bước thực hiện chi tiết
B1: tìm handle của process của game vltk, các pác có thể tham khảo cách tìm process ở đây: http://www.codeproject.com/KB/threads/getprocessid.aspx
B2: dùng hàm ReadProcessMemory để đọc các thông tin cần thiết
đây là ví dụ với game vltk

CNpc Npc;
LPBYTE lpBaseAdd, lpCurAdd;
//đọc địa chỉ đầu của mảng Npc
ReadProcessMemory(m_hVLProcess, (LPBYTE)NPC_BASE_ADD, (LPVOID)&lpBaseAdd, 4, NULL);
//tính toán địa chỉ của ngươi chơi (PLAYER_INDEX = 1)
lpCurAdd = lpBaseAdd + PLAYER_INDEX*NPC_DATA_SIZE;
//đọc thông tin vê ngươi chơi
ReadProcessMemory(m_hVLProcess, lpCurAdd, (LPVOID)&Npc, sizeof(CNpc), NULL);
...

trong đó m_hVLProcess là handle của process của game.
lpBaseAdd là địa chỉ của mảng Npc, lpCurAdd là địa chỉ hiện tại, có đc băng cách + lpBaseAdd với (chỉ số trong mảng)*NPC_DATA_SIZE, NPC_DATA_SIZE chính là kích thước của 1 đối tượng trong mảng = 0x7E4C (đã nói ở trên), ở đây nếu muốn đọc thông tin của player thi + lpBaseAdd với 1*0x7E4C (do chỉ số của player trong mảng = 1)

như vậy la ta đã có thông tin cơ bản về người chơi, mob...
ngoài ra có thể sử dụng thêm 1 vài hàm API để rao, bán đồ

void PostChatMessage(LPCTSTR szChatMsg)
{
//đặt focus cho cửa sổ chat
::PostMessage(m_hVLWin, WM_KEYDOWN, VK_RETURN, 0x001C0001);
//Xóa nội dung trong cửa sổ chat
::PostMessage(m_hVLWin, WM_KEYDOWN, VK_DOWN, 0x00500001);
while (szChatMsg[0])
{
::PostMessage(m_hVLWin, WM_CHAR, LOBYTE(szChatMsg[0]), 0);
szChatMsg++;
}
//đặt focus cho cửa sổ game
::PostMessage(m_hVLWin, WM_KEYDOWN, VK_RETURN, 0x001C0001);
}

ở đây m_hVLWin là handle của game vltk(khác với handle của process đấy nhé)

để tìm handle của game vltk thì các pác chỉ cần dùng hàm FindWindow( )

như vậy đến đây là quá đủ để làm cái AutoSell + AutoBuff máu& mana rồi đó!
admin
admin
Thiếu Úy III
Thiếu Úy III

Tổng số bài gửi : 627
Diem : 6517
Thank : 4
Join date : 24/03/2010
Đến từ : Bỉm Sơn - Thanh hóa

https://itprofes.forumvi.com

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết