



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、你說你想用 VB 做外掛,有人說:“對不起,我想這是不可能的,因為 VB 是一個如此簡單的編程語音?!叭绻腥诉@么告訴你,別去理他。我可以肯定告訴你,對于制作修改器這種簡單的程序,VB 完全可以勝任。然而,有個問題必須首先考慮:使用 VB 編寫的修改器需要 VB 的運行庫才能運行。如果考慮到有些使用者(實際上可能是大部分使用者)沒有運行庫, 那么在最后制作的 ZIP 壓縮文件中就必須包含這些龐大的文件。在下面的教程里我將制作一個修改器,如果為它再制作一個安裝程序,那么整個修改器的體積將超過 1MB。其中包括一個很好的安裝和反安裝程序,但大部分還是 VB40032.DLL這個文件。除了以上這點,
2、使用 VB 制作修改器是非常簡單的。一旦制作了多次后,你會發現能很快地制作出一個修改器。而且使用 VB 制作的修改器能夠毫無困難地解決游戲運行時的動態內存分配問題,因此即使是最新的游戲,也可以使用 VB 制作修改器。在本教程中將不涉及動態內存分配,因為雖然簡單,但仍然屬于一個高級的選項。一些背景知識不象 C 語音,VB 不會自動包括普通的 API 函數的聲明,因此我們必須把他們加入我們的項目文件。在幾乎所有的修改器中會使用到 6 個主要的函數,討論如下:1. FindWindow(ClassName,WindowTitle)-FindWindow 返回符合指定的類名(ClassName)和窗口
3、名(WindowTitle)的窗口句柄。對我們來說,可以讓 ClassName 為空(Null),只給出游戲的WindowTitle。函數應該這樣聲明:DeclareFunctionFindWindowLibuser32AliasFindWindowA(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong2. GetWindowThreadProcessId(WindowHandle,ProcessId)-在這里我們把FindWindow函數中得到的句柄作為參數,來獲得進程標識符(ProcessId)。聲明如下:DeclareFun
4、ctionGetWindowThreadProcessIdLibuser32(ByValhwndAsLong,lpdwProcessIdAsLong)AsLong3.OpenProcess(DesiredAccess,Inherit,ProcessId)-這個函數將返回一個我們目標進程的句柄,可以用來對目標進行讀寫操作。DesiredAccess參數的值決定了句柄對進程的存取權利,對我們來說,要使用PROCESS_ALL_ACCESS(完全存取權限)。Inherit 應該總是False。ProcessId 是從 GetWindowThreadProcessId 函數中取得的。DeclareFu
5、nctionOpenProcessLibkernel32(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,ByValdwProcessIdAsLong)AsLong4.CloseHandle(ProcessHandle)-每一個打開的句柄必須呼叫這個函數來關閉。DeclareFunctionCloseHandleLibkernel32(ByValhObjectAsLong)AsLong5. WriteProcessMemory(ProcessHandle,Address,value,Sizeofvalue,BytesWritten)-把
6、指定的值 value 寫入由 Address 指定的目標地址。DeclareFunctionWriteProcessMemoryLibkernel32(ByValhProcessAsLong,ByVallpBaseAddressAsAny,ByVallpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAsLong)AsLong6. ReadProcessMemory(ProcessHandle,Address,value,Sizeofvalue,BytesWritten)-把 Address 指定的目標地址的值存入 value 位置的變量中
7、。DeclareFunctionWriteProcessMemoryLibkernel32(ByValhProcessAsLong,ByVallpBaseAddressAsAny,ByVallpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAsLong)AsLong這些函數一環扣一環,缺一不可。更詳細的內容可以參考 VB 的幫助文件。一個簡單的修改器范例如何使上面介紹的這些函數一起工作,制作出我們需要的修改器呢?下面是一個為Windows 的計算器程序制作修改器的例子。這個修改器將讀出計算器窗口中顯示的數值,并在點擊一個按鈕后在計算器窗口
8、中顯示我們的名字。首先我們需要找到計算器顯示窗口中顯示值的地址。本教程不是關于如何進行內存搜索,因而我將只作簡單的說明: 在計算器窗口中輸入 123456 使用你喜歡的任何一種內存地址搜索程序尋找字用 123456 使用另一個值重復上面的過程直到只返回 1 個地址那是制作我們的修改器需要的唯一一個地址。在我的計算器程序里這個地址是 40B181hex,4239745dec 用你找到的地址替代在下面的代碼里使用的這個地址?,F在讓我們開始設計修改器的界面: 在 VB 中新建一個項目,加入一個文本框( (Textbox 卜一個按鈕和一個計時器(timer)。文本框用來顯示從計算器窗口取得的字用,按鈕
9、用來把我們的名字傳到計算器窗口 把表單( (form)的標題( (Caption)屬性設為 CalculatorTrainer 把文本框改名為 txtDisplay 并消除 Text 屬性 把計時器改名為 ReadTimer 并把間隔( (interval)設為 500 把按鈕的標題改為DisplayName,按鈕的名字改為btnPasteName在這個修改器中我們將使用所有 6 個函數,ReadProcessMemory.WriteProcessMemory、OpenProcessGetWindowThreadProcessIdFindWindow和 CloseHandle 在項目中插入一個
10、新的卞 K 塊,增加下列代碼。(下面的一些行自動換行了,在你的模塊中每一句必須在一行里,或使用延長符_)DeclareFunctionFindWindowLibuser32AliasFindWindowA(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLongDeclareFunctionGetWindowThreadProcessIdLibuser32(ByValhwndAsLong,lpdwProcessIdAsLong)AsLongDeclareFunctionOpenProcessLibkernel32(ByValdwDesi
11、redAccessAsLong,ByValbInheritHandleAsLong,ByValdwProcessIdAsLong)AsLongDeclareFunctionWriteProcessMemoryLibkernel32(ByValhProcessAsLong,ByVallpBaseAddressAsAny,ByVallpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAsLong)AsLongDeclareFunctionCloseHandleLibkernel32(ByValhObjectAsLong)AsLong下面我們要開
12、始寫在計時器窗口中顯示我們名字的代碼了。 首先我們使用FindWindow函數取得目標窗口的句柄。把這個返回值保存在一個變量中,并檢查它的值是否出錯來確保計時器程序正在運行。( (FindWindow 函數出錯時返回 0)DimhwndAsLonghwnd=FindWindow(vbNullString,Calculator)If(hwnd=0)ThenMsgBoxWindownotfound!ExitSubEndIf注意在這里我們傳遞了一個 Null 值給 FindWindow 函數,而不是 ClassName 因此任何名為 Calculator的窗口都符合條件。如果知道計算器程序窗口的 C
13、lassName 你可以傳給它,但這不是必須的?,F在使用得到的窗口句柄來取得進程標識符( (ProcessId)注意 pid 是作為參數傳遞給函數的,而不是被賦以函數返回值。DimpidAsLongGetWindowThreadProcessIdhwnd,pid再利用變量 pid 得到計算器程序的進程句柄。再次檢查函數的返回值,如果是非法數據則退出程序。DimpHandleAsLongpHandle=OpenProcess(PROCESS_ALL_ACCESS,False,pid)If(pHandle=0)ThenMsgBoxCouldn'tgetaprocesshandle!
14、ExitSubEndIf在我們的修改器中 WriteProcessMemory 函數是最重要的部分,而且非常容易出錯。不妨讓我們再仔細討論一下它的參數。WriteProcessMemory(ByValhProcessAsLong,ByVallpBaseAddressAsAny,ByVallpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAs)hProcess是目標進程的句柄,從上面的 OpenProcess 函數中取得的。lpBaseAddress 是在計算器程序的虛擬內存中將要被修改的地址,也就是使用內存搜索程序找到的那個地址。(在我的
15、程序里是&H40B181)lpBuffer 是將要寫如上述地址的數據,可以是一個數值、數組、字符串或其他任何數據類型。nSize 是希望寫入 lpBaseAddress 的字節數。這個位置應該與你的數據類型相符。如果寫入的是一個長整數( (long),這里應該是 4。如果寫入的是一個字符串,那么這里應該是字符串的長度。IpNumberOfBytesWritten 是函數執行返回后,寫入目標地址的實際字節數。它能被用來確認函數實際的執行情況。把我們的數據放到函數中,得至 UWriteProcessMemorypHandle,&H40B181,Beans,5,0&。我把 0
16、 傳遞至 UlpNumberOfBytesWritten 位置是因為不需要檢查兩次實際寫入的字節數。最后通過傳遞進程句柄給 CloseHandle()函數來關閉由 OpenProcess 打開的句柄。CloseHandlehProcess現在將所有的代碼輸入我們的編輯器中。雙擊按鈕,顯示它的代碼編輯窗口。代碼應該加到名為 btnPasteName 的 Click事件中。(不必輸入注釋) )PrivateSubbtnPasteName_Click()'聲明一些需要的變量DimhwndAsLong'儲存 FindWindow 函數返回的句柄DimpidAsLong&
17、amp;#39;儲存進程標識符( (ProcessId)DimpHandleAsLong'儲存進程句柄'首先取得目標窗口的句柄hwnd=FindWindow(vbNullString,Calculator)If(hwnd=0)ThenMsgBoxWindownotfound!ExitSubEndIf'取得進程標識符GetWindowThreadProcessIdhwnd,pid'使用進程標識符取得進程句柄pHandle=OpenProcess(PROCESS_ALL_ACCESS,False,pid)If(pHandle=0)Th
18、enMsgBoxCouldn'tgetaprocesshandle!ExitSubEndIf'在內存地址中寫入名字WriteProcessMemorypHandle,&H40B181,haha,5,0'關閉進程句柄CloseHandlehProcessEndSub完畢。現在單擊按鈕將使計算器窗口文本變為我們鍵如的名字。(可能需要最小化計算器程序,再還原,以便程序更新顯示) )下面將給我們的修改器增加一個新功能。我們將檢測計算器程序的窗口顯示數據,并在修改器中顯示。雙擊計時器,顯示它的代碼編輯窗口,然后輸入以下代碼:PrivateSubReadTimer_Timer()'聲明變量DimhwndAsLong'儲存 FindWindow 函數返回的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉庫物料收貨管理制度
- 中職班級分組管理制度
- 人力資源服務管理制度
- 食堂食品儲藏室管理制度
- 鄉鎮醫院食堂管理制度
- 中石油第三方管理制度
- 倉儲人員培訓管理制度
- 中學餐廳衛生管理制度
- 倉庫物品儲存管理制度
- 中藥飲片復驗管理制度
- 敘事護理學知到章節答案智慧樹2023年中國人民解放軍海軍軍醫大學
- 中考英語補全對話
- 防治腦卒中專業知識講座
- 平壓平模切機安全操作規程、風險告知卡、應急處置
- JJG 646-2006移液器
- GB/T 40167-2021紙和紙板加速老化(100 ℃)
- GB/T 17626.4-2018電磁兼容試驗和測量技術電快速瞬變脈沖群抗擾度試驗
- GB/T 1094.12-2013電力變壓器第12部分:干式電力變壓器負載導則
- 活性炭改性及吸附條件研究性實驗
- 小學體育教研活動記錄(有內容)
- 核級閥門強度計算方法的分析
評論
0/150
提交評論