vb用API修改內(nèi)存實例(做外掛)_第1頁
vb用API修改內(nèi)存實例(做外掛)_第2頁
vb用API修改內(nèi)存實例(做外掛)_第3頁
vb用API修改內(nèi)存實例(做外掛)_第4頁
免費預覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、你說你想用 VB 做外掛,有人說:“對不起,我想這是不可能的,因為 VB 是一個如此簡單的編程語音?!叭绻腥诉@么告訴你,別去理他。我可以肯定告訴你,對于制作修改器這種簡單的程序,VB 完全可以勝任。然而,有個問題必須首先考慮:使用 VB 編寫的修改器需要 VB 的運行庫才能運行。如果考慮到有些使用者(實際上可能是大部分使用者)沒有運行庫, 那么在最后制作的 ZIP 壓縮文件中就必須包含這些龐大的文件。在下面的教程里我將制作一個修改器,如果為它再制作一個安裝程序,那么整個修改器的體積將超過 1MB。其中包括一個很好的安裝和反安裝程序,但大部分還是 VB40032.DLL這個文件。除了以上這點,

2、使用 VB 制作修改器是非常簡單的。一旦制作了多次后,你會發(fā)現(xiàn)能很快地制作出一個修改器。而且使用 VB 制作的修改器能夠毫無困難地解決游戲運行時的動態(tài)內(nèi)存分配問題,因此即使是最新的游戲,也可以使用 VB 制作修改器。在本教程中將不涉及動態(tài)內(nèi)存分配,因為雖然簡單,但仍然屬于一個高級的選項。一些背景知識不象 C 語音,VB 不會自動包括普通的 API 函數(shù)的聲明,因此我們必須把他們加入我們的項目文件。在幾乎所有的修改器中會使用到 6 個主要的函數(shù),討論如下:1. FindWindow(ClassName,WindowTitle)-FindWindow 返回符合指定的類名(ClassName)和窗口

3、名(WindowTitle)的窗口句柄。對我們來說,可以讓 ClassName 為空(Null),只給出游戲的WindowTitle。函數(shù)應(yīng)該這樣聲明:DeclareFunctionFindWindowLibuser32AliasFindWindowA(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong2. GetWindowThreadProcessId(WindowHandle,ProcessId)-在這里我們把FindWindow函數(shù)中得到的句柄作為參數(shù),來獲得進程標識符(ProcessId)。聲明如下:DeclareFun

4、ctionGetWindowThreadProcessIdLibuser32(ByValhwndAsLong,lpdwProcessIdAsLong)AsLong3.OpenProcess(DesiredAccess,Inherit,ProcessId)-這個函數(shù)將返回一個我們目標進程的句柄,可以用來對目標進行讀寫操作。DesiredAccess參數(shù)的值決定了句柄對進程的存取權(quán)利,對我們來說,要使用PROCESS_ALL_ACCESS(完全存取權(quán)限)。Inherit 應(yīng)該總是False。ProcessId 是從 GetWindowThreadProcessId 函數(shù)中取得的。DeclareFu

5、nctionOpenProcessLibkernel32(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,ByValdwProcessIdAsLong)AsLong4.CloseHandle(ProcessHandle)-每一個打開的句柄必須呼叫這個函數(shù)來關(guān)閉。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這些函數(shù)一環(huán)扣一環(huán),缺一不可。更詳細的內(nèi)容可以參考 VB 的幫助文件。一個簡單的修改器范例如何使上面介紹的這些函數(shù)一起工作,制作出我們需要的修改器呢?下面是一個為Windows 的計算器程序制作修改器的例子。這個修改器將讀出計算器窗口中顯示的數(shù)值,并在點擊一個按鈕后在計算器窗口

8、中顯示我們的名字。首先我們需要找到計算器顯示窗口中顯示值的地址。本教程不是關(guān)于如何進行內(nèi)存搜索,因而我將只作簡單的說明: 在計算器窗口中輸入 123456 使用你喜歡的任何一種內(nèi)存地址搜索程序?qū)ふ易钟?123456 使用另一個值重復上面的過程直到只返回 1 個地址那是制作我們的修改器需要的唯一一個地址。在我的計算器程序里這個地址是 40B181hex,4239745dec 用你找到的地址替代在下面的代碼里使用的這個地址?,F(xiàn)在讓我們開始設(shè)計修改器的界面: 在 VB 中新建一個項目,加入一個文本框( (Textbox 卜一個按鈕和一個計時器(timer)。文本框用來顯示從計算器窗口取得的字用,按鈕

9、用來把我們的名字傳到計算器窗口 把表單( (form)的標題( (Caption)屬性設(shè)為 CalculatorTrainer 把文本框改名為 txtDisplay 并消除 Text 屬性 把計時器改名為 ReadTimer 并把間隔( (interval)設(shè)為 500 把按鈕的標題改為DisplayName,按鈕的名字改為btnPasteName在這個修改器中我們將使用所有 6 個函數(shù),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函數(shù)取得目標窗口的句柄。把這個返回值保存在一個變量中,并檢查它的值是否出錯來確保計時器程序正在運行。( (FindWindow 函數(shù)出錯時返回 0)DimhwndAsLonghwnd=FindWindow(vbNullString,Calculator)If(hwnd=0)ThenMsgBoxWindownotfound!ExitSubEndIf注意在這里我們傳遞了一個 Null 值給 FindWindow 函數(shù),而不是 ClassName 因此任何名為 Calculator的窗口都符合條件。如果知道計算器程序窗口的 C

13、lassName 你可以傳給它,但這不是必須的?,F(xiàn)在使用得到的窗口句柄來取得進程標識符( (ProcessId)注意 pid 是作為參數(shù)傳遞給函數(shù)的,而不是被賦以函數(shù)返回值。DimpidAsLongGetWindowThreadProcessIdhwnd,pid再利用變量 pid 得到計算器程序的進程句柄。再次檢查函數(shù)的返回值,如果是非法數(shù)據(jù)則退出程序。DimpHandleAsLongpHandle=OpenProcess(PROCESS_ALL_ACCESS,False,pid)If(pHandle=0)ThenMsgBoxCouldn'tgetaprocesshandle!

14、ExitSubEndIf在我們的修改器中 WriteProcessMemory 函數(shù)是最重要的部分,而且非常容易出錯。不妨讓我們再仔細討論一下它的參數(shù)。WriteProcessMemory(ByValhProcessAsLong,ByVallpBaseAddressAsAny,ByVallpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAs)hProcess是目標進程的句柄,從上面的 OpenProcess 函數(shù)中取得的。lpBaseAddress 是在計算器程序的虛擬內(nèi)存中將要被修改的地址,也就是使用內(nèi)存搜索程序找到的那個地址。(在我的

15、程序里是&H40B181)lpBuffer 是將要寫如上述地址的數(shù)據(jù),可以是一個數(shù)值、數(shù)組、字符串或其他任何數(shù)據(jù)類型。nSize 是希望寫入 lpBaseAddress 的字節(jié)數(shù)。這個位置應(yīng)該與你的數(shù)據(jù)類型相符。如果寫入的是一個長整數(shù)( (long),這里應(yīng)該是 4。如果寫入的是一個字符串,那么這里應(yīng)該是字符串的長度。IpNumberOfBytesWritten 是函數(shù)執(zhí)行返回后,寫入目標地址的實際字節(jié)數(shù)。它能被用來確認函數(shù)實際的執(zhí)行情況。把我們的數(shù)據(jù)放到函數(shù)中,得至 UWriteProcessMemorypHandle,&H40B181,Beans,5,0&。我把 0

16、 傳遞至 UlpNumberOfBytesWritten 位置是因為不需要檢查兩次實際寫入的字節(jié)數(shù)。最后通過傳遞進程句柄給 CloseHandle()函數(shù)來關(guān)閉由 OpenProcess 打開的句柄。CloseHandlehProcess現(xiàn)在將所有的代碼輸入我們的編輯器中。雙擊按鈕,顯示它的代碼編輯窗口。代碼應(yīng)該加到名為 btnPasteName 的 Click事件中。(不必輸入注釋) )PrivateSubbtnPasteName_Click()'聲明一些需要的變量DimhwndAsLong'儲存 FindWindow 函數(shù)返回的句柄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'在內(nèi)存地址中寫入名字WriteProcessMemorypHandle,&H40B181,haha,5,0'關(guān)閉進程句柄CloseHandlehProcessEndSub完畢?,F(xiàn)在單擊按鈕將使計算器窗口文本變?yōu)槲覀冩I如的名字。(可能需要最小化計算器程序,再還原,以便程序更新顯示) )下面將給我們的修改器增加一個新功能。我們將檢測計算器程序的窗口顯示數(shù)據(jù),并在修改器中顯示。雙擊計時器,顯示它的代碼編輯窗口,然后輸入以下代碼:PrivateSubReadTimer_Timer()'聲明變量DimhwndAsLong'儲存 FindWindow 函數(shù)返回的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論