现在使用得到的窗口句柄来取得进程标识符(ProcessId)。注意pid是作为参数传递给函数的,而不是被赋以函数返回值。
DimpidAsLong
GetWindowThreadProcessIdhwnd,pid
再利用变量pid得到计算器程序的进程句柄。再次检查函数的返回值,如果是非法数据则退出程序。
DimpHandleAsLong
pHandle=OpenProcess(PROCESS_ALL_ACCESS,False,pid)
If(pHandle=0)Then
MsgBox‘Couldn’tgetaprocesshandle!‘
ExitSub
EndIf
在我们的修改器中WriteProcessMemory函数是最重要的部分,而且非常容易出错。不妨让我们再仔细讨论一下它的参数。
WriteProcessMemory(ByValhProcessAsLong,ByVallpBaseAddressAsAny,
ByVallpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAs)
hProcess是目标进程的句柄,从上面的OpenProcess函数中取得的。
lpBaseAddress是在计算器程序的虚拟内存中将要被修改的地址,也就是使用内存搜索程序找到的那个地址。(在我的程序里是&H40B181)lpBuffer是将要写如上述地址的数据,可以是一个数值、数组、字符串或其他任何数据类型。
nSize是希望写入lpBaseAddress的字节数。这个位置应该与你的数据类型相符。如果写入的是一个长整数(long),这里应该是4。如果写入的是一个字符串,那么这里应该是字符串的长度。
lpNumberOfBytesWritten是函数执行返回后,写入目标地址的实际字节数。它能被用来确认函数实际的执行情况。
把我们的数据放到函数中,得到WriteProcessMemorypHandle,&H40B181,‘Beans‘,5,0&。我把0传递到lpNumberOfBytesWritten位置是因为不需要检查两次实际写入的字节数。
最后通过传递进程句柄给CloseHandle()函数来关闭由OpenProcess打开的句柄。
CloseHandlehProcess
现在将所有的代码输入我们的编辑器中。双击按钮,显示它的代码编辑窗口。代码应该加到名为btnPasteName的Click事件中。(不必输入注释)
PrivateSubbtnPasteName_Click()
’声明一些需要的变量
DimhwndAsLong’储存FindWindow函数返回的句柄
DimpidAsLong’储存进程标识符(ProcessId)
DimpHandleAsLong’储存进程句柄
’首先取得目标窗口的句柄
hwnd=FindWindow(vbNullString,‘Calcutor‘)
If(hwnd=0)Then
MsgBox‘Windownotfound!‘
ExitSub
EndIf
’取得进程标识符
GetWindowThreadProcessIdhwnd,pid
’使用进程标识符取得进程句柄
pHandle=OpenProcess(PROCESS_ALL_ACCESS,False,pid)
If(pHandle=0)Then
MsgBox‘Couldn’tgetaprocesshandle!‘
ExitSub
EndIf
’在内存地址中写入名字
WriteProcessMemorypHandle,&H40B181,‘Beans‘,5,0&
’关闭进程句柄
CloseHandlehProcess
EndSub
完毕。现在单击按钮将使计算器窗口文本变为我们键如的名字。(可能需要最小化计算器程序,再还原,以便程序更新显示)
下面将给我们的修改器增加一个新功能。我们将检测计算器程序的窗口显示数据,并在修改器中显示。双击计时器,显示它的代码编辑窗口,然后输入以下代码:
PrivateSubReadTimer_Timer()
’声明变量
DimhwndAsLong’储存FindWindow函数返回的句柄
DimpidAsLong’储存进程标识符
DimpHandleAsLong’储存进程句柄
DimstrAsString*20’存储显示文本
’取得目标窗口的句柄
hwnd=FindWindow(vbNullString,‘Calcutor‘)
If(hwnd=0)ThenExitSub
’取得进程标识符
GetWindowThreadProcessIdhwnd,pid
’取得进程句柄
pHandle=OpenProcess(PROCESS_ALL_ACCESS,False,pid)
If(pHandle=0)ThenExitSub
’读取内存数据
ReadProcessMemorypHandle,&H40B181,str,20,0&
’在文本框显示
txtDispy=str
’关闭进程句柄
CloseHandlehProcess
EndSub
在这里出现的新东西是ReadProcessMemory函数。从&H40B181地址中读出的数据被存入变量str中,然后显示在名为txtDispy的文本框中。
本教程中所讲的是非常简单的东西,主要是想起抛砖引玉的目的。最重要的是不断学习,不断实践,了解其他的API并在修改器中使用。练习越多,就会觉得越容易。
;
Copyright 2021宝石小说All Rights Reserved