admin管理员组文章数量:1568354
2023年12月24日发(作者:)
这篇说说VB6/怎么快速制作游戏修改器并获得模块基址。
由于VB6不支持做64位游戏的修改器,而现在的游戏内容和容量越来越大,电脑硬件配置越来越高端。32位游戏已经满足不了现在的游戏的开发环境要求而会慢慢向64位过渡。所以用支持64位的比用VB6要方便得多。
首先是的游戏修改器制作方法。先运行,新建一个项目,,再选中新建一个窗体,再在右边的资源管理器中双击“MY Project”,进入左边选项的第二项点击进入,再点左边最下方的选项,找到并改目标程序为支持任何位数的游戏的CPU类型即可完成配置。
考虑到让小白新手和看代码如看天书的朋友方便阅读,我把定义名都改了一下,老手莫喷。以下是Windows Media Player 程序修改全代码举例,大家可以直接复制粘贴即可使用
以下为做的修改器代码,请各位自己进行更改或操作。
form上7个控件,2个textbox和3个commandbutton 和2个listbox和1个timer,以下为代码:
Public Class Form1
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal A As String, ByVal B As String) As Long
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal A As Long, ByRef B As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal A As Long, ByVal B As Long, ByVal C As Long) As Long
Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal A As Long, ByVal B As Long, ByRef C As Long, ByVal D As Long, ByVal
E As IntPtr) As Long
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal A As Long, ByVal B As Long, ByRef C As Long, ByVal D As Long, ByRef
E As IntPtr) As Long
Public myProcesses() As Process
Public myProcess As Process
Dim fw As String
Dim pid As Long
Dim hp As Long
Public Sub W(ByVal B As Long, ByVal C As Long, ByVal D As Long) '定义写入
WriteProcessMemory(hp, B, C, D, )
End Sub
Public Function R(ByVal B As Long, ByVal D As Long) As Long '定义读取
Dim Value As IntPtr
ReadProcessMemory(hp, B, Value, D, )
R = Value
End Function
'以上为定义内容,不要变动。以下为实际操作内容,红色字体部分请根据自己所需进行修改,黑色字体不用改动。
Private Sub Timer1_Tick(ByVal sender As , ByVal e As rgs) Handles
fw = FindWindow(Nothing, "Windows Media Player") '程序窗口名
GetWindowThreadProcessId(fw, pid)
hp = OpenProcess(&HFFFF, False, pid)
End Sub
Private Sub Button1_Click(ByVal sender As , ByVal e As rgs) Handles
W(&H500000, 3000, 4) 'W=写入内容(要修改的地址,3000为要修改的数值,需要改写的内存值的位数)
End Sub
Private Sub Button2_Click(ByVal sender As , ByVal e As rgs) Handles
= R(&H500000, 4) 'R=读取内容(要读取内容的地址,需要读取数值的位数)
End Sub
Private Sub Button3_Click(ByVal sender As , ByVal e As rgs) Handles
'获取模块基址
= ""
= ""
()
()
If pid <> 0 And fw <> 0 And hp <> 0 Then
fw = FindWindow(Nothing, "Windows Media Player") '程序窗口句柄名称
GetWindowThreadProcessId(fw, pid)
()
myProcesses = cesses()
For Each ess In myProcesses
(sName)
Next
()
Dim I As Integer
For I = 0 To - 1
(myProcesses(I).Id)
If (I) = pid Then
= I '窗口所得pid与对应进程位置列表的pid对应则显示出来
End If
Next
= "模块基址:" & Hex(myProcesses().Modules(0).ng())
End If
End Sub
End Class
接下来是VB6
form上5个控件,1个textbox和3个commandbutton 和1个timer,以下为代码:
Option Explicit
'定义API
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal a As String, ByVal B As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal a As Long, ByRef B As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal a As Long, ByVal B As Long, ByVal C As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal a As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal a As Long, ByVal B As Long, ByRef C As Long, ByVal d As Long, ByVal E
As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal a As Long, ByVal B As Long, ByRef C As Long, ByVal d As Long, ByRef E
As Long) As Long
'定义基址
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal a As Long, ByVal B As Long) As Long
Private Declare Function Module32First Lib "kernel32" (ByVal a As Long, B As MODULEENTRY32) As Long
Private Declare Function GetModuleFileNameExA Lib "" (ByVal a As Long, ByVal B As Long, ByVal C As String, ByVal d As Long) As
Long
'定义句柄,进程
Dim fw As Long
Dim pid As Long
Dim hp As Long
'模块快照
Private Type MODULEENTRY32
dwSize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Long
modBaseSize As Long
hModule As Long
szModule As String * 256
szExePath As String * 1024
End Type
'模块快照
Public Function GetModuleAdd(pid As Long, ModuleName As String) As Long
Dim m As MODULEENTRY32
Dim k As Long
k = CreateToolhelp32Snapshot(8, pid)
= Len(m)
Module32First k, m
GetModuleAdd = eAddr
If pid = 0 Then
GetModuleAdd = 0
End If
CloseHandle (k)
End Function
'定义写入
Public Sub W(ByVal B As Long, ByVal C As Long, ByVal d As Long)
Call WriteProcessMemory(hp, B, C, d, 0)
End Sub
'定义读取
Public Function R(ByVal B As Long, ByVal d As Long) As Long
Dim Value As Long
Call ReadProcessMemory(hp, B, Value, d, 0)
R = Value
End Function
'以下为控件操作
Private Sub Timer1_Timer()
fw = FindWindow(vbNullString, "Windows Media Player") '输入要修改的进程的窗口名
Call GetWindowThreadProcessId(fw, pid)
hp = OpenProcess(&HFFF, False, pid)
End Sub
'读取内容(地址,位数)
Private Sub Command1_Click()
= R(&H500000, 4)
End Sub
'写入内容(地址,数值,位数)
Private Sub Command2_Click()
Call W(&H500000, 3000, 4)
End Sub
'获取基址
Private Sub Command3_Click()
= "exe文件基址:" & Hex(GetModuleAdd(pid, ""))
End Sub
版权声明:本文标题:用VB6与VBNET制作游戏修改器-外挂与获取模块基址 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1703419020a54228.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论