VB制作外挂示例_第1页
VB制作外挂示例_第2页
VB制作外挂示例_第3页
VB制作外挂示例_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、那是制作我们的修改器需要的唯一一个地址。在我的计算器程序里这个地址是40B181 hex, 4239745VB制作外挂示例使用VB编写的修改器需要 VB的运行库才能运行。如果考虑到有些使用者(实际上可能是大部分使用者)没有运行库,那么 在最后制作的 ZIP 压缩文件中就必须包 含这些庞大的文件。 在下面的教程里我将制作一个修改器, 如果为它再制作一个安装程序, 那么整个修改器的体积将超过1MB其中包括一个很好的安装和反安装程序,但大部分还是VB40032.DLL这个文件。除了以上这点,使用VB制作修改器是非常简单的。一旦制作了多次后,你会发现能很快地制作出一个修改器。而且使用VB制作的修改器能

2、够毫无困难地解决游戏运行时的动态内存分配问题,因此即使是最新的游戏,也可以使用VB制作修改器。在本教程中将不涉及动态内存分配,因为虽然简单,但仍然属于一个高级的选项。一些背景知识不象C语音,VB不会自动包括普通的 API函数的声明,因此我们必须把他们加入我们的项目文件。在几乎所有的修改器中 会使用到 6 个主要的函数,讨论如下:1. FindWindow(ClassName, WindowTitle) - FindWindow返回符合指定的类名 ( ClassName) 和窗口名( WindowTitle ) 的窗口句柄。对我们来说,可以让 ClassName 为空( Null ) ,只给出游

3、戏的 WindowTitle 。函数应该这样声明: Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long2. GetWindowThreadProcessId(WindowHandle, ProcessId) -在这里我们把 FindWindow函数中得到的句柄作为参数,来获得进程标识符 (ProcessId ) 。声明如下: Declare Funct

4、ionGetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessIdAs Long) As Long3. OpenProcess(DesiredAccess, Inherit, ProcessId) -这个函数将返回一个我们目标进程的句柄,可以用来对目标进行读写操作。 DesiredAccess参数的值决定了句柄对进程的存取权利,对我们来说,要使用PROCESS_ALL_ACCESS全存取权限)。Inherit应该总是False 。 ProcessId 是从 GetWindowThreadPr

5、ocessId 函数中取得的。 Declare FunctionOpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long4. CloseHandle(ProcessHandle) -每一个打开的句柄必须呼叫这个函数来关闭。 Declare FunctionCloseHandle Lib "kernel32" (ByVal hObject As Long) As Lon

6、g5. WriteProcessMemory(ProcessHandle, Address, value, Sizeofvalue,BytesWritten) - 把指定的值 value 写入由 Address 指定的目标地址。 Declare FunctionWriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Lo

7、ng) As Long6. ReadProcessMemory(ProcessHandle, Address, value, Sizeofvalue,BytesWritten) - 把 Address 指定的目标地址的值存入 value 位置的变量中。 Declare FunctionWriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesW

8、ritten As Long) As Long这些函数一环扣一环,缺一不可。更详细的内容可以参考VB的帮助文件。一个简单的修改器范例如何使上面介绍的这些函数一起工作,制作出我们需要的修改器呢?下面是一个为Windows的计算器程序制作修改器的例子。这个修改器将读出计算器窗口中显示的数值,并在点击一个按钮后在计算器窗口中显示我们的名字。首先我们需要找到计算器显示窗口中显示值的地址。本教程不是关于如何进行内存搜索,因而我将只作简单的说明:在计算器窗口中输入123456使用你喜欢的任何一种内存地址搜索程序寻找字串123456 使用另一个值重复上面的过程直到只返回 1 个地址dec 。用你找到的地址替

9、代在下面的代码里使用的这个地址。 现在让我们开始设计修改器的界面:在 VB中新建一个项目,加入一个文本框(Textbox )、一个按钮和一个计时器(timer) 。文本框用来显示从计算器窗口取得的字串,按钮用来把我们的名字传到计算器窗口 把表单( form ) 的标题( Caption ) 属性设为 Calculator Trainer 把文本框改名为 txtDisplay 并清除 Text 属性 把计时器改名为 ReadTimer 并把间隔( interval ) 设为 500 把按钮的标题改为 Display Name ,按钮的名字改为 btnPasteName在这个修改器中我们将使用所有

10、6个函数,ReadProcessMemory WriteProcessMemory、OpenProcessGetWindowThreadProcessId、 FindWindow和 CloseHandle 。在项目中插入一个新的模块,增加下列代码。(下面的一些行自动换行了,在你的模块中每一句必须在一行里,或使用延长符 _)Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVallpClassName As String, ByVal lpWindowName As String

11、) As LongDeclare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd AsLong, lpdwProcessId As Long) As LongDeclare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess AsLong, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongDeclare Function WriteProce

12、ssMemory Lib "kernel32" (ByVal hProcess AsLong, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize AsLong, lpNumberOfBytesWritten As Long) As LongDeclare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long,ByVal lpBaseAddress As Any, ByVal lpBuffer As An

13、y, ByVal nSize As Long,lpNumberOfBytesWritten As Long) As LongDeclare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) AsLong下面我们要开始写在计时器窗口中显示我们名字的代码了。首先我们使用 FindWindow 函数取得目标窗口的句柄。把这个返回值保存在一个变量中,并检查它的值是否出错来确保计时器程序正在运行。(FindWindow 函数出错时返回 0)Dim hwnd As Longhwnd = FindWindow(vbNu

14、llString, "Calculator")If (hwnd = 0) ThenMsgBox "Window not found!"Exit SubEnd If注意在这里我们传递了一个 Null值给FindWindow函数,而不是ClassName。因此任何名为Calculator 的窗口都符合条件。如果知道计算器程序窗口的ClassName,你可以传给它,但这不是必须的。现在使用得到的窗口句柄来取得进程标识符 ( ProcessId )。注意 pid 是作为参数传递给函数的, 而不是被赋以函数返回值。 Dim pid As LongGetWindow

15、ThreadProcessId hwnd, pid再利用变量 pid 得到计算器程序的进程句柄。再次检查函数的返回值,如果是非法数据则退出程序。Dim pHandle As LongpHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)If (pHandle = 0) ThenMsgBox "Couldn't get a process handle!"Exit SubEnd If在我们的修改器中 WriteProcessMemory 函数是最重要的部分,而且非常容易出错。不妨让我们再仔细讨论一下它的参数。Writ

16、eProcessMemory (ByVal hProcess As Long, ByVal lpBaseAddress As Any,ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As)hProcess 是目标进程的句柄,从上面的 OpenProcess 函数中取得的。lpBaseAddress 是在计算器程序的虚拟内存中将要被修改的地址,也就是使用内存搜索程序找到的那个地址。(在我的程序里是&H40B181)lpBuffer 是将要写如上述地址的数据,可以是一个数值、数组、字符串或其他任何数据类型

17、。nSize 是希望写入 lpBaseAddress 的字节数。这个位置应该与你的数据类型相符。如果写入的是一个长整数 ( long) ,这里应该是 4。如果写入的是一个字符串,那么这里应该是字符串的长度。lpNumberOfBytesWritten是函数执行返回后,写入目标地址的实际字节数。它能被用来确认函数实际的执行情况。把我们的数据放到函数中,得到 WriteProcessMemory pHandle, &H40B181, "Beans", 5, 0& 。我把 0 传递到 lpNumberOfBytesWritten位置是因为不需要检查两次实际写入的字

18、节数。最后通过传递进程句柄给 CloseHandle() 函数来关闭由 OpenProcess 打开的句柄。CloseHandle hProcess 现在将所有的代码输入我们的编辑器中。双击按钮,显示它的代码编辑窗口。代码应该加到名为 btnPasteName 的 Click 事件中。 (不必输入注释 )Private Sub btnPasteName_Click()' 声明一些需要的变量Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄Dim pid As Long ' 储存进程标识符 ( Process Id )Dim pHandle

19、As Long ' 储存进程句柄' 首先取得目标窗口的句柄hwnd = FindWindow(vbNullString, "Calculator")If (hwnd = 0) ThenMsgBox "Window not found!"Exit SubEnd If'取得进程标识符GetWindowThreadProcessId hwnd, pid'使用进程标识符取得进程句柄pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)If (pHandle = 0) ThenMs

20、gBox "Couldn't get a process handle!"Exit SubEnd If'在内存地址中写入名字WriteProcessMemory pHandle, &H40B181, "Beans", 5, 0&'关闭进程句柄CloseHandle hProcessEnd Sub完毕。现在单击按钮将使计算器窗口文本变为我们键如的名字。 (可能需要最小化计算器程序,再还原,以便程序更新显示 )下面将给我们的修改器增加一个新功能。我们将检测计算器程序的窗口显示数据,并在修改器中显示。双击计时器,显示它 的代码编辑窗口,然后输入以下代码:Private Sub ReadTimer_Timer()' 声明变量Dim hwnd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论