想做个游戏修改器,请教用VB怎么修改游戏程序的内存?(欲修改的内存地址已知)最好有个例程。
解决方案 »
- vb 如何输出√,∫,∑
- vb2005+sqlserver2005 数据库连接问题,请各位前辈帮忙。急!!
- 用open打开中文文件时提示文件不存在?
- 初学VB,问两个问题,很初级的
- 求助,高手帮忙!
- ******出"大洋"急寻VB编程高手!!!!! 高手请进!!!!1!!
- 都懒得理我吗?
- 求助 关于VB中 错误代码为48的 问题
- c++写的函数,用vb如何调用,如何转换参数类型?希望高手能出手援助,因为一般人无法解决这个问题!我崩溃了
- 如何“动态”的调用“动态连接库”?(for VB)
- ***************** 进来者有分 ************
- 一个键盘测试程序的bug,请大家帮忙解决!
面以制作一个Window流行的游戏"蜘蛛纸牌"为例制作一个内存修改器一,数据的查找
1.运行游戏,开局,这时分数是500,操作是0
2.随便移一条牌,分数变成499,操作变为1
3.切换到FPE2001,在"目标游戏"中输入499,开始查找
4.新建一个任务,输入1,查找
5.回到游戏中,,再移动一个牌,,这时分数变成498,操作变成2
6.再次回到FPE,在第二个任务中(刚才查找1的那个)中输入2,查找
7.在第一个任务中输入498,查找
8.在第6步中第7步中如果找到的结果不止一个,那么回到第5步,直到结果是一个为止
9,假设在第6步中找到的地址是1000h,第7步中的地址是2000h(后辍h表示是十六进制)二,开始制作修改器
因为在读写内存,所以要用到如下的API,
为了查看方便,,请把下面两条横线之间的内容复制到VB里再看Option Explicit'1.查找窗口
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'2.取得进程ID
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
'3.打开进程
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'4.把数值写入内存
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
'5.从内存中读取数值
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
'6.关闭打开的线程句柄
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'7.一个操作内存的权力常数
Private Const PROCESS_ALL_ACCESS = &H1F0FFF
'以上7个项目可以从API浏览器中复制,,但可能会有一点不同,,建议复制上面的代码'8.一个保存游戏进程ID的变量
Private hProcess As Long'下面的函数用于查找游戏
Function FindGame() As Boolean
Dim PID As Long, Gamehwnd As Long
FindGame = False
Gamehwnd = FindWindow(vbNullString, "蜘蛛") '查找游戏的句柄
If (Gamehwnd = 0) Then Exit Function '如果找不到(例如游戏未运行)就退出函数
GetWindowThreadProcessId Gamehwnd, PID '取得进程ID
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, PID) '以全部权力打开进程
If (hProcess = 0) Then Exit Function '打开进程失败
FindGame = True '成功!!
End Function
'回到VB的窗口设计模式,按如下的图布置好控件
'把Commmand1,Command2的Caption分别改为 读取 和 写入
'把Text1的Text设为空白
'下面的功能只能改分数,,如要改操作步数,,请自行尝试
Private Sub Command1_Click()
Dim retV%, r&
'Dim retV%, r&=Dim retV As Integer, r As Long
If FindGame Then
r = ReadProcessMemory(hProcess, &H1000, retV, 2, 0)'参数说明
'hProcess就是刚才打开的进程ID
'&H1000就是刚才找到的分数的地址,注意十六进制在VB里的写法
'retV用来接受从内存中读得的数值
'2是表示读两个字节
'0是什么??我也不清楚,反正设为0就是了If r = 0 Then
MsgBox "读取内存不成功!"
Else
Text1 = retV
End If
End If
End SubPrivate Sub Command2_Click()
Dim r&
If FindGame Then
r = WriteProcessMemory(hProcess, &H1000, CInt(Val(Text1)), 2, 0)
'参数与上面的基本相同
'cInt(Val(Text1))是防止输入的过程有误,,例如,输入了字母,,如果不处理程序就会出错
If r = 0 Then
MsgBox "写内存不成功!"
Else
MsgBox "OK"
End If
End If
End Sub回到游戏,,随便移动一张牌看看!用VB做修改器就这么简单!
再用“VirtualProtect”修改权限;'-----------特别重要------------。
用“ReadProcessMemory”读出内存的值;
再用“WriteProcessMemory”改写内存的值;
再用“VirtualProtect”恢复权限;
再用“CloseHandle”关闭句柄。