问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

VB做个简单的内存修改器《求教》

发布网友 发布时间:2022-05-03 00:54

我来回答

1个回答

热心网友 时间:2022-07-01 06:44

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 的文本框中
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
修复征信是不是真的? 市面上征信修复公司可靠吗? 征信修复公司是真是假,真的可以修复吗? Emulex FC HBA卡 皮肤毛囊炎怎样治 银行自动扣款什么原因 银行什么情况自动扣款 贷款自动扣款什么意思 粤省事办理准生证需要多久 粤省事办理准生证步骤 为什么于嘉说山猫队和网队的比赛,少了易建联山猫进攻都没那么流畅了... 灰色裤子配什么颜色好看 上衣 命中注定我爱你全集的分集介绍,一直到结局。不要发网址,因为我用手机没办法发连接。 命中注定我爱你1-24集分集介绍 前几天买了灰色萝卜裤,不知道配什么颜色的上衣,或者什么衬衫? 命中注定我爱你好看不 威马汽车质量怎么样?值得购买么? 陈冠希女儿,高奢潮牌全上身是不是比老爸还有星范? 威马汽车的发展状况如何? 深灰色萝卜裤适合配什么上衣? Ella晒全家福为儿子庆生,她在微博分享过哪些居家亲子瞬间? 威马新能源汽车好吗? 刹车油怎么看 神都猛虎和一天屠龙记有什么关联吗?读着有太多相似! 在工商银行没有存款,可以申请信用卡吗 建设银行没有存款申请信用卡可以吗 没工作没存款能办信用卡吗 建设银行没存款可以申请信用卡吗 没有存款可以办信用卡吗 你好!要是没什么存款可以办理信用卡么? 求猪笼草种子种植的方法 怎么种发芽几率高 你觉得生儿子好还是生女儿好呢?为什么? 装机过程中出现问题 装机出现问题 新装机出现的问题? 威马的电动汽车怎么样?性能如何? 关于装机问题 威马汽车有倒闭的可能吗? 那个内存修改器到底怎么用 葫芦侠修改找内存教程 装机问题! 自己装机应该注意哪些问题,主要是兼容性方面要注意哪些问题 威马e5新能源汽车功能介绍? 内存修改器无效 仙剑奇侠传3内存修改器1.1怎么用,知道的麻烦说一下,谢谢 装机时出现的问题 请教装机问题 公积金38元买房贷款利息怎么算? 装机!装机!装机问题!!! 装机方面问题 周公解梦见差一点被蛇咬?