- 金币:
-
- 奖励:
-
- 热心:
-
- 注册时间:
- 2002-1-24
|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
'VB读写内存,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
'定义PROCESS_ALL_ACCESS:
Const STANDARD_RIGHTS_REQUIRED = &HF0000
Const SYNCHRONIZE = &H100000
Public Const PROCESS_ALL_ACCESS As Long = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
'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, ByVallpBaseAddress 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 ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Sub Command1_Click()
'下面我们要开始写在计时器窗口中显示我们名字的代码了。
'首先我们使用 FindWindow函数取得目标窗口的句柄。把这个返回值保存在一个变量中,并检查它的值是否出错来确保计时器程序正在运行。(FindWindow函数出错时返回0)
Dim hwnd As Long
hwnd = FindWindow(vbNullString, "交易参数存储器")
MsgBox hwnd
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
MsgBox "我是pid:" & pid
' 再利用变量pid得到计算器程序的进程句柄。再次检查函数的返回值,如果是非法数据则退出程序。
Dim pHandle As Long
Dim sss As Long
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
MsgBox "我是pHandle:" & pHandle
If (pHandle = 0) Then
MsgBox "Couldn’t get a process handle!"
Exit Sub
End If
ReadProcessMemory pHandle, ByVal &H40F024, ByVal VarPtr(sss), 4, 0&
MsgBox sss
WriteProcessMemory pHandle, ByVal &H40F024, ByVal VarPtr(7654321), 4, 0&
ReadProcessMemory pHandle, ByVal &H40F024, ByVal VarPtr(sss), 4, 0&
MsgBox sss
End Sub
Private Sub Command2_Click()
' 声明一些需要的变量
Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄
Dim pid As Long ' 储存进程标识符( Process Id )
Dim pHandle As Long ' 储存进程句柄
' 首先取得目标窗口的句柄
hwnd = FindWindow(vbNullString, "计算器")
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, &H40F024, 3333333, 4, 0&
' 关闭进程句柄
CloseHandle hProcess
End Sub
' 完毕。现在单击按钮将使计算器窗口文本变为我们键如的名字。(可能需要最小化计算器程序,再还原,以便程序更新显示)
'下面将给我们的修改器增加一个新功能。我们将与游戏兼容性计算器程序的窗口显示数据,并在修改器中显示。双击计时器,显示它的代码编辑窗口,然后输入以下代码:
Private Sub Command3_Click()
' 声明变量
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&
' 在文本框显示
Text1.Text = str
' 关闭进程句柄
CloseHandle hProcess
End Sub
易盛内存数据的读取:
Private Sub Command3_Click()
Dim fname As Long
Dim fId As Long
Dim PHandle As Long
Dim sss As Double
'获得窗口句柄
fname = FindWindow(vbNullString, "易盛模拟 9 - [帐号:xxx 姓名:xxx] [交易:网通主机 行情:网通主机]")
'获得窗口的id
GetWindowThreadProcessId fname, fId
'获得进程句柄
PHandle = OpenProcess(PROCESS_ALL_ACCESS, False, fId)
'获得优先级
Dim hhhh
hhhh = GetPriorityClass(ByVal PHandle)
MsgBox hhhh
'调整优先级
SetPriorityClass PHandle, 256
ReadProcessMemory PHandle, ByVal &H22D785A, ByVal VarPtr(sss), 8, 0#
MsgBox "程序句柄:" & fname
MsgBox "进程标识符:" & fId
MsgBox "读出:" & sss
CloseHandle PHandle
End Sub |
|
|