LPCTSTR lpClassName, // pointer to class name LPCTSTR lpWindowName // pointer to window name ); 2、我們GetWindowThreadProcessId來得到游戲窗口相對應進程的進程ID,函數用法如下: DWORD GetWindowThreadProcessId(
HWND hWnd, // handle of window LPDWORD lpdwProcessId // address of variable for process identifier ); 3、得到游戲進程ID后,接下來的事是要以最高權限打開進程,所用到的函數OpenProcess的具體使用方法如下: HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag BOOL bInheritHandle, // handle inheritance flag DWORD dwProcessId // process identifier ); 在dwDesiredAccess之處就是設存取方式的地方,它可設的權限很多,我們在這里使用只要使用PROCESS_ALL_ACCESS 來打開進程就可以,其他的方式我們可以查一下MSDN。 4、打開進程后,我們就可以用函數對存內進行操作,在這里我們只要用到WriteProcessMemory來對內存地址寫入數據即可(其他的操作方式比如說:ReadProcessMemory等,我在這里就不一一介紹了),我們看一下WriteProcessMemory的用法: BOOL WriteProcessMemory(
HANDLE hProcess, // handle to process whose memory is written to LPVOID lpBaseAddress, // address to start writing to LPVOID lpBuffer, // pointer to buffer to write data to DWORD nSize, // number of bytes to write LPDWORD lpNumberOfBytesWritten // actual number of bytes written ); 5、下面用CloseHandle關閉進程句柄就完成了。 這就是這類游戲外掛的程序實現部份的方法,好了,有了此方法,我們就有了理性的認識,我們看看實際例子,提升一下我們的感性認識吧,下面就是XX游戲的外掛代碼,我們照上面的方法對應去研究一下吧: const ResourceOffset: dword = $004219F4; resource: dword = 3113226621; ResourceOffset1: dword = $004219F8; resource1: dword = 1940000000; ResourceOffset2: dword = $0043FA50; resource2: dword = 1280185; ResourceOffset3: dword = $0043FA54; resource3: dword = 3163064576; ResourceOffset4: dword = $0043FA58; resource4: dword = 2298478592; var hw: HWND; pid: dword; h: THandle; tt: Cardinal; begin hw := FindWindow(''XX'', nil); if hw = 0 then Exit; GetWindowThreadProcessId(hw, @pid); h := OpenProcess(PROCESS_ALL_ACCESS, false, pid); if h = 0 then Exit; if flatcheckbox1.Checked=true then begin WriteProcessMemory(h, Pointer(ResourceOffset), @Resource, sizeof(Resource), tt); WriteProcessMemory(h, Pointer(ResourceOffset1), @Resource1, sizeof(Resource1), tt); end; if flatcheckbox2.Checked=true then begin WriteProcessMemory(h, Pointer(ResourceOffset2), @Resource2, sizeof(Resource2), tt); WriteProcessMemory(h, Pointer(ResourceOffset3), @Resource3, sizeof(Resource3), tt); WriteProcessMemory(h, Pointer(ResourceOffset4), @Resource4, sizeof(Resource4), tt); end; MessageBeep(0); CloseHandle(h); close; 這個游戲是用了多地址對所要提交的數據進行了校驗,所以說這類游戲外掛制作并不是很難,最難的是要找到這些地址。 (方法大家已經看清楚了,具體實踐就看大家的了,呵呵~~~~~~,不過不要高興太早,這種網絡游戲畢竟占少數,所以我會在以后的文章中對其他類型外掛做詳細解說,對了,請跟一下貼子,鼓勵一下,不然我真的沒有信心寫下面的文章了,謝謝) 上回對五種類型的外掛做了一個大體的概括,大家對這幾種外掛都有了一定的了解,現在就依次(制作難度)由淺到深談談我對外掛制作的一些認識吧~~~~ 首先,先來談一下動作式的外掛,這也是我第一次寫外掛時做的最簡單的一種。 記得還在“石器”時代的時候,我看到別人掛著一種軟件(外掛)人物就可以四外游走(當時我還不知道外掛怎么回事^_^),于是找了這種軟件過來研究(拿來后才聽別人說這叫外掛),發現這種東東其實實現起來并不難,仔佃看其實人物的行走無非就是鼠標在不同的地方點來點去而已,看后就有實現這功能的沖動,隨后跑到MSDN上看了一些資料,發現這種實現這幾個功能,只需要幾個簡單的API函數就可以搞定: 1、首先我們要知道現在鼠標的位置(為了好還原現在鼠標的位置)所以我們就要用到API函數GetCursorPos,它的使用方法如下: BOOL GetCursorPos(
LPPOINT lpPoint // address of structure for cursor position ); 2、我們把鼠標的位置移到要到人物走到的地方,我們就要用到SetCursorPos函數來移動鼠標位置,它的使用方法如下: BOOL SetCursorPos(
int X, // horizontal position int Y // vertical position ); 3、模擬鼠標發出按下和放開的動作,我們要用到mouse_event函數來實現,具休使用方法用下: VOID mouse_event(
DWORD dwFlags, // flags specifying various motion/click variants DWORD dx, // horizontal mouse position or position change DWORD dy, // vertical mouse position or position change DWORD dwData, // amount of wheel movement DWORD dwExtraInfo // 32 bits of application-defined information ); 在它的dwFlags處,可用的事件很多如移動MOUSEEVENTF_MOVE,左鍵按下MOUSEEVENTF_LEFTDOWN,左鍵放開MOUSEEVENTF_LEFTUP,具體的東東還是查一下MSDN吧~~~~~ 好了,有了以前的知識,我們就可以來看看人物移走是怎么實現的了: