Tôi sẽ lần chia bài viết thành từng phần theo thứ tự như sau:
Bài 1 – Lấy các thông tin cơ bản về nhân vật và tự BUFF máu, mana
Bài 2 – Lấy thông tin về tọa độ nhân vật, tự tìm quái đánh, tự nhặt đồ
Bài 3 – Điều khiển nhân vật chạy
Ở đây không bàn đến việc dùng kỹ thuật đồ họa và chiếm chuột để điều khiển nhân vật. Các phần mềm hiện nay thường dùng chương trình chính Autoplay thực hiện việc đọc bộ nhớ Game lấy thông tin và dùng cơ chế Hook để ghi thông tin cần thay đổi vào bộ nhớ Game. Một điểm lưu ý là khi Hook sẽ chiếm tài nguyên, nên ta có thể dùng một mẹo nhỏ, sau khi Hook ta Unhook ngay lập tức và dùng LoadLibrary để nạp hook.dll vào bộ nhớ game, thay đổi địa chỉ WndProc để thực hiện nhiều ý đồ khác.
(Các bạn có thể tham khảo bài viêt sau để biết cách dùng Hook và mẹo này: http://www.codeproje...eads/winspy.asp). Ngoài ra, để chương trình có thêm nhiều chức năng, có thể ta sẽ phải gọi các hàm trong game_y.exe và khi đó ta phải mở rộng cái Hook.dll để có thể hook + inject code vào Game process (sẽ nói trong bài 3).
Bài 1 - Lấy các thông tin cơ bản về nhân vật và tự BUFF máu, mana
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.
Khi chưa dùng cơ chế inject code nói trên ta có thể đọc bộ nhớ của Game bằng hàm ReadProcessMemory. Dưới đây là minh họa lớp đối tượng Npc và một số biến thành viên cần dùng (phần ... là phần dữ liệu chưa dùng tới, các bạn phải đặt một mảng BYTE với kích thước tương ứng vào đó để các địa chỉ OFFSET của các biến được chính xác)
#define NPC_BASE_ADD 0x00D3A570 #define NPC_DATA_SIZE 0x00007E4C #define MAX_NPC 256 #define PLAYER_INDEX 1 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 Ten nhan vat int m_nSex; ... BOOL m_FightMode; //0x0EAC }; // Tim cua so va xac dinh Game Process Handle o day ... CNpc Npc; LPBYTE lpBaseAdd, lpCurAdd; //Read start Address of Npc Array ReadProcessMemory(m_hVLProcess, (LPBYTE)NPC_BASE_ADD, (LPVOID)&lpBaseAdd, 4, NULL); //Start Address of PLAYER lpCurAdd = lpBaseAdd + PLAYER_INDEX*NPC_DATA_SIZE; //Read PLAYER ìnormation ReadProcessMemory(m_hVLProcess, lpCurAdd, (LPVOID)&Npc, sizeof(CNpc), NULL); ...
Khi đọc được các thông số máu và mana rồi ta có thể dùng hàm PostMessage(hWnd, WM_KEYDOWN...) để gửi phím 1, 2, 3. Các bạn thấy ở trên có 1 biến m_FightMode dùng để xác định nhân vật đang ở chế độ đánh (ở bản đồ có quái) hoặc đang ở trong thành (không dùng chiêu được). Căn cứ vào đó ta có thể gửi phím 1, 2, 3 khi cần thiết (m_FightMode=TRUE). Nếu nhân vật về thành rồi khỏi bơm máu nữa (nhiều khi dính độc về cả phút mà cứ đứng trong thành bơm máu thì phí quá).
Linh tinh khác: Game VLTK có định nghĩa một số hàm macro có thể dùng ở dòng gõ CHAT, ví dụ:
“/Switch Horse”, “/Switch Sit”, “/SayPhrase 0”, , “/SayPhrase 1” các bạn thử mà xem, cũng thũ vị lắm. Các bạn mở file UIconfig.ini sẽ thấy nhiều hàm hơn. Dưới đây là đoạn code mà có thể thêm vào chương trình của mình dùng để chat hoặc chạy một hàm macro trong Game. Bạn có thể lập trình lên xuống ngựa hay ngồi xuống, đứng lên, ... mà ko phải dùng WM_KEYDOWN gửi phím tắt V, M (vì ở chế độ phím Mặc định, nhấn V sẽ ko ngồi đâu).
void PostChatMessage(LPCTSTR szChatMsg) { //Set focus to CHAT edit control ::PostMessage(m_hVLWin, WM_KEYDOWN, VK_RETURN, 0x001C0001); //Clear CHAT edit control ::PostMessage(m_hVLWin, WM_KEYDOWN, VK_DOWN, 0x00500001); while (szChatMsg[0]) { ::PostMessage(m_hVLWin, WM_CHAR, LOBYTE(szChatMsg[0]), 0); szChatMsg++; } //Set focus to Game Window ::PostMessage(m_hVLWin, WM_KEYDOWN, VK_RETURN, 0x001C0001); }
Đến đây các bạn có thể lập được một chương trình tự buff mana, ngồi rao bán hàng rồi đấy. Ở bài 2 tôi sẽ nói về cách xác định tọa độ nhân vật (cũng giống như của các Npc khác) và đồ. Địa chỉ OFFSET tọa độ của nhân vật & Npc không phải là 0x10F8 như các bạn tưởng đâu, đó là địa chỉ đích Npc sẽ chạy tới, sẽ đánh tới... nếu nhân vật ngồi xuống, giá trị này sẽ bằng 0.
Edited by ngocnl, 19 April 2006 - 10:56 PM.