当前位置:宝石小说>游戏竞技>网游之百科全书> VisualBasic做外挂示例 转
阅读设置(推荐配合 快捷键[F11] 进入全屏沉浸式阅读)

设置X

VisualBasic做外挂示例 转(2 / 2)

现在使用得到的窗口句柄来取得进程标识符(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