VisualBasic做外挂示例 转(2/2)
现在使用得到的窗口句柄来取得进程标识符ProcessId。注意pid是作为参数传递给函数的,而不是被赋以函数返回值。
DimpidAsLong
GetWindowThreadProcessIdhwnd,pid
再利用变量pid得到计算器程序的进程句柄。再次检查函数的返回值,如果是非法数据则退出程序。
DimpHandeAsLong
pHandeOpenProcessPROCESSALLACCESS,Fase,pid
IfpHande0Then
MsgBoxCoudntgetaprocesshande!
ExitSub
EndIf
在我们的修改器中WriteProcessMemory函数是最重要的部分,而且非常容易出错。不妨让我们再仔细讨论一下它的参数。
WriteProcessMemoryByVahProcessAsLong,ByVapBaseAddressAsAny,
ByVapBufferAsAny,ByVanSizeAsLong,pNumberOfBytesWrittenAs
hProcess是目标进程的句柄,从上面的OpenProcess函数中取得的。
pBaseAddress是在计算器程序的虚拟内存中将要被修改的地址,也就是使用内存搜索程序找到的那个地址。在我的程序里是&H40B181pBuffer是将要写如上述地址的数据,可以是一个数值、数组、字符串或其他任何数据类型。
nSize是希望写入pBaseAddress的字节数。这个位置应该与你的数据类型相符。如果写入的是一个长整数ong,这里应该是4。如果写入的是一个字符串,那么这里应该是字符串的长度。
pNumberOfBytesWritten是函数执行返回后,写入目标地址的实际字节数。它能被用来确认函数实际的执行情况。
把我们的数据放到函数中,得到WriteProcessMemorypHande,&H40B181,Beans,5,0&。我把0传递到pNumberOfBytesWritten位置是因为不需要检查两次实际写入的字节数。
最后通过传递进程句柄给CoseHande函数来关闭由OpenProcess打开的句柄。
CoseHandehProcess
现在将所有的代码输入我们的编辑器中。双击按钮,显示它的代码编辑窗口。代码应该加到名为btnPasteName的Cick事件中。不必输入注释
PrivateSubbtnPasteNameCick
声明一些需要的变量
DimhwndAsLong储存FindWindow函数返回的句柄
DimpidAsLong储存进程标识符ProcessId
DimpHandeAsLong储存进程句柄
首先取得目标窗口的句柄
hwndFindWindowvbNuString,Cacuator
Ifhwnd0Then
MsgBoxWindownotfound!
ExitSub
EndIf
取得进程标识符
GetWindowThreadProcessIdhwnd,pid
使用进程标识符取得进程句柄
pHandeOpenProcessPROCESSALLACCESS,Fase,pid
IfpHande0Then
MsgBoxCoudntgetaprocesshande!
ExitSub
EndIf
在内存地址中写入名字
WriteProcessMemorypHande,&H40B181,Beans,5,0&
关闭进程句柄
CoseHandehProcess
EndSub
完毕。现在单击按钮将使计算器窗口本变为我们键如的名字。可能需要最小化计算器程序,再还原,以便程序更新显示
下面将给我们的修改器增加一个新功能。我们将检测计算器程序的窗口显示数据,并在修改器中显示。双击计时器,显示它的代码编辑窗口,然后输入以下代码:
PrivateSubReadTimerTimer
声明变量
DimhwndAsLong储存FindWindow函数返回的句柄
DimpidAsLong储存进程标识符
DimpHandeAsLong储存进程句柄
DimstrAsString20存储显示本
取得目标窗口的句柄
hwndFindWindowvbNuString,Cacuator
Ifhwnd0ThenExitSub
取得进程标识符
GetWindowThreadProcessIdhwnd,pid
取得进程句柄
pHandeOpenProcessPROCESSALLACCESS,Fase,pid
IfpHande0ThenExitSub
读取内存数据
ReadProcessMemorypHande,&H40B181,str,20,0&
在本框显示
txtDispaystr
关闭进程句柄
CoseHandehProcess
EndSub
在这里出现的新东西是ReadProcessMemory函数。从&H40B181地址中读出的数据被存入变量str中,然后显示在名为txtDispay的本框中。
本教程中所讲的是非常简单的东西,主要是想起抛砖引玉的目的。最重要的是不断学习,不断实践,了解其他的API并在修改器中使用。练习越多,就会觉得越容易。
;