下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 用你找到的地址替代在下面的代码里使用的这个地址。现在让我们开始设计修改器的界面: 在 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 你可以传给它,但这不是必须的。现在使用得到的窗口句柄来取得进程标识符( (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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年徐州生物工程职业技术学院单招职业技能测试必刷测试卷及答案解析(夺冠系列)
- 2026年四川邮电职业技术学院单招职业倾向性考试题库及答案解析(夺冠系列)
- 2026年山西财贸职业技术学院单招职业技能考试必刷测试卷及答案解析(夺冠系列)
- 2026年安徽省安庆市单招职业适应性考试题库带答案解析
- 2026年天津职业技术师范大学单招综合素质考试必刷测试卷及答案解析(名师系列)
- 2026年南充科技职业学院单招职业技能测试题库及答案解析(名师系列)
- 房屋所权归属协议书
- 房屋柱子出售协议书
- 房屋水电维修协议书
- 房屋界线协议书范本
- WP60空压机课件教学课件
- 赫章县中能石油化工有限公司金银山加油站环评报告
- 2025至2030年江苏省乡村旅游行业市场调研分析及投资战略咨询报告
- 公司保密协议及竞业禁止协议
- 2025年事业单位工勤技师考试题库(附答案)
- 发电厂安全救护知识培训课件
- DBJT15-248-2022 建筑工程消防施工质量验收规范
- 营养液膜水培技术
- 公路隧道超前地质预报技术规程DB53∕T 1032-2021
- 颅脑损伤病人护理查房
- 2025年山东省公务员《申论(B卷)》试题(网友回忆版)含答案
评论
0/150
提交评论