VB制作外挂示例"对不起,我想这是不可能的,因为VB是一个如此简单的编程语音。"如果有人这么告诉你,别去理他。我可以肯定告诉你,对于制作修改器这种简单的程序,VB完全可以胜任。
  然而,有个问题必须首先考虑:使用VB编写的修改器需要VB的运行库才能运行。如果考虑到有些使用者(实际上可能是大部分使用者)没有运行库,那么在最后制作的ZIP压缩文件中就必须包含这些庞大的文件。在下面的教程里我将制作一个修改器,如果为它再制作一个安装程序,那么整个修改器的体积将超过1MB。其中包括一个很好的安装和反安装程序,但大部分还是VB40032.DLL这个文件。
  除了以上这点,使用VB制作修改器是非常简单的。一旦制作了多次后,你会发现能很快地制作出一个修改器。而且使用VB制作的修改器能够毫无困难地解决游戏运行时的动态内存分配问题,因此即使是最新的游戏,也可以使用VB制作修改器。在本教程中将不涉及动态内存分配,因为虽然简单,但仍然属于一个高级的选项。
  一些背景知识
  不象C语音,VB不会自动包括普通的API函数的声明,因此我们必须把他们加入我们的项目文件。在几乎所有的修改器中会使用到6个主要的函数,讨论如下:
  1. FindWindow(ClassName, WindowTitle) - FindWindow 返回符合指定的类名( ClassName
  )和窗口名( WindowTitle )的窗口句柄。对我们来说,可以让 ClassName 为空( Null ),只给出游戏的
  WindowTitle。函数应该这样声明: Declare Function FindWindow Lib "user32" Alias
  "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String)
  As Long
  2. GetWindowThreadProcessId(WindowHandle, ProcessId) - 在这里我们把 FindWindow
  函数中得到的句柄作为参数,来获得进程标识符(ProcessId )。声明如下: Declare Function
  GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId
  As Long) As Long
  3. OpenProcess(DesiredAccess, Inherit, ProcessId) -
  这个函数将返回一个我们目标进程的句柄,可以用来对目标进行读写操作。 DesiredAccess
  参数的值决定了句柄对进程的存取权利,对我们来说,要使用 PROCESS_ALL_ACCESS (完全存取权限)。Inherit 应该总是
  False。 ProcessId 是从 GetWindowThreadProcessId 函数中取得的。 Declare Function
  OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal
  bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  4. CloseHandle(ProcessHandle) - 每一个打开的句柄必须呼叫这个函数来关闭。 Declare Function
  CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  5. WriteProcessMemory(ProcessHandle, Address, value, Sizeofvalue,
  BytesWritten) - 把指定的值 value 写入由 Address 指定的目标地址。 Declare Function
  WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal
  lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long,
  lpNumberOfBytesWritten As Long) As Long
  6. ReadProcessMemory(ProcessHandle, Address, value, Sizeofvalue,
  BytesWritten) - 把 Address 指定的目标地址的值存入 value 位置的变量中。 Declare Function
  WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal
  lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long,
  lpNumberOfBytesWritten As Long) As Long
  这些函数一环扣一环,缺一不可。更详细的内容可以参考VB的帮助文件。
  一个简单的修改器范例
  如何使上面介绍的这些函数一起工作,制作出我们需要的修改器呢?下面是一个为Windows的计算器程序制作修改器的例子。这个修改器将读出计算器窗口中显示的数值,并在点击一个按钮后在计算器窗口中显示我们的名字。
  首先我们需要找到计算器显示窗口中显示值的地址。本教程不是关于如何进行内存搜索,因而我将只作简单的说明:
  · 在计算器窗口中输入123456
  · 使用你喜欢的任何一种内存地址搜索程序寻找字串123456
  · 使用另一个值重复上面的过程直到只返回1个地址
  那是制作我们的修改器需要的唯一一个地址。在我的计算器程序里这个地址是40B181 hex, 4239745
  dec。用你找到的地址替代在下面的代码里使用的这个地址。
  现在让我们开始设计修改器的界面:
  · 在VB中新建一个项目,加入一个文本框( Textbox )、一个按钮和一个计时器( timer
  )。文本框用来显示从计算器窗口取得的字串,按钮用来把我们的名字传到计算器窗口
  · 把表单( form )的标题( Caption )属性设为 Calculator Trainer
  · 把文本框改名为 txtDisplay 并清除 Text 属性
  · 把计时器改名为 ReadTimer 并把间隔( interval )设为500
  · 把按钮的标题改为 Display Name,按钮的名字改为 btnPasteName
  在这个修改器中我们将使用所有6个函数,ReadProcessMemory、WriteProcessMemory、OpenProcess、GetWindowThreadProcessId、FindWindow
  和 CloseHandle。在项目中插入一个新的模块,增加下列代码。(下面的一些行自动换行了,在你的模块中每一句必须在一行里,或使用延长符_)
  Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
  lpClassName As String, ByVal lpWindowName As String) As Long
  Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As
  Long, lpdwProcessId As Long) As Long
  Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As
  Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As
  Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As
  Long, lpNumberOfBytesWritten As Long) As Long
  Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long,
  ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long,
  lpNumberOfBytesWritten As Long) As Long
  Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As
Long
  下面我们要开始写在计时器窗口中显示我们名字的代码了。首先我们使用 FindWindow
  函数取得目标窗口的句柄。把这个返回值保存在一个变量中,并检查它的值是否出错来确保计时器程序正在运行。(FindWindow函数出错时返回0)
  Dim hwnd As Long
  hwnd = FindWindow(vbNullString, "Calculator")
  If (hwnd = 0) Then
  MsgBox "Window not found!"
  Exit Sub
  End If
  注意在这里我们传递了一个 Null 值给 FindWindow 函数,而不是 ClassName。因此任何名为 Calculator
  的窗口都符合条件。如果知道计算器程序窗口的 ClassName,你可以传给它,但这不是必须的。
  现在使用得到的窗口句柄来取得进程标识符( ProcessId )。注意 pid 是作为参数传递给函数的,而不是被赋以函数返回值。
  Dim pid As Long
  GetWindowThreadProcessId hwnd, pid
  再利用变量pid得到计算器程序的进程句柄。再次检查函数的返回值,如果是非法数据则退出程序。
  Dim pHandle As Long
  pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
  If (pHandle = 0) Then
  MsgBox "Couldn't get a process handle!"
  Exit Sub
  End If
  在我们的修改器中 WriteProcessMemory 函数是最重要的部分,而且非常容易出错。不妨让我们再仔细讨论一下它的参数。
  WriteProcessMemory (ByVal hProcess As Long, ByVal lpBaseAddress As Any,
  ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As)
  hProcess 是目标进程的句柄,从上面的 OpenProcess 函数中取得的。
  lpBaseAddress 是在计算器程序的虚拟内存中将要被修改的地址,也就是使用内存搜索程序找到的那个地址。(在我的程序里是&H40B181)
  lpBuffer 是将要写如上述地址的数据,可以是一个数值、数组、字符串或其他任何数据类型。
  nSize 是希望写入 lpBaseAddress 的字节数。这个位置应该与你的数据类型相符。如果写入的是一个长整数( long
  ),这里应该是4。如果写入的是一个字符串,那么这里应该是字符串的长度。
  lpNumberOfBytesWritten 是函数执行返回后,写入目标地址的实际字节数。它能被用来确认函数实际的执行情况。
  把我们的数据放到函数中,得到 WriteProcessMemory pHandle, &H40B181, "Beans", 5, 0&。我把0传递到
  lpNumberOfBytesWritten 位置是因为不需要检查两次实际写入的字节数。
  最后通过传递进程句柄给 CloseHandle() 函数来关闭由 OpenProcess 打开的句柄。
  CloseHandle hProcess
  现在将所有的代码输入我们的编辑器中。双击按钮,显示它的代码编辑窗口。代码应该加到名为 btnPasteName 的 Click
  事件中。(不必输入注释)
  Private Sub btnPasteName_Click()
  ' 声明一些需要的变量
  Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄
  Dim pid As Long ' 储存进程标识符( Process Id )
  Dim pHandle As Long ' 储存进程句柄
  ' 首先取得目标窗口的句柄
  hwnd = FindWindow(vbNullString, "Calculator")
  If (hwnd = 0) Then
  MsgBox "Window not found!"
  Exit Sub
  End If
  ' 取得进程标识符
  GetWindowThreadProcessId hwnd, pid
  ' 使用进程标识符取得进程句柄
  pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
  If (pHandle = 0) Then
  MsgBox "Couldn't get a process handle!"
  Exit Sub
  End If
  ' 在内存地址中写入名字
  WriteProcessMemory pHandle, &H40B181, "Beans", 5, 0&
  ' 关闭进程句柄
  CloseHandle hProcess
  End Sub
  完毕。现在单击按钮将使计算器窗口文本变为我们键如的名字。(可能需要最小化计算器程序,再还原,以便程序更新显示)

下面将给我们的修改器增加一个新功能。我们将检测计算器程序的窗口显示数据,并在修改器中显示。双击计时器,显示它的代码编辑窗口,然后输入以下代码:
  Private Sub ReadTimer_Timer()
  ' 声明变量
  Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄
  Dim pid As Long ' 储存进程标识符
  Dim pHandle As Long ' 储存进程句柄
  Dim str As String * 20 ' 存储显示文本
  ' 取得目标窗口的句柄
  hwnd = FindWindow(vbNullString, "Calculator")
  If (hwnd = 0) Then Exit Sub
  ' 取得进程标识符
  GetWindowThreadProcessId hwnd, pid
  ' 取得进程句柄
  pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
  If (pHandle = 0) Then Exit Sub
  ' 读取内存数据
  ReadProcessMemory pHandle, &H40B181, str, 20, 0&
  ' 在文本框显示
  txtDisplay = str
  ' 关闭进程句柄
  CloseHandle hProcess
  End Sub
  在这里出现的新东西是 ReadProcessMemory 函数。从 &H40B181 地址中读出的数据被存入变量 str 中,然后显示在名为
  txtDisplay 的文本框中。
'转载请注明出自外挂海官方论坛,本贴地址:http://bbs.wghai.com/thread-76543-1-1.html

外挂制作通用步骤---通过读取窗口-获取进程相关推荐

  1. 外挂制作之思路总结和基址与偏移量

    从今天起开始学习如何做外挂了 , 很久之前了解过一点皮毛. 无非是读写游戏进程中的内存数据. 再读写内存数据之前首先要做的就是找到游戏进程中在内存中的地址.在基地址中,利用CE寻找到某一数据对应的内存 ...

  2. 没事也研究一下外挂--C#简单游戏外挂制作(以Warcraft Ⅲ为例)

    网上有很多外挂制作的教程,大多是讲针对大型网络游戏的,主要包含一些抓包.反汇编.C++的知识综合.事实也如此,常见的外挂都是使用VC++写的,从来没有过C#或者其他.NET语言编写的外挂. 作为微软. ...

  3. Delphi深度之旅——网络游戏外挂制作

    在几年前我看到别人玩网络游戏用上了外挂,做为程序员的我心里实在是不爽,想搞清楚这到底是怎么回事.就拿了一些来研究,小有心得,拿出来与大家共享,外挂无非就是分几种罢了(依制作难度): 1.动作式,所谓动 ...

  4. 游戏外挂制作指南 (一)

    要想在修改游戏中做到百战百胜,是需要相当丰富的计算机知识的.有很多计算机高手就是从玩游戏,修改游戏中,逐步对计算机产生浓厚的兴趣,逐步成长起来的.不要在羡慕别人能够做到的,因为别人能够做的你也能够!我 ...

  5. c#调用windows api C#简单游戏外挂制作(以Warcraft Ⅲ为例)

    C#简单游戏外挂制作(以Warcraft Ⅲ为例) 网上有很多外挂制作的教程,大多是讲针对大型网络游戏的,主要包含一些抓包.反汇编.C++的知识综合.事实也如此,常见的外挂都是使用VC++写的,从来没 ...

  6. 百度AI学习第一天_调用API接口通用步骤

    百度AI学习第一天_调用API接口通用步骤 #第一步获取access_token # client_id 为官网获取的AK, client_secret 为官网获取的SK host = 'https: ...

  7. 《QQ游戏外挂制作教程》一文的补遗

    前段时间发的这篇文章<QQ游戏外挂制作教程(对对碰)>主要阐述了目前QQ游戏外挂一般的工作原理. 近日收到一些网友的邮件,询问如何其中的一些细节.主要是关于对对游戏中的一些点的坐标,颜色的 ...

  8. 网络游戏外挂制作技术浅谈

    网络游戏外挂制作技术浅谈 2007-01-27 21:05 外挂无非分以下几种(依制作难度): 1.动作式,所谓动作式,就是指用API发命令给窗口或API控制鼠标.键盘等,使游戏里的人物进行流动或者攻 ...

  9. 网络游戏外挂制作技术浅谈 - -

    外挂无非分以下几种(依制作难度): 1.动作式,所谓动作式,就是指用API发命令给窗口或API控制鼠标.键盘等,使游戏里的人物进行流动或者攻击,最早以前的"石器"外挂就是这种方式 ...

最新文章

  1. 在Ubuntu 12.04 64bit上搭建Crtmpserver视频点播服务
  2. Redux 入门教程(二):中间件与异步操作
  3. 宁波大红鹰学院计算机科学与技术,2019宁波大红鹰学院专业排名
  4. 翻看雷军近10年演讲、采访,我们整理出70条干货
  5. 深度学习入门之PyTorch学习笔记
  6. html文本打印lt;igt;字段,Web前端学习第九课,使用文本格式化标签
  7. mysql sum 删除_如果mysql磁盘满了,会发生什么?还真被我遇到了~
  8. 固态硬盘安装与系统安装流程
  9. 源码多多- Discuz x2.5 版块的常用设置方法和技巧
  10. 当公司企业邮件服务器IP被列黑名单的解决办法
  11. Java网络编程socket基础学习
  12. 参加AKM DSP芯片代理培训
  13. [数据分析方法论]互联网人必须要懂的“幸存者偏差”
  14. hotmail邮箱在Outlooknbsp;2010中…
  15. 【微信小程序控制硬件⑥ 进阶篇】服务器如何集成七牛云存储SDK,把用户自定义设备图片存储在第三方服务器!
  16. r语言ggplot2一夜多图_关于GGPLOT2出图里的一页多图模式
  17. 人工智能基础:机器学习常见的算法介绍
  18. [USACO 2017DEC] Greedy Gift Takers
  19. android p三星,索尼XZ3新机采用Android P系统,对标三星note9,网友:外观
  20. Oracle版本升级后引出的catalog连接问题

热门文章

  1. 哈佛大学图书馆二十条训言
  2. 【转】 IEEE 802.1X-PEAP认证过程分析(抓包)
  3. Qt中QString转string中文乱码问题
  4. Cisco Cius调试手记
  5. cad中怎么调出计算机,cad历史记录怎么调出
  6. 软件及工具下载与学习视频下载
  7. 图灵奖得主杨立昆:GPT模式五年就不会有人用了,世界模型才是AGI未来
  8. glPushMatrix()/glPopMatrix() glLoadMatrixf()
  9. seo怎么发外链(你不知道的seo发外链技巧和方法)
  10. 赢在中国对80后30个忠告