当前位置:编程学习 > VB >>

零基础制作《武林外传》辅助工具 (VB)

来源:JiaJias Home

需要工具:
VB6企业版(盗版)/VB6精装版
CE(英文或汉化)

一,打开游戏和CE用CE载入游戏

二,让你的血量回到最满状态,记住血量值

如上图,我的是1312点血,好的,用CE搜"1312",.
用"Exact value"方式,4字节

搜到N个址,好,再回到游戏里,我们让人物掉点血(打怪什么的,最好多掉点,这样方便后面来查数),再用"Decreased value"(减少了的数)来搜,这样掉点血,搜一次,搜点血搜一次,几次下来,好的,找到的地址就只剩四个了(我是两次就找到只剩四个了,电脑不同,可能找的次数也不同, 不过方法是一样的,先找最大血量值,然后,再掉点血,再用减少的搜,如此循环几次就OK了)记下第一个地址(为什么用第一个地址,CE的教程里说,一般如果找到少量的地址后,正确的一般在第一个,如果你不确定,你可以让人物自动回血,就可以看到,第一个地址的数也在跟着增加~)

接着,把第一个地址双击,加入下面的栏里,再在地址上单击右键,弹出菜单中选"Find out what writes to this address"(谁在改定这个地址),调出监视窗口,再回到游戏,掉点血,就可以看到监视窗口里己经有改写该地址的命令了~

选中该命令,点"Mor information",得到如下图

mov [esi+00000254],ecx 红色加亮的这句,(+00000254也就是血量的偏移量了)
可以看到,是把ECX的值写入ESI+00000254这个内存地址中,所以,我们记下下面的ESI地址:ESI=05C0B548,再回到CE主界面,搜"05C0B548"这个数(选中HEX,用十六进制四字节方式搜)

得到26个地址都含有这个数,好的,把最前面的三个数保存到下栏里,然后,小退一下(回到人物选择界面,再进入游戏),就可以看到,三个地址的数值都有变化了.好,再重新找血量地址,然后再"Find out what writes to this address"(谁在改定这个地址)这个地址,得到ESI的值,记下来,对比刚保存 下来的三个地址内的数,呵呵,发现
010AEAE4里的值刚好等于ESI,这就可以肯定,010AEAE4一定二级基址了,好,我们监视010AEAE4,"Find out what writes to this address".好,再次小退一下,再进入游戏,这时监视窗口有东东了,如下图

得到:mov [esi+24],0000000
记下ESI的值,010AEAC0,再回到CE主界面,用十六进制的方法找010AEACO
得到N个数,反复搜几次,好,得到下图

按CE教程说的,一般最是地址最小的就是正确的,呵呵,有点那个啊,~~~~~~~~~~~~
选第一个008BE594,加到下面的栏里,完全退出游戏,再进入游戏
重复,最后还是得到008BE594,这样就可以肯定,008BE594就是一级基址了
得出公式如下
一级基址:008BE594
008BE594地址里面保存的数值+24的偏移=二级基址
二级基址里面保存的地址数+254的偏移得到血量的地址
下面开始搜索数据!
用CE打开武林外传。运行CE,按照下图的次序打开(...武林外传\elementelementclient.exe)

2.游戏启动后,别忘了选择游戏窗口。

3.这是游戏中人物的数据。

4.好,现在我们要在CE中显示人物的生命值。同样按照图中的顺序打开“添加地址”对话框,在数据框中添加我们已知的内存地址。当然,我们要用指针的方式,因为存储这些数据的地址是不固定的,我们可以用8C6A54这个固定的基地址以及相关的偏移地址找到我们需要的数据。我们就来看看生命的值,完成图上的项目点“确定”来看看结果。

5.怎么样!是不是角色的生命值呢,使自己失去一些血量看看这个值是不是也在跟着变化。

6.根据已知的人物地址,我们还可以显示其它数据。

相关武林外传地址:
一级基址=8CF51C
人物基址=+24
当前血=+254
最大血=+26C
当前蓝=+258
最大蓝=+270
以上数字均为16进制
------------------------------------------------------------------------------------------------------------------------------------

下面是VB代码部分:

1.建立一个新的标准EXE工程,我们就可以开始这次的学习了。

2.我们要建立一个模块,然后添加以下代码:
Option Explicit
---------------声明函数-----------------------
得到窗体句柄的函数,FindWindow函数用来返回符合指定的类名( ClassName )和窗口名( WindowTitle )的窗口句柄
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
得到窗体控件句柄的函数
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
得到进程标识符的函数
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
得到目标进程句柄的函数
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
关闭句柄的函数
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
读取进程内存的函数
Public Declare Function ReadProcessMemory Lib "kernel32.dll" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long
参数决定了对进程的存储权限,使用完全控制
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
3.接下来Form中,我们要在程序启动时连接游戏窗口,以下是Form_Load的代码:
Dim hwd As Long ‘ 储存 FindWindow 函数返回的句柄
Dim pid As Long
Dim hProcess As Long 存放进程句柄

Private Sub Form_Load()
hwd = FindWindow("QElementClient Window", "Element Client")
If hwd = 0 Then
MsgBox "未启动游戏", vbOKOnly, "提示"
Unload Form1
End If
GetWindowThreadProcessId hwd, pid 获取进程标识符
将进程标识符做为参数,返回目标进程PID的句柄,得到此句柄后
即可对目标进行读写操,PROCESS_ALL_ACCESS表示完全控制,权限最大
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid)
If hProcess = 0 Then
MsgBox "不能打开进程", vbOKOnly, "提示"
Unload Form1
End If
CloseHandle hProcess
4.我们在Form中添加一个Label控件和一个Timer控件,设置Timer的Interval属性为100,Timer1_Timer的代码如下:
Dim h As Long
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, pid)

If hProcess Then
ReadProcessMemory hProcess, ByVal &H8C6A54, h, 4, 0& ‘这三条代码读取获得生命值
ReadProcessMemory hProcess, ByVal h + &H24, h, 4, 0&
ReadProcessMemory hProcess, ByVal h + &H254, h, 4, 0&

CloseHandle hProcess
End If

Label1.Caption = h 输出生命值

下面我们来给外挂增加自动保护功能.
1.首先我们要绘制一个界面,最先添加一个Frame控件、最少两个Label控件用于输出生命和真气值、两个Text控件用于输入数据还有两个Timer控件,分别改名为TimerList及TimerAdd,最后添加一个Command控件。可以参考下图,呵呵~我知道你可以画的更好看!

2.下一步就是添加代码了,和上次一样新建一个模块,模块内容如下:
Option Explicit
---------------声明函数-----------------------
得到窗体句柄的函数,FindWindow函数用来返回符合指定的类名( ClassName )和窗口名( WindowTitle )的窗口句柄
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
得到窗体控件句柄的函数
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
得到进程标
补充:软件开发 , Vb ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,