vb用API修改内存实例(做外挂)

合集下载

VB修改内存

VB修改内存

VB修改游戏内存about <红警大战2共和国之辉>金钱地址:A1E0C4+24C用易语言写很简单,但是写出来的程序不能装逼有木有→_→,拉进PEID吓死一大片的扫描结果,所以本屌写了这篇关于VB修改内存的教程。

说明:读者必须要会使用VB!首先你需要知道几个APIWriteProcessMemory ;向指定进程内存地址中写入数据ReadProcessMemory ;从指定进程内存地址中读取数据OpenProcess ;打开一个进程,返回进程的进程句柄VB6.0中声明如下:…注意:ReadProcessMemory函数和WriteProcessMemory函数的声明和API浏览器中的有所不同附注:ByVal关键字表示形参,ByRef关键字表示实参(易语言的传址,相当于传递过去了一个指针)Private Declare Function WriteProcessMemory Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Long,ByVal lpBaseAddress As Long, ByRef lpBuffer As Long, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long …Private关键字用来声明一个窗体级别的API,也可以使用Public关键字来声明一个全局API,但是需要把声明放进模块中。

Private Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Long,ByVal lpBaseAddress As Long, ByRef lpBuffer As Long, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As LongPrivate Declare Function OpenProcess Lib "kernel32" Alias "OpenProcess" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long声明截图如下(局部截图,因为我没有换行)接下来我们要开始漫漫编程之路了。

VBA调用系统API函数的方法与实例说明

VBA调用系统API函数的方法与实例说明

VBA调用系统API函数的方法与实例说明VBA(Visual Basic for Applications)是一种基于Microsoft Visual Basic语言的宏编程语言,主要用于操作Microsoft Office软件中的各种功能。

尽管VBA本身提供了丰富的功能,但有时候我们可能需要调用操作系统的API函数来实现一些高级或特定的功能。

本文将详细介绍VBA调用系统API函数的方法,并提供一些实例说明。

在VBA中调用系统API函数可以拓展VBA的功能,并且提供了解决复杂问题的能力。

使用API函数可以与操作系统进行交互,访问底层功能和资源。

以下是一些常用的VBA调用系统API函数的方法:1. 声明API函数在使用API函数之前,我们需要在VBA中声明该函数。

声明API函数的语法如下:```Declare Function 函数名 Lib "库名称" ([alias]] [参数列表]) [返回值类型]```其中,函数名是要调用的API函数的名称,Lib是API 函数所在的库名称,参数列表是API函数的输入参数,返回值类型是API函数的返回值类型。

2. 调用API函数一旦我们声明了API函数,就可以在VBA代码中调用该函数。

调用API函数的语法如下:```变量名 = 函数名([参数列表])```其中,变量名是接收API函数返回值的变量名,函数名是已声明的API函数的名称,参数列表是传递给API函数的参数列表。

3. 释放资源在调用API函数之后,我们需要确保适当地释放相关资源以避免内存泄漏。

可以使用相关的API函数来释放资源,如CloseHandle函数释放句柄资源。

现在让我们通过几个实例来说明如何在VBA中调用系统API函数:1. 调用MessageBox函数MessageBox函数用于显示一个包含指定消息和按钮的模态对话框,并返回用户的操作。

下面的代码演示了如何在VBA中调用MessageBox函数:```vbaDeclare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hWnd As Long, _ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long) As LongSub ShowMessageBox()Dim prompt As StringDim title As StringDim result As Longprompt = "这是一个提示框!"title = "提示"result = MessageBox(0, prompt, title, 1)End Sub```在上述代码中,我们首先声明了MessageBox函数,然后在Sub过程ShowMessageBox中调用了该函数。

用VB6与VBNET制作游戏修改器-外挂与获取模块基址

用VB6与VBNET制作游戏修改器-外挂与获取模块基址

这篇说说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 Form1Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal A As String, ByVal B As String) As LongPublic Declare Function GetWindowThreadProcessId Lib "user32" (ByVal A As Long, ByRef B As Long) As LongPublic Declare Function OpenProcess Lib "kernel32" (ByVal A As Long, ByVal B As Long, ByVal C As Long) As LongPublic 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 LongPublic 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 LongPublic myProcesses() As ProcessPublic myProcess As ProcessDim fw As StringDim pid As LongDim hp As LongPublic Sub W(ByVal B As Long, ByVal C As Long, ByVal D As Long) '定义写入WriteProcessMemory(hp, B, C, D, IntPtr.Zero)End SubPublic Function R(ByVal B As Long, ByVal D As Long) As Long '定义读取Dim Value As IntPtrReadProcessMemory(hp, B, Value, D, IntPtr.Zero)R = ValueEnd Function'以上为定义内容,不要变动。

VB API函数大全

VB API函数大全
列举安装在计算机里的所有ocx控件
Returning an ExitCode parameter from an out of process application
从外部应用程序返回参数
Check if a loggin password and user name are correct
检查当前登录的密码和用户名是不是正确的。
Creating new threads to perform asynchronous tasks
创建一个新的线程执行异步任务
Get and set volume information for a drive
得到和设定驱动器的卷信息
Using the ShellExecute API to send mails and print documents
Show the "File Open" Common Dialog
显示“文件打开”对话框
Converting Class IDs to a Prog IDs and back
转变class ID到一个prog ID
Obtaining the current user name
获得当前用户名
Return the path of the temporary directory
给窗体加上定制的系统菜单
Register Components without using Regsvr32.exe
不使用Regsvr32.exe注册组件
Uncover internal DLL functions with Dependency Walker
公布内部调用的dll函数
Launch a PCs default browser with ShellExecute API

易语言,VB代码,CF外挂代码

易语言,VB代码,CF外挂代码

由于时间关系 这次就只写3个功能
还有一个人体免疫
还是添加热键 - -!
我们就用F4
还是添加一个子程序 名字改人体免疫
还是创建时钟 改名时钟免疫
还是单击2下
这下的基址和上面的还是差不多 只是基址和偏移值改变而已 所以我就直接复制了
郁闷 刚刚又忘记按键了
打开
我们先 把内存最好 界面 就自己随便 设计 就可以了
先添加一个模块 超级模块4.2 用3.7以上的都可以 添加模块会吧!
单击两下 在里面输入 监视热键 (&无后座力, #F5键, , )
然后新建一个子程序
按鼠标右就可以显示 按快捷键Ctel+N也可以
组JU连发:772, 1
换弹+快刀:751, 1 时钟是135
拆C4:96,1
钻地:451,4
重刀: 573, -1
人体免疫 609, -1
5倍高挑 639, 1
无限瞬移:1147,1
人打划 295 -1
观看 :1244 -1
二倍高跳 592, -1
单击点射 1248, 1
人物地址:15479920
模仿会员:15569660
无后坐力:560,-1
完美无后:559, { 255, 255, 255, 255 }, 4 12, { 1063675494 }, 4
远程拆包:100, 1
幽灵显鬼:15540094,0
切换背包:15484480,0
内存透视:7055148,随便写!最好时钟写1000!
被注入文件 = “C:\Wghai.dll”
被复制文件 = “C:” + “\” + “imedllhost09” + “.dll”

用VB制作游戏修改器(转自电脑报)_455535423

用VB制作游戏修改器(转自电脑报)_455535423

1. 打开VB新建一个标准EXE工程,Form1的Caption属性改为"XXX作弊器"(不包括引号,下同);
2. 在Form1上添加一个Label1,把Label1的Caption属性改为"请稍候……";
3. 在Form1上添加一个Timer控件Timer1,并把Timer1的Interval属性改为"2000",目地是让程序每两秒钟对游戏修改一次;
ReadProcessMemory 函数和WriteProcessMemory函数基本一样,就是第三个参数可以返回内存的数据,这里我就不再赘述了。
二 进程句柄的得到方法
对于VB初学者的来说,句柄这个词特别别扭,按我离解叫做数字编号更好一些,打个比方, 它就好像你的身份证编号.Windows为文件,进程,字体,窗口等都分配一个整数来标识,这个整数就是它们的句柄.
对内存指定地址的数据读取和写入的方法,困扰着许多VB爱好者,本文向大家介绍一种用VB来制作的游戏修改器,希望广大读者通过游戏修器制作,学会VB对内存读取和写入的技巧.文中尽量使用最易懂的词语来介绍,所以就算你是VB初学者,看过本文后,也能轻松制作出自己的游戏修改器。
一内存的写入和读取函数
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Dim pid As Long ' 储存进程标识符

vb写外挂的几个技巧

vb写外挂的几个技巧

1、VB的小图标处理2、后台鼠标的模拟移动和点击3、从进程获得文件执行路径4、打开文件夹的操作5、比sleep好用的延时函数所有代码都是参考人家的做的,我理解新人没有实例的痛苦,我也是参考一天一天的教程写出来的在此再次感谢新增的功能算是一个补充吧Public Function Delayt(ByV al num As Long) '延时函数,不会假死,这个函数是论坛上的Dim sTime As LongsTime = 1While sTime <= numsTime = sTime + 1DoEventsSleep 1WendEnd FunctionPrivate Sub Command1_Click()Text9.Text = GetFolder(Me.hWnd, "请选择一个文件夹:")End Sub'-----------小图标处理函数-------------------Private Sub Form_Resize()If Me.WindowState = 1 ThencSysTray1.InTray = TrueMe.Visible = FalseEnd IfEnd SubPrivate Sub cSysTray1_MouseUp(Button As Integer, Id As Long)Me.WindowState = 0 '程序回复到Normal状态Me.Visible = True '从任务栏中清除图标cSysTray1.InTray = False '令程序界面可见End Sub'----------------根据进程获取程序路径Function GetProcessPathByProcessID(PID As Long) As StringOn Error GoTo ZDim cbNeeded As LongDim szBuf(1 To 250) As LongDim Ret As LongDim szPathName As StringDim nSize As LongDim hProcess As LonghProcess = OpenProcess(&H400 Or &H10, 0, PID)If hProcess <> 0 ThenRet = EnumProcessModules(hProcess, szBuf(1), 250, cbNeeded)If Ret <> 0 ThenszPathName = Space(260)nSize = 500Ret = GetModuleFileNameExA(hProcess, szBuf(1), szPathName, nSize)GetProcessPathByProcessID = Left(szPathName, Ret)End IfEnd IfRet = CloseHandle(hProcess)If GetProcessPathByProcessID = "" ThenGetProcessPathByProcessID = "SYSTEM"End IfExit FunctionZ:End Function'-----------------------这是一个打开游戏工作目录的函数---------------Private Function GetFolder(ByV al hWnd As Long, Optional Title As String) As String Dim bi As BROWSEINFODim pidl As LongDim folder As Stringfolder = Space(255)With biIf IsNumeric(hWnd) Then .hOwner = hWnd.pidlroot = 0If Title <> "" Then.lpszTitle = Title & Chr$(0)Else.lpszTitle = "选择目录" & Chr$(0)End IfEnd Withpidl = SHBrowseForFolder(bi)If SHGetPathFromIDlist(ByV al pidl, ByV al folder) ThenGetFolder = Left(folder, InStr(folder, Chr$(0)) - 1)ElseGetFolder = ""End IfEnd Function'-----------------按键转换函数-----------------------------------Private Function Key(Anjian As Long) As LongSelect Case AnjianCase 0Key = &H70Case 1Key = &H71 'F2Case 2Key = &H72 'F3Case 3Key = &H73 'F4Case 4Key = &H74Case 5Key = &H75Case 6Key = &H76Case 7Key = &H77Case 8Key = &H31 '1Case 9Key = &H32 '2Case 10Key = &H33 '3Case 11Key = &H34Case 12Key = &H35 '5Case 13Key = &H36Case 14Key = &H37Case 15Key = &H38Case 16Key = &H39 '9Case 17Key = &H30 '0End SelectEnd FunctionPrivate Sub Command4_Click()'此处是作为运行游戏的语句的,但是目前还没有能够解决这个问题End SubPrivate Sub Form_Load()hwd = FindWindow("new3d_WCLASS", "Childhood 3d Client")If hwd = 0 ThenLabel17.Caption = " 游戏末运行,请先打开游戏"End IfGetWindowThreadProcessId hwd, PID '获取进程标识符'将进程标识符做为参数,返回目标进程PID的句柄,得到此句柄后'即可对目标进行读写操,PROCESS_ALL_ACCESS表示完全控制,权限最大If PID <> 0 ThenText9.Text = GetProcessPathByProcessID(PID)End Ifb = 0c = 0test1 = 0test2 = 0End SubPrivate Sub Form_Unload(Cancel As Integer)Timer1.Enabled = FalseEnd SubPrivate Function MyHotKey(vKeyCode) As BooleanMyHotKey = (GetAsyncKeyState(vKeyCode) < 0)End Function'-------------隐藏游戏-----------------------------Private Sub hidegame_Click()If hidegame.Caption = "隐藏游戏" Thenhidegame.Caption = "显示游戏"ShowWindow hwd, SW_HIDEc = 1ElseIf hidegame.Caption = "显示游戏" Thenhidegame.Caption = "隐藏游戏"ShowWindow hwd, SW_SHOWc = 0End IfEnd SubPrivate Sub Timer1_Timer() '信息Dim name(15) As Byte '存储人物名称Dim name_temp As StringDim map_temp As StringDim base2 As LongDim fight As LongDim moc As LongDim test(15) As ByteDim teststr As StringhProcess = OpenProcess(PROCESS_ALL_ACCESS, False, PID)If hProcess ThenMoveWindow hwd, 0, 0, 800, 600, True'===============这儿我在测试做一个txt文件测试用的,主要是记录工作信息================ReadProcessMemory hProcess, ByV al &HAB4388 + &H8, test1, 4, 0&If test1 <> test2 And test1 > 0 ThenReadProcessMemory hProcess, ByV al &HAB4388 + &H8, test2, 4, 0&ReadProcessMemory hProcess, ByV al test1 + &H30, test(0), 16, 0&Text10.Text = "你打到了一只" & StrConv(test, vbUnicode)List1.AddItem Text10.TextEnd If'Text10.Text = Text10.Text & "Text10.Text <br>"'---------战斗刷新----------------------------------------ReadProcessMemory hProcess, ByV al &HAB3738, fight, 4, 0&ReadProcessMemory hProcess, ByV al &HAB3380, moc, 4, 0&If fight > 0 ThenLabel17.Caption = "经验:" & exp & " 人物状态:战斗中"'-----------检查宠物是否参加战斗--------------If Check1(0).V alue = 1 ThenSendMessage hwd, &H100, 32, 0&SendMessage hwd, &H101, 32, 0&Delayt 200SendMessage hwd, &H100, 32, 0&SendMessage hwd, &H101, 32, 0&ElseSendMessage hwd, &H100, 32, 0&SendMessage hwd, &H101, 32, 0&End IfElseLabel17.Caption = "经验:" & exp & " 人物状态:普通"End If'------------------------------------------------------'********************信息刷新**************************'----------这段代码写得很烦,这是因为他们的偏移量比较古怪-----ReadProcessMemory hProcess, ByV al &HAB3534, base, 4, 0&base = base + &HC4ReadProcessMemory hProcess, ByV al base + &HC3, exp, 4, 0&ReadProcessMemory hProcess, ByV al &HAB3610, base, 4, 0&ReadProcessMemory hProcess, ByV al base + &HDC, base, 4, 0&ReadProcessMemory hProcess, ByV al base + &H490, hp, 4, 0&ReadProcessMemory hProcess, ByV al base + &H48C, hpmax, 4, 0&ReadProcessMemory hProcess, ByV al &HAB3610, base, 4, 0&ReadProcessMemory hProcess, ByV al bas e + &HE0, base, 4, 0&ReadProcessMemory hProcess, ByV al base + &H490, mp, 4, 0&ReadProcessMemory hProcess, ByV al base + &H48C, mpmax, 4, 0&ReadProcessMemory hProcess, ByV al &HAB3610, base, 4, 0&ReadProcessMemory hProcess, ByV al base + &HEC, base, 4, 0&ReadProcessMemory hProcess, ByV al base + &H490, bbhp, 4, 0&ReadProcessMemory hProcess, ByV al base + &H48C, bbhpmax, 4, 0&ReadProcessMemory hProcess, ByV al &HAB3610, base, 4, 0&ReadProcessMemory hProcess, ByV al base + &HF0, base, 4, 0&ReadProcessMemory hProcess, ByV al base + &H490, bbmp, 4, 0&ReadProcessMemory hProcess, ByV al base + &H48C, bbmpmax, 4, 0&'--------------魔血检查初始化---------------------If b = 0 ThenText1.Text = Str$(CInt(hpmax / 3 * 2))Text3.Text = Str$(CInt(mpmax / 3 * 2))Text5.Text = Str$(CInt(bbhpmax / 3 * 2))Text6.Text = Str$(CInt(bbmpmax / 3 * 2))Combo1(0).ListIndex = 17Combo1(1).ListIndex = 16Combo1(2).ListIndex = 17Combo1(3).ListIndex = 16b = 1End If'------------------上面这段是初始化赋值的-----------------If Check1(1).V alue = 1 ThenIf hp < V al(Text1.Text) ThenSendMessage hwd, &H100, Key(Combo1(0).ListIndex), 0&SendMessage hwd, &H101, Key(Combo1(0).ListIndex), 0&ReadProcessMemory hProcess, ByV al &HAB3380, moc, 4, 0&If moc = 27 Thenlp = 30lp = lp * 65536 + 30'SendMessage hwd, WM_MOUSEMOVE, 0, ByV al lp 需要后台移动的朋友,这句话就是PostMessage hwd, WM_LBUTTONDOWN, MK_LBUTTON, lp '这是后台模拟点击的,这方面的资料偶找了好久啊..PostMessage hwd, WM_LBUTTONUP, MK_LBUTTON, lpDelayt V al(Text2.Text)' Text9.Text = Text9.Text & "当前人物血量:" & hp & "/" & Text1.Text & " 加血" End IfEnd IfIf mp < V al(Text3.Text) ThenSendMessage hwd, &H100, Key(Combo1(1).ListIndex), 0&SendMessage hwd, &H101, Key(Combo1(1).ListIndex), 0&ReadProcessMemory hProcess, ByV al &HAB3380, moc, 4, 0&If moc = 27 Thenlp = 30lp = lp * 65536 + 30'SendMessage hwd, WM_MOUSEMOVE, 0, ByV al lpPostMessage hwd, WM_LBUTTONDOWN, MK_LBUTTON, lp PostMessage hwd, WM_LBUTTONUP, MK_LBUTTON, lpDelayt V al(Text4.Text)'Text9.Text = Text9.Text & "当前人物魔法:" & mp & "/" & Text3.Text & " 加蓝" End IfEnd IfIf bbhp < V al(Text5.Text) ThenSendMessage hwd, &H100, Key(Combo1(2).ListIndex), 0&SendMessage hwd, &H101, Key(Combo1(2).ListIndex), 0&ReadProcessMemory hProcess, ByV al &HAB3380, moc, 4, 0&If moc = 27 Thenlp = 94lp = lp * 65536 + 13'SendMessage hwd, WM_MOUSEMOVE, 0, ByV al lpPostMessage hwd, WM_LBUTTONDOWN, MK_LBUTTON, lp PostMessage hwd, WM_LBUTTONUP, MK_LBUTTON, lpDelayt V al(Text7.Text)'Text9.Text = Text9.Text & "当前宠物血量:" & bbhp & "/" & Text5.Text & " 加血" End IfEnd IfIf bbmp < V al(Text6.Text) ThenSendMessage hwd, &H100, Key(Combo1(3).ListIndex), 0&SendMessage hwd, &H101, Key(Combo1(3).ListIndex), 0&ReadProcessMemory hProcess, ByV al &HAB3380, moc, 4, 0&If moc = 27 Thenlp = 94lp = lp * 65536 + 13'SendMessage hwd, WM_MOUSEMOVE, 0, ByV al lpPostMessage hwd, WM_LBUTTONDOWN, MK_LBUTTON, lp PostMessage hwd, WM_LBUTTONUP, MK_LBUTTON, lpDelayt V al(Text8.Text)'Text9.Text = Text9.Text & "当前宠物魔法:" & bbmp & "/" & Text6.Text & " 加蓝" End IfEnd IfEnd Ifbase = &HAB2E34ReadProcessMemory hProcess, ByV al base, base, 4, 0& ReadProcessMemory hProcess, ByV al base + &H18, base, 4, 0& ReadProcessMemory hProcess, ByV al base + &H174, mx, 4, 0& ReadProcessMemory hProcess, ByV al base + &H178, my, 4, 0& ReadProcessMemory hProcess, ByV al &HAB2E34, base, 4, 0& ReadProcessMemory hProcess, ByV al base + &HD8, map(0), 15, 0&map_temp = StrConv(map, vbUnicode)'WriteProcessMemory hProcess, ByV al &H3162A80, mpmax, 4, 0&End IfCloseHandle hProcess'----------------这是热键隐藏游戏--------------------If MyHotKey(vbKeyK) And vbKeyControl Then 'ctrl+AIf c = 1 ThenShowWindow hwd, SW_SHOWhidegame.Caption = "隐藏游戏"c = 0ElseIf c = 0 ThenShowWindow hwd, SW_HIDEhidegame.Caption = "显示游戏"c = 1End IfEnd If。

VB6读写内存的方法和技巧

VB6读写内存的方法和技巧

VB读写内存一些背景知识不象C语音,VB不会自动包括普通的API函数的声明,因此我们必须把他们加入我们的项目文件。

在几乎所有的修改器中会使用到6个主要的函数,讨论如下:1. FindWindow(ClassName, WindowTitle) - FindWindow 返回符合指定的类名( ClassName)和窗口名( WindowTitle )的窗口句柄。

对我们来说,可以让ClassName 为空( Null ),只给出游戏的WindowTitle。

函数应该这样声明:Declare Function FindWindow Lib "user32" Alias"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String)As Long2. GetWindowThreadProcessId(WindowHandle, ProcessId) - 在这里我们把FindWindow函数中得到的句柄作为参数,来获得进程标识符(ProcessId )。

声明如下:Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessIdAs Long) As Long3. OpenProcess(DesiredAccess, Inherit, ProcessId) -这个函数将返回一个我们目标进程的句柄,可以用来对目标进行读写操作。

DesiredAccess参数的值决定了句柄对进程的存取权利,对我们来说,要使用PROCESS_ALL_ACCESS (完全存取权限)。

Inherit 应该总是False。

ProcessId 是从GetWindowThreadProcessId 函数中取得的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

你说你想用VB做外挂,有人说:“对不起,我想这是不可能的,因为VB是一个如此简单的编程语音。

"如果有人这么告诉你,别去理他。

我可以肯定告诉你,对于制作修改器这种简单的程序,VB完全可以胜任。

然而,有个问题必须首先考虑:使用VB编写的修改器需要VB的运行库才能运行。

如果考虑到有些使用者(实际上可能是大部分使用者)没有运行库,那么在最后制作的ZIP压缩文件中就必须包含这些庞大的文件。

在下面的教程里我将制作一个修改器,如果为它再制作一个安装程序,那么整个修改器的体积将超过1MB。

其中包括一个很好的安装和反安装程序,但大部分还是VB40032.DLL 这个文件。

除了以上这点,使用VB制作修改器是非常简单的。

一旦制作了多次后,你会发现能很快地制作出一个修改器。

而且使用VB制作的修改器能够毫无困难地解决游戏运行时的动态内存分配问题,因此即使是最新的游戏,也可以使用VB制作修改器。

在本教程中将不涉及动态内存分配,因为虽然简单,但仍然属于一个高级的选项。

一些背景知识不象C语音,VB不会自动包括普通的API函数的声明,因此我们必须把他们加入我们的项目文件。

在几乎所有的修改器中会使用到6个主要的函数,讨论如下:1. FindWindow(ClassName, WindowTitle) - FindWindow 返回符合指定的类名( ClassName)和窗口名( WindowTitle )的窗口句柄。

对我们来说,可以让ClassName 为空( Null ),只给出游戏的WindowTitle。

函数应该这样声明:Declare Function FindWindow Lib "user32" Alias"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String)As Long2. GetWindowThreadProcessId(WindowHandle, ProcessId) - 在这里我们把FindWindow函数中得到的句柄作为参数,来获得进程标识符(ProcessId )。

声明如下:Declare FunctionGetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessIdAs Long) As Long3. OpenProcess(DesiredAccess, Inherit, ProcessId) -这个函数将返回一个我们目标进程的句柄,可以用来对目标进行读写操作。

DesiredAccess参数的值决定了句柄对进程的存取权利,对我们来说,要使用PROCESS_ALL_ACCESS (完全存取权限)。

Inherit 应该总是False。

ProcessId 是从GetWindowThreadProcessId 函数中取得的。

Declare FunctionOpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long4. CloseHandle(ProcessHandle) - 每一个打开的句柄必须呼叫这个函数来关闭。

Declare FunctionCloseHandle Lib "kernel32" (ByVal hObject As Long) As Long5. WriteProcessMemory(ProcessHandle, Address, value, Sizeofvalue, BytesWritten) - 把指定的值value 写入由Address 指定的目标地址。

Declare FunctionWriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long6. ReadProcessMemory(ProcessHandle, Address, value, Sizeofvalue, BytesWritten) - 把Address 指定的目标地址的值存入value 位置的变量中。

Declare FunctionWriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long这些函数一环扣一环,缺一不可。

更详细的内容可以参考VB的帮助文件。

一个简单的修改器范例如何使上面介绍的这些函数一起工作,制作出我们需要的修改器呢?下面是一个为Windows的计算器程序制作修改器的例子。

这个修改器将读出计算器窗口中显示的数值,并在点击一个按钮后在计算器窗口中显示我们的名字。

首先我们需要找到计算器显示窗口中显示值的地址。

本教程不是关于如何进行内存搜索,因而我将只作简单的说明:·在计算器窗口中输入123456·使用你喜欢的任何一种内存地址搜索程序寻找字串123456·使用另一个值重复上面的过程直到只返回1个地址那是制作我们的修改器需要的唯一一个地址。

在我的计算器程序里这个地址是40B181 hex, 4239745dec。

用你找到的地址替代在下面的代码里使用的这个地址。

现在让我们开始设计修改器的界面:·在VB中新建一个项目,加入一个文本框( Textbox )、一个按钮和一个计时器( timer)。

文本框用来显示从计算器窗口取得的字串,按钮用来把我们的名字传到计算器窗口·把表单( form )的标题( Caption )属性设为Calculator Trainer·把文本框改名为txtDisplay 并清除Text 属性·把计时器改名为ReadTimer 并把间隔( interval )设为500·把按钮的标题改为Display Name,按钮的名字改为btnPasteName在这个修改器中我们将使用所有6个函数,ReadProcessMemory、WriteProcessMemory、OpenProcess、GetWindowThreadProcessId、FindWindow 和CloseHandle。

在项目中插入一个新的模块,增加下列代码。

(下面的一些行自动换行了,在你的模块中每一句必须在一行里,或使用延长符_)Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongDeclare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As LongDeclare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As LongDeclare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long下面我们要开始写在计时器窗口中显示我们名字的代码了。

首先我们使用FindWindow函数取得目标窗口的句柄。

把这个返回值保存在一个变量中,并检查它的值是否出错来确保计时器程序正在运行。

(FindWindow函数出错时返回0)Dim hwnd As Longhwnd = FindWindow(vbNullString, "Calculator")If (hwnd = 0) ThenMsgBox "Window not found!"Exit SubEnd If注意在这里我们传递了一个Null 值给FindWindow 函数,而不是ClassName。

因此任何名为Calculator的窗口都符合条件。

如果知道计算器程序窗口的ClassName,你可以传给它,但这不是必须的。

现在使用得到的窗口句柄来取得进程标识符( ProcessId )。

注意pid 是作为参数传递给函数的,而不是被赋以函数返回值。

Dim pid As LongGetWindowThreadProcessId hwnd, pid再利用变量pid得到计算器程序的进程句柄。

再次检查函数的返回值,如果是非法数据则退出程序。

Dim pHandle As LongpHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)If (pHandle = 0) ThenMsgBox "Couldn&#39;t get a process handle!"Exit SubEnd If在我们的修改器中WriteProcessMemory 函数是最重要的部分,而且非常容易出错。

不妨让我们再仔细讨论一下它的参数。

相关文档
最新文档