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 函数中取得的。

用VB制作外挂

用VB制作外挂

用VB制作外挂用VB制作外挂1.鼠标模拟技术几乎所有的游戏中都使用了鼠标来改变角色的位置和方向,玩家仅用一个小小的鼠标,就可以使角色畅游天下。

那么,我们如何实现在没有玩家的参与下角色也可以自动行走呢。

其实实现这个并不难,仅仅几个Windows API函数就可以搞定,让我们先来认识认识这些API函数。

(1) 模拟鼠标动作API函数mouse_event,它可以实现模拟鼠标按下和放开等动作。

VOID mouse_event(DWORD dwFlags, // 鼠标动作标识。

DWORD dx, // 鼠标水平方向位置。

DWORD dy, // 鼠标垂直方向位置。

DWORD dwData, // 鼠标轮子转动的数量。

DWORD dwExtraInfo // 一个关联鼠标动作辅加信息。

);其中,dwFlags表示了各种各样的鼠标动作和点击活动,它的常用取值如下:MOUSEEVENTF_MOVE 表示模拟鼠标移动事件。

MOUSEEVENTF_LEFTDOWN 表示模拟按下鼠标左键。

MOUSEEVENTF_LEFTUP 表示模拟放开鼠标左键。

MOUSEEVENTF_RIGHTDOWN 表示模拟按下鼠标右键。

MOUSEEVENTF_RIGHTUP 表示模拟放开鼠标右键。

MOUSEEVENTF_MIDDLEDOWN 表示模拟按下鼠标中键。

MOUSEEVENTF_MIDDLEUP 表示模拟放开鼠标中键。

(2)、设置和获取当前鼠标位置的API函数。

获取当前鼠标位置使用GetCursorPos()函数,设置当前鼠标位置使用SetCursorPos()函数。

BOOL GetCursorPos(LPPOINT lpPoint // 返回鼠标的当前位置。

);BOOL SetCursorPos(int X, // 鼠标的水平方向位置。

int Y //鼠标的垂直方向位置。

);通常游戏角色的行走都是通过鼠标移动至目的地,然后按一下鼠标的按钮就搞定了。

vb api函数使用手册

vb api函数使用手册

vb api函数使用手册VB(Visual Basic)是一种易于学习和使用的编程语言,广泛应用于Windows操作系统的开发中。

在VB中,API(应用程序编程接口)函数提供了访问操作系统底层功能的途径。

本手册旨在帮助开发者熟悉和正确使用VB中的API函数。

一、什么是API函数API(Application Programming Interface)函数是一组操作系统或应用程序提供的功能接口。

通过调用API函数,开发者可以访问操作系统底层功能,实现更为高级和复杂的功能需求。

VB中的API函数主要用于实现与操作系统进行交互,如读取系统信息、控制系统行为等。

二、API函数的声明和使用VB中使用API函数需要进行以下四个步骤:声明、加载、调用和释放。

1.声明在VB代码中声明API函数,需要使用Declare语句。

具体的语法如下:Declare Function 函数名 Lib "库名" Alias "函数别名" (参数列表) As 返回值类型其中,- 函数名表示API函数的名称;- 库名表示包含API函数的动态链接库(DLL)文件名;- 函数别名是可选的,用于给API函数指定一个不同于其在DLL中定义的名称;- 参数列表表示API函数的参数,多个参数之间使用逗号分隔;- 返回值类型表示API函数的返回值类型。

2.加载在VB代码中加载API函数所在的DLL,需要使用LoadLibrary函数。

具体的语法如下:Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long其中,- LoadLibrary是一个Windows API函数,用于加载指定的DLL文件;- "kernel32"表示包含LoadLibrary函数的动态链接库文件;- "LoadLibraryA"是LoadLibrary函数的别名,其中A表示使用ANSI字符集。

VB编写游戏外挂的原理【新手篇】。

VB编写游戏外挂的原理【新手篇】。

VB编写游戏外挂的原理【新手篇】。

VB编写游戏外挂的原理【新手篇】。

VB编写游戏外挂的原理一、前言所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作、修改游戏网络数据包以及修改游戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将。

虽然,现在对游戏外挂程序的“合法”身份众说纷纭,在这里我不想对此发表任何个人意见,让时间去说明一切吧。

不管游戏外挂程序是不是“合法”身份,但是它却是具有一定的技术含量的,在这些小小程序中使用了许多高端技术,如拦截Sock技术、拦截API技术、模拟键盘与鼠标技术、直接修改程序内存技术等等。

本文将对常见的游戏外挂中使用的技术进行全面剖析。

二、认识外挂游戏外挂的历史可以追溯到单机版游戏时代,只不过当时它使用了另一个更通俗易懂的名字??游戏修改器。

它可以在游戏中追踪锁定游戏主人公的各项能力数值。

这样玩家在游戏中可以达到主角不掉血、不耗费魔法、不消耗金钱等目的。

这样降低了游戏的难度,使得玩家更容易通关。

随着网络游戏的时代的来临,游戏外挂在原有的功能之上进行了新的发展,它变得更加多种多样,功能更加强大,操作更加简单,以至有些游戏的外挂已经成为一个体系,比如《石器时代》,外挂品种达到了几十种,自动战斗、自动行走、自动练级、自动补血、加速、不遇敌、原地遇敌、快速增加经验值、按键精灵……几乎无所不包。

游戏外挂的设计主要是针对于某个游戏开发的,我们可以根据它针对的游戏的类型可大致可将外挂分为两种大类。

一类是将游戏中大量繁琐和无聊的攻击动作使用外挂自动完成,以帮助玩家轻松搞定攻击对象并可以快速的增加玩家的经验值。

比如在《龙族》中有一种工作的设定,玩家的工作等级越高,就可以驾驭越好的装备。

但是增加工作等级却不是一件有趣的事情,毋宁说是重复枯燥的机械劳动。

如果你想做法师用的杖,首先需要做基本工作--?砍树。

砍树的方法很简单,在一棵大树前不停的点鼠标就可以了,每10000的经验升一级。

VB API函数大全

VB API函数大全

VB API 函数大全Show the "Save File" CommonDialog 显示“保存文件”对话框Show the "Browse Folder" Common Dialog 显示“浏览文件夹”对话框 Suspend a Computer 挂起计算机Test if an application is responding and terminate application 测定一个应用程序是响应还是终止(以IE 为例)。

Test if an application is responding and terminate application (续:)测定一个应用程序是响应还是终止Format a floppy disk 格式化软盘Zero a portion of an array 清零一个数组Determine the free space on a drive 测定驱动器上的空闲空间Edit the files stored in the "Documents" menu 编辑保存在文档菜单的文件 Copy files using the File Copy Shell 使用File Copy Shell ,拷贝文件 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 返回临时目录的路径 Return the path of the windows directory 返回windows 目录的路径 Return the path of the system directory 返回system 目录的路径 Create a GUID 创建一个GUIDEnable and Disable the windows task bar 激活和禁止windows 任务条 Determining the system folder locations 设定system 文件夹的位置 Obtaining information about the operating system 获得操作系统的信息 Find the path of the executable associated with a file 找到文件的完整路径Locking the application screen area 锁住应用程序客户区。

一天一天学外挂详细教程(VB)

一天一天学外挂详细教程(VB)

一下是一个经典的教程:第一天-CE看数据学习目的:很多的数据地址都已经被各位大大们发现了,而我们直接拿来主义就好啦,可以利用这些数据制作简单的程序从而实现很多功能。

今天我们首先了解如何在CE中显示已知的地址内的数据。

更新提示:由于66版的更新,请将文章中的基地址由&H8C6A54替换成&H8C9E54内容:1.我们可以用CE打开武林外传。

运行CE,按照下图的次序打开(...\武林外传\element\ele mentclient.exe)2.游戏启动后,别忘了选择游戏窗口。

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

4.好,现在我们要在CE中显示人物的生命值。

同样按照图中的顺序打开“添加地址”对话框,在数据框中添加我们已知的内存地址。

当然,我们要用指针的方式,因为存储这些数据的地址是不固定的,我们可以用8C6A54这个固定的基地址以及相关的偏移地址找到我们需要的数据。

我们就来看看生命的值,完成图上的项目点“确定”来看看结果。

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

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

文章涉及软件:Cheat Engine游戏修改器5.2 (CE)http://www.hot.ee/tan333/CheatEngine52.exe /ym/soft/ce52.rar相关武林外传地址:一级基址=8C6A54 (可能会在其他电脑上不能使用)人物基址=+24当前血=+254最大血=+26C当前蓝=+258最大蓝=+270以上数字均为16进制第二天-实现VB显示游戏数据学习目的:利用已知的地址,在VB中显示游戏中的相关数据。

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

2.我们要建立一个模块,然后添加以下代码:Option Explicit'---------------声明函数-----------------------'得到窗体句柄的函数,FindWindow函数用来返回符合指定的类名( ClassName )和窗口名( WindowTitle )的窗口句柄Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpCla ssName 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 Str ing) As Long'得到进程标识符的函数Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As L ong, lpdwProcessId As Long) As Long'得到目标进程句柄的函数Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Lo ng, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long'关闭句柄的函数Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Lo ng'读取进程内存的函数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 = &H1F0FFF3.接下来Form中,我们要在程序启动时连接游戏窗口,以下是Form_Load的代码:Dim hwd As Long …储存FindWindow 函数返回的句柄Dim pid As LongDim hProcess As Long '存放进程句柄Private Sub Form_Load()hwd = FindWindow("QElementClient Window", "Element Client")If hwd = 0 ThenMsgBox "未启动游戏", vbOKOnly, "提示"Unload Form1End IfGetWindowThreadProcessId hwd, pid '获取进程标识符'将进程标识符做为参数,返回目标进程PID的句柄,得到此句柄后'即可对目标进行读写操,PROCESS_ALL_ACCESS表示完全控制,权限最大hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid)If hProcess = 0 ThenMsgBox "不能打开进程", vbOKOnly, "提示"Unload Form1End IfCloseHandle hProcess4.我们在Form中添加一个Label控件和一个Timer控件,设置Timer的Interval属性为10 0,Timer1_Timer的代码如下:Dim h As LonghProcess = OpenProcess(PROCESS_ALL_ACCESS, False, pid)If hProcess ThenReadProcessMemory hProcess, ByVal &H8C6A54, h, 4, 0& …这三条代码读取获得生命值ReadProcessMemory hProcess, ByVal h + &H24, h, 4, 0& ReadProcessMemory hProcess, ByVal h + &H254, h, 4, 0&CloseHandle hProcessEnd IfLabel1.Caption = h …输出生命值5.好了,数据显示出来了。

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

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

vb用API修改内存实例(做外挂)你说你想用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 )。

以下是用VB做外挂的一些知识

以下是用VB做外挂的一些知识

以下是用VB做外挂的一些知识.我个人认为是入门的一些知识.不敢独享.贴出来给大家!~有时间随时补充~呵呵1.查找目标窗口.需要做外挂,就需要查找目标窗口.然后才做一些其他的动作.比如说鼠标键盘模拟啦.内存修改啦.封包型发送与替换啦什么什么的------------------------------------------------------------------------- '定义模块Declare Function FindWindow Lib "user32" Alias "FindWin dowA" (ByVal lpClassName As String, ByVal lpWindowNa me As String) As Long'在窗口中建立一timer(时间控制器),然后在代码窗口输入如下代码:Private Sub Form_Load()Timer1.Interval = 500End Sub时间控制器的代码如下:Private Sub Timer1_Timer()Dim hwnd As Longhwnd = FindWindow(vbNullString, "计算器") '抓取"计算器"这个窗口名称.If (hwnd = 0) ThenIf MsgBox("你没有打开[计算器]程序!点击“确定”退出。

点“取消”继续。

", 49, "错误!") = 1 Then EndElseIf (hwnd <> 0) ThenMsgBox "你已经打开了[计算器]程序.点“确定”退出本程序", , "退出"EndEnd IfEnd Sub2.以下为模拟键盘事件.比如模拟"r"键.'在模块中定义Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, B yVal dwExtraInfo As Long)在窗口中建立一timer.时间间隔随意.只要不是0就可以了Private Sub Timer1_Timer()Call keybd_event(82, 0, 0, 0) '模拟按下"R"键End Sub3.以下为快捷键例子.比如按下"ctrl+A"就退出!'可以设置Form的KeyPreview属性为True,然后在For m_KeyDown事件中添加代码:Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)If KeyCode = Asc("A") And Shift = vbCtrlMask Then unloa d me '如果ctrl+A键被按下就退出End Sub例二:在Form中加入Private Declare Function GetAsyncKeyState Lib "user32" (B yVal vkey As Long) As IntegerPrivate Function MyHotKey(vKeyCode) As Boolean MyHotKey = (GetAsyncKeyState(vKeyCode) < 0)End Function'然后在循环中或Timer的Timer事件中检测:Private Sub Timer1_Timer()If MyHotKey(vbKeyA) And vbKeyControl Then 'ctrl+A End '关闭End If'其中vbkeyA是键盘〃A〃的常数,其他键可按F1查得。

在VB中使用API函数

在VB中使用API函数

在VB中使用API函数在VB中,可以使用API函数来实现一些高级功能或者与操作系统进行交互。

API(Application Programming Interface)是操作系统提供给开发人员的一组函数和接口,可以通过调用这些函数和接口来访问操作系统的底层功能。

1. 调用Windows API函数获取系统时间使用`GetSystemTime`函数可以获取当前系统的时间信息。

```vbPrivate Type SYSTEMTIMEwYear As IntegerwMonth As IntegerwDayOfWeek As IntegerwDay As IntegerwHour As IntegerwMinute As IntegerwSecond As IntegerwMilliseconds As IntegerEnd TypePrivate Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)Private Sub GetTimeDim sysTime As SYSTEMTIMEGetSystemTime sysTimeMsgBox "Current Time: " & sysTime.wHour & ":" &sysTime.wMinute & ":" & sysTime.wSecondEnd Sub```2. 调用Windows API函数显示消息框使用`MessageBox`函数可以显示一个消息框。

```vbPrivate Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As LongPrivate Sub ShowMessageDim result As Longresult = MessageBox(0, "Hello World!", "Message", vbInformation)If result = 1 ThenMsgBox "User clicked OK"ElseMsgBox "User clicked Cancel"End IfEnd Sub```3. 调用Windows API函数实现全屏显示使用`ShowWindow`函数可以设置应用程序窗口的显示状态。

在VB中使用API函数详解

在VB中使用API函数详解

在VB中使用API函数详解API(Advanced Programmers Interface,高级程序员接口)(注:API 实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.一、什么是API? API(Application Programming Interface,应用程序编程接口)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.二、Windows的一些特别之处Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句柄.三、Any 四、回调(CallBacks) 五、子类处理Windows的一些特别之处这个主题是要告诉你Windows 的一些与在VB中的不同的细节Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句柄.Windows 使用像素(Pixel)而不是缇(Twip).因此,把涉及API函数调用的控件的ScaleMode属性设为3--(Pixel)是个不错的主意,这样你可以通过ScaleXXX属性得到它们的公制单位值.尽管这样,你可能有时仍需要进行从Twip到Pixel的转换(反之亦然),你可以通过Screen对象的TwipsPerPixelX和TwipsPerPixelY来实现.举例如下:PixelXValue=TwipXValue\Screen.TwipsPerPixelX PixelYValue=TwipYValue\Screen.TwipsPerPixelY TwipXValue=PixelXValue*Screen.TwipsPerPixelX TwipYValue=PixelYValue*Screen.TwipsPerPixelY我并没有在实际中见到过TwipsPerPixelX 和TwipsPerPixelY 的值有什么不同,但你最好是把它们区别开来而不是混用,这至少是一种好的程序设计风格.另外需要注意的是,这里用的是" \ "(整除) 而不是 " / " ,这是因为像素值必须是整数. 另外需要提到的是,Windows函数中用到了不同的坐标系统,因此需要注意.Windows的一些特别之处最后要注意的是,一旦你使用了API 函数,VB就可能不再可靠了---API调用中一个简单的语法错误就会导致VB 崩溃!(请经常保存您的工程).VB 并不能识别API调用中的错误,因此一旦你的程序出现异常,要先检查API调用---是否缺少 ByVal,或者是错误的类型,参数等等. 从哪里得到有关函数的说明? 这个主题不会告诉你如何通过API函数改变按钮文字或如何快速查找一个文件.这不是一个API函数文档. 为了得到有关函数的说明,你需要SDK帮助或微软的SDK文档(至少有40M---我怎么可能放在这里?).这些SDK帮助通常都包含在Borland Dephli 3.0 开发包或者MS Visual C++中.到网上去或找您的朋友要一个,版本越新越好注意Win3.x 的SDK 帮助对你并没有用,因为很多函数已经过于陈旧甚至废弃不用,尽管他们中的大多数由于与 Windows95兼容而依然存在.API参数类型如果你已经有了一个SDK帮助,你肯定主意到了函数的返回之或参数有很多奇怪的类型如VOID,LPCSTR, 和DWORD.如果你对C语言比较熟悉的话,那你肯定明白它们的意思.对于其他不熟悉C语言的人,这里有一张摘自VB Books Online(标题是:C语言声明到Visual Basic的转换) Books Online(标题是:C语言声明到Visual Basic的转换) <> bordercolordark="#FFFFFF" cellpadding="0">API参数类型注释:你应该注意到了BOOL类型(Boolean)求出的值为Long而不是Boolean.因此0表示"假"(False),其他任何值表示"真"(True). HWND,HDC,HMENU,etc.---etc.指其他所有与于前面所述相似的类型.它们都以"H"开头来表示不同对象的句柄.举例来说,HBITMAP表示一副位图的句柄,HBRUSH标是一个刷子的句柄等等.它们均为Long而且要按值传递(ByVal).同样要注意LPVOID被声明为Any型变量,本文将会有独立的一个主题用来论述Any类型.有些类型以"LP"开头.LP 是Long Pointer的缩写.因此LPWORD 实际表示数据所存的内存地址.不过,你并没有必要调用某个函数来获取这个地址.当你按引用(ByRef)传递参数时,你实际上传递的就是它的地址.在这里你只需记住:如果某个参数的类型以"LP"开头,应该按引用(ByRef)传递.顺便说一句,LPARAM 与Lparam 很相似但不是Lparam,Lparam不是一个指针,在这里你必须传递它的真实值,因此要按值(ByVal)传递.NULL也是一种奇怪的类型.你可以从VB 中了解到有关它的描述,这里我不去讨论它.按你需要的形式传递它吧,在大多数情况下,可以用ByVal 0& 或 vbNullString.最后,VOID是用来指那些没有返回值的函数的.API中没有SUBs,这就是它们的标志.只要记住:如果一个函数被声明为VOID ,你必须在VB 中把它声明为 SUBAny有些消息的参数声明为Any.这表示该参数是一种可变的类型(你可以以整型,字符串,用户自定义或其他的类型来传递). 这有一个这样的例子:Public Declare Function SendMessage Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as Any) as Long lParam 声明为Any 并按引用(ByRef)传递.这里是在这个函数中如果lParam是不同类型的值时应遵循的规则: 如果该值是传递形式numeric ByVal(as Long,or as Any) Null ByVal(as Long,or as Any) String ByRef(as String,or as Any) Type ByRef(as Any) array of Type ByRef(as Any)如果你的函数声明同上面的一个而且你想传递一个Long型数,你应该这样写:Call SendMessage(Me.Hwnd,WM_XXXX,0&,ByVal LongValue) 注意尽管头三个参数也是数值,但它们前边并没有ByVal.这是因为在函数声明中它们已经被声明为按值传递(ByVal).第四个参数,由于是按引用传递(ByRef)(VB并不知道你要传递参数的类型),因此你必须加上ByVal 你可以使用别名技术来传递不同类型的参数:Public Declare Function SendMessageLng Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, ByVal lParam as Long) as Long或:Public Declare Function SendMessageStr Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as String) as Long注意API参数类型本身是不会改变的.例子中的第四个参数总是一个4字节的长型数.当你按值(ByVal)传递一个Long或Null时,该4字节长的数值就直接传递给函数.如果你传递一个String或其他的什么,你是按引用(ByRef)传递,VB传递的实际上是变量的地址,也是4个字节.参数传递你已经知道如何传递参数了,只需把他放到调用的函数中即刻.然而,当你使用API函数时,在传递参数是有一些你应该注意的细节. ByVal还是ByRef. 通常情况下,你不用为此担心,VB的API浏览器已经为你做好了一切,只需你输入数值它就会照所声明的方式传递.总的来说,ByVal是把实际的数值传递给函数,而ByRef是把地址传给函数.唯一的麻烦就是Any 类型. 把字符串传递给API函数也并不难.API函数需要的是字符串首字符的地址,然后读取该地址直到遇到一个Null字符.听起来很糟糕,但只是VB处理字符串的实际方法.你唯一要记住的是一定要按引用传递(ByRef)字符串当你想得到所需的函数返回值信息时,情况有稍微的一点不同. 这里是GetComputerName函数的声明: Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA"(ByVal lpBuffer As String, nSize As Long) As Long第一个参数是一个指向字符串的远程指针,第二个参数是字符串的长度.如果你只是简单的声明一个字符串类型的变量并把它传递给函数,就会出现错误.因此,你首先需要初始化字符串.这里是如何得到计算机名字的例子:Dim Buffer As String Buffer = Space(255) Ret& = GetComputerName(Buffer, Len(Buffer)) if Ret& > 0 thenCompName$ = Left(Buffer, Ret&)在这里,待传递的字符串被初始化为有255个空格的字符串.我们把它传递给函数同时还有它的长度.如果出错则返回值为0.参数传递CompName中将保存计算机名. 有些函数也需要传递数组,这里是一个例子:Declare Function SetSysColors Lib "user32" Alias "SetSysColors" (ByVal nChanges As Long, lpSysColor As Long, lpColorValues As Long) As Long最后两个参数是Long型数组.为了传递数组,你只需传递它的第一个元素.下面是示例代码:Const COLOR_ACTIVECAPTION = 2 Const COLOR_INACTIVECAPTION = 3Const COLOR_CAPTIONTEXT = 9Const COLOR_INACTIVECAPTIONTEXT = 19Dim SysColor(3) As Long Dim ColorValues(3) As LongDim Ret& SysColor(0) = COLOR_ACTIVECAPTIONSysColor(1) = COLOR_INACTIVECAPTIONSysColor(2) = COLOR_CAPTIONTEXTSysColor(3) = COLOR_INACTIVECAPTIONTEXT ColorValues(0) = RGB(58, 158, 58) ’深绿ColorValues(1) = RGB(93, 193, 93) ’浅绿ColorValues(2) = 0 ’黑色ColorValues(3) = RGB(126, 126, 126) ’灰色 Ret& = SetSysColors(4&, SysColor(0), ColorValues(0)) 该程序将改变所有活动和非活动窗口的标题栏背景和文本的颜色.回调(CallBacks)所谓回调,就是你自己定义一个函数,并告诉Windows何时为何调用.你可以写一个有特定数量和类型参数的函数,然后告诉Windows何时调用,并传递给它所需的参数.Windows就会调用你定义的函数,处理参数,并给你返回值.回调的一个典型应用是从Windows获得连续的数据流.这里是一个需要回调的函数的声明:Declare Function EnumWindows Lib "User32"ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long 第一个参数是你的回调函数的地址,第二个参数是你想传递的的任意数值.该值将被传递到你的函数,于是你就知道了它要调用什么.VB 5.0已经提供了一个很有用的操作符AddressOf ,可以得到一个函数的地址.当你调用一个函数时它只能用在参数的前面,下面这种用法是错误的并且会导致出错: FuncP = AddressOf MyFunction 因此你必须这样调用EnumWindows函数: Success& = EnumWindows(AddressOf cbFunc, 58&) 你必须也要自己写回调函数.问题是有很多不同类别的回调并且有各种各样的参数,有关这些参数的描述可以在SDK帮助或MS SDK文档中找到.这里是一个回调的声明:Function cbFunc (ByVal Hwnd, ByVal lParam) as Long这里是一个回调的例子:Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Long,ByVal lpString As String,ByVal cch As Long) As Long Success& = EnumWindows(AddressOf cbFunc, 58&)Function cbFunc (ByVal Hwnd, ByVal lParam) as LongIf lParam = 58 then ’enum windows Str$ = Space(255) Ret& = GetWindowText(Str$, Len(Str$))Debug.Print Left(Str$, Ret&)End IfEnd Function这个例子将列出窗口的标题,(不包含子窗体)窗口程序Windows并不知道事件. 这些是VB特有的隐藏Windows获取你的窗口发生事件的真正方法的一种方式.VB很像是一个将Windows语言翻译成VB语言的解释器.但是事实并非如此,你很快就会遇到.设想你想知道用户何时加亮了菜单选项(不是点击,只是加亮即选择了)VB并不提供这种事件,但你可能见到其他的程序,但你浏览它的菜单时状态栏会出现相应的文字.如果他们能,你为何不能?OK,这里是大致的真实情况.每个窗口都有一个特殊的程序叫做窗口程序.它实际上是一个回调函数.该函数将在你的窗口发生事件的任何时间发送消息.这样当用户加亮一个菜单项时就会发送一条消息(WM_COMMAND).那为什么我看不到这条消息呢?这是因为是VB创建窗口程序而不是你.当Windows发送消息时,该程序将为之分派特定的事件,并将其参数转换为比较容易用的事件的参数.但是在有些情况下,它会忽略有些消息而不能收到真实的输入.如果你真的想得到这些消息,你必须对你的窗体进行子类处理,我们将在另外一个主题中谈到.这里是一个回调窗口程序的声明:Function WindowProc(ByVal Hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long 第一个参数指定窗口的句柄,第二个参数是消息的标识符(如WM_COMMAND或WM_MOUSEMOVE),wParam和lParam时两个32位的数值,它们的意义依赖于消息的类型.子类处理当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势.子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,并能调用原来的窗口函数,它将在原来的窗口函数之前收到各种消息.但原来的那个窗口处理函数依然存在,并没有消失.如果你不想处理某条消息,你应该让原来的窗口函数去处理它.子类处理是通过调用SetWindowLong函数实现的,该函数将改变指定窗口的特殊属性.下面是它的声明:Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址.参见回调和窗口函数一节. 此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用. 如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.子类处理当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势.子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,并能调用原来的窗口函数,它将在原来的窗口函数之前收到各种消息.但原来的那个窗口处理函数依然存在,并没有消失.如果你不想处理某条消息,你应该让原来的窗口函数去处理它.子类处理是通过调用SetWindowLong函数实现的,该函数将改变指定窗口的特殊属性.下面是它的声明:Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex AsLong,ByVal dwNewLong As Long) As Long第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址.参见回调和窗口函数一节. 此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用. 如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.子类处理调用原窗口函数将由CallWindowProc来完成.这里是它的声明: Declare Function CallWindowProc Lib "user32" Alias"CallWindowProcA"(ByVal lpPrevWndFunc As Long,ByVal hWnd As Long,ByVal Msg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long第一个参数是原窗口函数的地址,其他的同你接收到的四个参数一样.你可以改变其中的值来控制对消息的处理.例如,当你收到了一条WM_MOUSEMOVE消息时,你从lParam中得到鼠标所在位置的坐标并将其改成了其他的坐标.那么原窗口函数就会认为鼠标位于其他的位置从而做出一些有趣的事如显示其他控件的Tooltip.你指定的返回值也是有意义的,它依赖于发送的消息. 在结束你的程序时将控制权交回给原窗口函数是很重要的,通常在Form_Unload中完成如下: Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProcAddress) 如果你在VB中启动程序时忘掉了这一行,结果将是VB崩溃并会丢失尚未保存的数据.千万要小心.这里是子类处理的一个简单示例:Dim oldWndProc As LongPrivate Sub Form_Load()oldWndProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf MyWndProc)End SubPrivate Sub Form_Unload()Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProc)End SubFunction MyWndProc(ByVal Hwnd As Long,ByVal wMsg as Long,ByVal wParam As Long,ByVal lParam As Long)Debug.Print wMsg & " " & wParam & " " & lParam Ret& = CallWindowProc(oldWndProc, Hwnd, wMsg, wParam, lParam) End Function处理参数有时函数并不以你所需的方式返回信息.一个典型的例子是将两个代表鼠标位置的整形(2 byte)数合并为一个4 Byte的数.还有一个例子是判断一个数的某位是否为1.你还可能得到一个代表一个结构地址的Long型数.合并和分离一个数并不需要过多的描述.你能在我们的网站(/SiliconValley/Lab/1632/)上找到APIMacro.bas,它包含了你需要的多种函数. 可以用一下方法检查一个数的第N位是否为1: If Value and (2^N) then ... 置1 Value = Value Or 2^N 置0 Value = Value And Not 2^N如果你想设定或取得预先知道的某位的信息,用1024代替2^10要快的多.因为这样VB无需自己进行计算(VB憎恨 "^" ?).如果你接收到一个类型的指针,你要做的工作将稍多一点.你可以使用CopyMem函数来取得信息.下面是它的声明: Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long) 如果你接收到了一个指向RECT 类型的指针并存在Long型变量Addr 中,可以这样处理: Dim Info As Rect Call CopyMem(Info, ByVal Addr, len(Info)) 注意ByVal 关键字.现在,如果你想把信息写回,使用: Call CopyMem(ByVal Addr, Info, Len(Info))结束语我希望这份教程能帮助你理解如何控制API函数的威力和如何正确使用它们.但是要小心!就像火,如果你让它失去控制,你就会玩蛋.当然,不要忘了VB是进行简单.安全程序设计的语言,而API函数则正好相反.如果你想得到更多的控制功能,最好转移到VC++ 或者Delphi. 祝你在API探险中好运!。

用VB编写游戏修改器图文教程

用VB编写游戏修改器图文教程

用VB编写游戏修改器图文教程这篇教程是针对不会编程的人写的,语言及技术上力求尽量简单,SO 在大虾的眼里一定超简单:)。

目前我们用的动态修改器都有提供保存修改地址的功能,更甚者金山游侠2002还有生成可执行文件修改器的功能。

[ize=+3]前言这篇教程是针对不会编程的人写的,语言及技术上力求尽量简单,SO 在大虾的眼里一定超简单:)。

目前我们用的动态修改器都有提供保存修改地址的功能,更甚者金山游侠2002还有生成可执行文件修改器的功能。

不过用这些修改器修改不太灵活,比如:如果你要修改的地方有几千处,难道你还一一的改?但如果自己编写的话就可以让电脑代劳^0^(下面会讲到)。

另一方面把自己的修改成果以修改器的形式和别人分享,会使自己(修改)所付出的劳动更有意义。

我写这篇文章不是要教读这篇文章的人成为VB高手(我也没这个能力),所以有些问题我不会讲的很清楚,对于读者来说也不必过分注意一些技术细节,很多东西你照着做就行了。

另外此教程只是针对游戏中地址固定的游戏,如果游戏中地址不固定(动态分配),那就需要用到汇编知识了,修改动态地址的游戏不在教程的讨论范围内[ize=+3]基础篇在讲如何编写前有必要讲一下基础的VB语法,以使你能看懂后面写的代码:3下面是本教程将会用到的语句:============================================================ =================这篇教程是针对不会编程的人写的,语言及技术上力求尽量简单,SO 在大虾的眼里一定超简单:)。

目前我们用的动态修改器都有提供保存修改地址的功能,更甚者金山游侠2002还有生成可执行文件修改器的功能。

Dim名称a类型说明:上面的语句是一个声明变量的语句,所谓变量简单的说就是一个‘容器’,用来存放‘数值’,而声明变量就是告诉系统建立一个‘容器’。

‘类型’是用来告诉系统这个‘容器’有多大。

vb用API控制播放CD(winmm.dll)

vb用API控制播放CD(winmm.dll)

vb用API控制播放CD(winmm.dll)首先:'函数声明Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long实例:'弹出CD-ROMPrivate Sub Command1_Click()i = mciSendString("set cd door open wait", mssg, 255, 0)End Sub'播放Private Sub Command2_Click()i = mciSendString("play cd", 0&, 0, 0)End SubForm事件源代码实例'程序启动时打开CDAudio设备并得到曲目总数Private Sub Form_Load()Dim ReturnStr As String * 128i% = mciSendString("open cdaudio", ReturnStr, 128, 0)i% = mciSendString("status cdaudio number of tracks", ReturnStr, 128, 0)Total = Val(ReturnStr)End Sub'退出时中止CD的播放Private Sub Form_Unload(Cancel As Integer)i% = mciSendString("stop cdaudio", 0&, 0, 0)i% = mciSendString("close cdaudio", 0&, 0, 0)mciSendString函数发送文本命令的详细实例:open cdaudiocdaudio是MCI认定的CD-ROM驱动器的设备名称(假定您的系统中只有一个CD-ROM驱动器。

  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 函数是最重要的部分,而且非常容易出错。

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

相关文档
最新文档