Cơ chế Hook và ứng dụng to lớn của nó (Phần 3)
Trang 1 trong tổng số 1 trang
Cơ chế Hook và ứng dụng to lớn của nó (Phần 3)
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 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 , 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
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 đó!
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 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 , 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
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 đó!
Similar topics
» Cơ chế Hook và ứng dụng to lớn của nó (Phần 1)
» 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)
» Ứng dụng cơ chế Hook - Phần 1
» Ứng dụng cơ chế Hook - Phần 2
» 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)
» Ứng dụng cơ chế Hook - Phần 1
» Ứng dụng cơ chế Hook - Phần 2
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết
27/8/2013, 11:45 am by echcondihoc
» Quản Lí Tiến Trình Dùng Thư Viện PSAPI
11/10/2011, 9:42 pm by CNTT_DH
» xin tai lieu tieng viet
31/8/2011, 6:59 am by bantoisg
» Theo dõi tiến trình
27/8/2011, 5:51 pm by haigaopro01
» Giải pháp Bảo mật của Cisco
17/6/2011, 8:50 am by admin
» Nghiên cứu và đưa ra giải pháp phòng chống tấn công DoS, DDoS (Phần 1)
16/6/2011, 2:32 pm by admin
» Learn to hack !
16/6/2011, 8:49 am by admin
» Giải pháp hệ thống dành cho doanh nghiệp với thiết bị mạng Fortinet (Phần 1)
15/6/2011, 11:12 am by admin
» Ô Long Viên (Tập II)
27/9/2010, 4:56 pm by root
» những ebook về hack tiếng việt cho người mới tìm hiểu.
27/9/2010, 4:54 pm by root