VB外挂之HOOK技术的最详细教程
简单易学 图文并茂 VB系统钩子与快捷键开发
简单易学图文并茂 系统钩子与快捷键开发创意和设计目标我喜欢将新建目录或者文件以日期打头,这样很方便排序和查找。
如下图:但每次新建目录后,都要手动输入日期。
这很不方便。
于是想到用快捷键了输入这个日期的创意。
目标是每当新建目录或文件后,按下F5键,自动插入当前日期。
为实现这个功能,可使用VB的Sends函数。
但因为需要程序在后台运行,因此打算把程序图标放到右下角的托盘中。
并且,因为它在按下F5键后执行,因此需要从系统中把按键信息捕捉出来,这就要用到系统钩子。
第一步创建一个Windows应用程序因为未来的程序在后台运行,因此它不需要任何界面。
这里把程序默认创建的Form的透明度设为0,把Border设为None,ControlBox设为0,ShowInTaskBar设为0。
这样它就不会在系统底部的状态栏出现了。
在Form上添加一个NotifyIcon,并指定一个喜欢的图标,这样程序在运行的时候,在右下角的托盘会出现一个图标。
之后,可以再加入一个ContextMenuStrip控件,并把它指定给NotifyIcon,这样右键点击图标的时候可以跳出控制菜单。
为方便调试,我在弹出目录中制作了两个功能,一个是显示和隐藏窗口,这个功能可为今后扩展用;一个是关闭功能,点击它可以关闭这个后台程序。
这两个功能不是我们的重点,这里只把代码贴出来。
***************************************************‘这个程序改变窗口的透明度,则窗口可以在桌面上显示和隐藏Private Sub changeShoe(ByVal sender As System.Object, ByVal e As KeyEventArgs)Select Case Me.OpacityCase 1Me.Opacity = 0Case 0Me.Opacity = 1End SelectEnd Sub‘这里将菜单第一项,即“Show Hide”和上述程序绑定起来Public Sub New()' 此调用是设计器所必需的。
VB编外挂的一些基础知识
VB编外挂的一些基础知识VB编外挂的一些基础知识VB编外挂1--取游戏ID需要VB API函数:FindWindow ←寻找窗口列表中第一个符合指定条件的顶级窗口GetWindowThreadProcessId ←获取与指定窗口关联在一起的一个进程和线程标识符--------------------------------------------------------------------------------------------------------------------------------------------------------相关API声明:FindWindow↓Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongGetWindowThreadProcessId↓Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long--------------------------------------------------------------------------------------------------------------------------------------------------------需要的控件:Label、Timer-------------------------------------------------------------------------------------------------------------------------------------------------------- 自定义函数:Dim hwnd As Long-------------------------------------------------------------------------------------------------------------------------------------------------------- 源代码:Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long)As Long Private Sub Timer1_Timer()Dim hwnd As Long' 储存 FindWindow 函数返回的句柄hwnd = FindWindow(vbNullString, "Windows Media Player")' 取得进程标识符'只要把Windows Media Player换成游戏的名称就可了!If hwnd = 0 ThenLabel1.Caption = "游戏未运行"ElseLabel1.Caption = "游戏已运行"End IfEnd SubVB编外挂2--模拟键盘行动需要VB API函数:keybd_event ←函数模拟了键盘行动--------------------------------------------------------------------------------------------------------------------------------------------------------相关API声明:keybd_event↓Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)--------------------------------------------------------------------------------------------------------------------------------------------------------需要的控件:Timer(interval不为空)--------------------------------------------------------------------------------------------------------------------------------------------------------代码:Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)Private Sub Timer1_Timer()Call keybd_event(82, 0, 0, 0) '模拟按下"R"键End Sub--------------------------------------------------------------------------------------------------------------------------------------------------------其它模拟:方法一:AppActivate sTitleSendKeys "5"方法二:AppActivate sTitleSendKeys vbKey5方法三:SendMessage Hwnd, WM_KEYDOWN, vbKey5, 0&SendMessage Hwnd, WM_KEYUP, vbKey5, 0&方法四:AppActivate sTitlekeybd_event 53, 0, 0, 0keybd_event 53, 0, KEYEVENTF_KEYUP, 0方法五:PostMessage lHwnd, WM_KEYDOWN, vbKey5, 0&PostMessage lHwnd, WM_KEYUP, vbKey5, 0&VB编外挂3--添加快捷键需要VB API函数:GetAsyncKeyState ←判断函数调用时指定虚拟键的状态--------------------------------------------------------------------------------------------------------------------------------------------------------相关API声明:GetAsyncKeyState↓Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As IntegerPrivate Function MyHotKey(vKeyCode) As Boolean--------------------------------------------------------------------------------------------------------------------------------------------------------需要的控件:Timer(interval不为空)--------------------------------------------------------------------------------------------------------------------------------------------------------代码:Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As IntegerPrivate Function MyHotKey(vKeyCode) As BooleanMyHotKey = (GetAsyncKeyState(vKeyCode) < 0)End Function'然后在循环中或Timer的Timer事件中检测:Private Sub Timer1_Timer()If MyHotKey(vbKeyA) And vbKeyControl Then 'ctrl+AEnd '关闭End If'其中vbkeyA是键盘″A″的常数,其他键可按F1查得。
必备绝技--Hook大法
标题:【原创】必备绝技--Hook大法( 上)作者:Lvg时间: 2007-04-08,22:23:47链接: /showthread.php?t=42362【文章标题】: 必备绝技--Hook大法(上)【文章作者】: LvG【作者邮箱】: LvG2008@【作者声明】: 这没有什么新鲜东西,其内容全部来自于前辈,姑且当作学习笔记。
文字用自己的话写出,四段代码均出自别人(知道作者的,以注明),但短小精悍,就写在一起了,便于察看。
欢迎指正。
--------------------------------------------------------------------------------【详细过程】hook概念:是一种通过更改程序的数据结构或代码结构从而改变程序运行路线的一种方法。
(纯属本人自己观点)分类:从上面的概念来看,一种是改变程序的数据结构,如:IA T-hook,Dll-inject及Direct Kernel Object Manipulation(DKOM)。
一种是Inline Function Hooking。
用途:现在这种方法普遍运用于各类程序中,如加壳,杀软,病毒,Rootkits等等。
本文从难以程度上主要分三块详细介绍:一.用户模式Hook:IA T-hook,Dll-inject二.内核模式Hook:ssdt-hook,idt-hook,int 2e/sysenter-hook三.Inline Function Hook;这次先来看第一部分Ⅰ.用户模式Hook一.IAT-hook ing(一)一般原理:IAT是Import Address Table(输入地址表)的简写,这需要你知道关于win PE格式的了解。
现在应用程序中的大多数函数都是windows api,而这些函数一般都由几个系统dll导出,如user32.dll,kernel32.dll,advapi32.dll等。
用VB6编的截获Windows消息的钩子的源码
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP WM_RBUTTONDBLCLK = &H206
再例如:键盘的敲击动作,在别的地方敲击键盘,并没有在自己的Form中敲击键盘,怎么才能获得按键的具体键值呢?
对单片机有了解的朋友都知道,鼠标和键盘的操作都是利用的是“中断”触发事件来完成的,那么当系统“中断”的时候,就会发出消息给操作系统,而这些消息就是Windows全局消息。
If hHook = 0 Then
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
End If
End Sub
Public Sub FreeHook()
If hHook <> 0 Then
模块代码:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
HookProc = 0 '令待完成的動作繼續完成
'End If
End If
If wParam = WM_LBUTTONDOWN Then
Debug.Print "l"
在VB中使用DirectX组件进行键盘的全局HOOK
Private Sub Form_Load()
Set DX = New DirectX7 '建立DirectX对象
Set DI = DX.DirectInputCreate() '建立DirectInput对象
Set DI_Keyboard = DI.CreateDevice("GUID_SysKeyboard") '建立DirectInput的键盘对象
DI_Keyboard.SetCommonDataFormat DIFORMAT_KEYBOARD '设置数据格式
DI_Keyboard.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE '设置协作模式(就是DX设备要与某个窗口关联)。DISCL_BACKGROUND这个是最重要的,它让程序即使在后台运行也能监视键盘输入,不然怎么做HOOK呢^_^
Close #1
key_num = 0
End If
End Sub
好了,基本上就是这样,代码的注释也比较详细,希望对大家有帮助。有什么问题可以联系我,QQ:511795070
顺便再说一下,想用这个方法拦截QQ登陆框的密码是无效m DX As DirectX7
Dim DI As DirectInput
Dim DI_Keyboard As DirectInputDevice
Dim key_state As DIKEYBOARDSTATE '存储键盘状态的结构变量
Dim key_num As Integer '保存键盘扫描码
DX有不同的版本,VB提供了对DX7和DX8的支持,更高版本的就不支持了-_-\。不过没关系,因为DX是向下兼容的,所以,如果你安装的是DX10的话,DX7和8也是可以用的。这里我们就介绍在DX7中访问键盘的方法。VB要使用DX库,必须先在工程中引用这个库,很简单:单击菜单栏的“工程”--引用--在“引用”对话框中找到“DirectX 7 For Visual Basic Type Library”,把前面的钩打上,然后确定,就可以了。然后就可以使用DX库创建DX对象。首先,建立一个DX7主对象,像这样:Dim DX As New DirectX7,然后,使用DX对象的DirectInputCreate方法可以创建一个DirectInput对象:Set DI = DX.DirectInputCreate(),再然后,用DirectInput对象的CreateDevice方法就可以创建一个键盘或鼠标对象了(根据参数决定)。比如创建键盘对象就这样:Set DI_Keyboard = DI.CreateDevice("GUID_SysKeyboard")。有了键盘对象DI_Keyboard,就可以用它来访问键盘输入了。
VB HOOK 使用详解
VB HOOK(钩子)超级无敌详细用法(介绍)hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。
下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。
关于HOOKS使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。
建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。
HOOK链WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。
例如,WH_MOUSE HOOK用来监视鼠标消息。
WINDOWS为这几种HOOKS维护着各自的HOOK链。
HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。
如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。
(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)HOOK过程为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK 链中安装你自己的HOOK函数。
该函数语法如下:public function MyHook(nCode,wParam,iParam) as long‘加入代码end function其中MyHook可以随便命名,其它不能变。
该函数必须放在模块段。
nCode指定HOOK类型。
wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。
SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。
你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。
VB 钩子详解
Windows钩子函数的概念和实现方法首先我们必须大致了解Windows的基本运作机理,Windows作为一个多任务操作系统,它是分有层次概念的,运行在最底下的称为Ring 0层,在这一层里基本上都是一些硬件驱动程序和Windows的总内核,一般的应用程序极少极少运行在这层,当然也有例外,例如调试软件SoftICE(不过基本上这个软件的作用是Crack软件而不是调试)、还原精灵还有分区魔法大师,就是运行在Ring 0层的,另外就是著名的CIH病毒。
运行在Ring 0级的程序能够对所有硬件进行直接地址级访问,所受到的限制也最小。
消息(Message)传递是Windows独有的一种机制,因为Windows规定运行在Ring 0以上的程序是没有权利知道究竟硬件发生了怎样的中断变化的,Windows统一将这些中断变化封装成一系列的消息(黑箱作业,也就是常说的Black Box),比如鼠标移动,系统产生一个OnMouseMove消息(但这条消息从何而来,相关的硬件中断向量是什么,程序无从得知),OnMouseMove这条消息最后送达每一个窗口程序以供处理。
在更高层次的地方,比如说控件级,所有的消息还被封装成一系列“事件”,比如TextBox控件有KeyPress事件,实际上,这些事件都是林林种种的消息映射。
事件的概念使得程序员能够更加傻瓜化地进行编程,但是从另一个角度来说,这种黑箱作业也使得程序员过分依赖系统的安排,限制了程序员的思维,举个例子,Windows为按钮控件封装了大部分常用的属性和事件,完成一般的常规妈作是没有问题的,但是很遗憾,或许是Windows的疏忽,按钮控件的字体颜色永远默认是黑色,而且Windows没有为此提供一个专门的接口来修改,碰到这种情况,程序员就会非常头疼。
钩子函数(Hook Function),就像一把钩子,它的作用是将消息在抵达窗口程序之前先钩到一个地方以便程序员进行分析,这个地方称为挂接函数链,消息在这里先被一系列的函数处理然后由程序员决定是否交还给Windows系统,在这里,你可以“吞噬”(Lickup)一些你不希望发生的消息,比如说你吞掉所有的键盘消息而不交还给系统,那么键盘将会失灵。
用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变态HOOK API也疯狂
VB变态HOOK API也疯狂- 菜新作品之所以起这个名字,其主要原因是想证明用VB也可以正常稳定的实现HOOK API功能。
貌似关于VB实现HOOK API方面的文章chenhui530有写过,说实话,给我的感觉很一般,最让我大跌眼镜的是,所生成的代码的方式竟然是P-CODE??难怪文章最后说只能成功用于VB程序,OK,当看到这时我已没心情继续看下去了。
算了,还是来说说我自己的吧,只有自己拿得出真才实料才会让人信服,关于该文章的所有技术实现都是纯VB代码,不加任何外部DLL文件实现。
在该文章中你将学会以下知识:1,HOOK API函数2,远程注入代码与远程注入DLL3,学会OD分析调试自己的代码4,学会自己制作tlb类库文件5,其它细节方面的知识等等。
首先让我们了解下HOOK API的原理,HOOK API所实现的原理无非就是通过更改API代码默认运行轨道,将所运行的代码指向他处(这里一般为我们自己的地址),通过如此达到HOOK API的功能。
如果用汇编的方式表达的话我想可能更明确,如下:Mov eax, 转移地址Jmp eaxHOOK 代码即是如此而已,首先是把我们自己处理的函数地址放在eax寄存器中,然后通过jmp(汇编跳转指令)eax 跳转到eax寄存器中的函数地址处。
这时当程序中执行某个被HOOK的函数时,该函数会自动跳转到eax 地址,也就这样,整个HOOK工作完成了。
OK,明白了原理之后我们还有其它技术方面的问题需要解决,当然在VB中这些问题必须解决,首先是HOOK API问题,在其它语言中如Delphi或ASM可以直接写个DLL HOOK,通过SetWindowsHookEx把该DLL注入到带有消息处理的进程中去,一般用SetWindowsHookEx注入DLL的方式对于普通的应用程序还行,但对于如系统服务或控制台内进程则无效,所以这时我们需要通过CreateRemoteThread(创建远程线程)API去解决。
VB编写游戏外挂的原理【新手篇】。
VB编写游戏外挂的原理【新手篇】。
VB编写游戏外挂的原理【新手篇】。
VB编写游戏外挂的原理一、前言所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作、修改游戏网络数据包以及修改游戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将。
虽然,现在对游戏外挂程序的“合法”身份众说纷纭,在这里我不想对此发表任何个人意见,让时间去说明一切吧。
不管游戏外挂程序是不是“合法”身份,但是它却是具有一定的技术含量的,在这些小小程序中使用了许多高端技术,如拦截Sock技术、拦截API技术、模拟键盘与鼠标技术、直接修改程序内存技术等等。
本文将对常见的游戏外挂中使用的技术进行全面剖析。
二、认识外挂游戏外挂的历史可以追溯到单机版游戏时代,只不过当时它使用了另一个更通俗易懂的名字??游戏修改器。
它可以在游戏中追踪锁定游戏主人公的各项能力数值。
这样玩家在游戏中可以达到主角不掉血、不耗费魔法、不消耗金钱等目的。
这样降低了游戏的难度,使得玩家更容易通关。
随着网络游戏的时代的来临,游戏外挂在原有的功能之上进行了新的发展,它变得更加多种多样,功能更加强大,操作更加简单,以至有些游戏的外挂已经成为一个体系,比如《石器时代》,外挂品种达到了几十种,自动战斗、自动行走、自动练级、自动补血、加速、不遇敌、原地遇敌、快速增加经验值、按键精灵……几乎无所不包。
游戏外挂的设计主要是针对于某个游戏开发的,我们可以根据它针对的游戏的类型可大致可将外挂分为两种大类。
一类是将游戏中大量繁琐和无聊的攻击动作使用外挂自动完成,以帮助玩家轻松搞定攻击对象并可以快速的增加玩家的经验值。
比如在《龙族》中有一种工作的设定,玩家的工作等级越高,就可以驾驭越好的装备。
但是增加工作等级却不是一件有趣的事情,毋宁说是重复枯燥的机械劳动。
如果你想做法师用的杖,首先需要做基本工作--?砍树。
砍树的方法很简单,在一棵大树前不停的点鼠标就可以了,每10000的经验升一级。
一天一天学外挂详细教程(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.好了,数据显示出来了。
vbhook_shellwindow
这个问题是CSDN网友MattHgh (黎明破晓前)提出来的,这个问题其实有很多种解决的办法,这里我用WH_SHELL钩子解决,WH_SHELL钩子可以获得很多信息,比如窗口创建、窗口销毁、窗口被激活、窗口的标题栏被重绘等等,但是这些信息都是基于窗口的,而MattHgh 希望同时获得相应的程序。
那么怎么根据窗口的句柄的句柄获得对应的程序路径呢,这个当然可以通过枚举所有的进程获得,不过这样一来,速度就慢上一些了,我在程序中用到的是另外一种方法,这种方法尽管很平常,但我估计有些朋友可能还不知道,所以下面我用程序简单的说明一下:'根据窗口句柄获取对应的程序路径,只适用于NT平台Public Function GetEXEFromHandle(Optional ByVal nHWnd As Long = 0) As String Dim nProcID As LongDim nResult As LongDim nTemp As LongDim lModules(1 To 200) As LongDim sFile As StringDim hProcess As Long 'If nHWnd = 0 Then nHWnd = GetForegroundWindow()'获得窗口的ProcessIDIf GetWindowThreadProcessId(nHWnd, nProcID) <> 0 Then'打开Process,获得窗口对应的进程句柄hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or _PROCESS_VM_READ, 0, nProcID)If hProcess <> 0 Then' 获得窗口对应的ModulenResult = EnumProcessModules(hProcess, lModules(1), _200, nTemp)If nResult <> 0 Then'获得程序名sFile = Space$(260)nResult = GetModuleFileNameEx(hProcess, 0, sFile, Len(sFile))sFile = LCase$(Left$(sFile, nResult))GetEXEFromHandle = sFileEnd If'关闭ProcessCloseHandle hProcessEnd IfEnd IfEnd Function请注意函数开始时的注释,这种方法只适用于NT平台,所以用win9x的朋友还是老老实实的枚举进程吧,这样的代码在网上很容易找到,这里我就不罗嗦了。
用VB编写游戏修改器图文教程
用VB编写游戏修改器图文教程使用 Visual Basic(VB)编写游戏修改器是一项技术,它允许用户自定义游戏的参数和功能以增强游戏体验。
本文将提供一份图文教程,详细介绍如何使用VB编写游戏修改器。
第一步:准备工作在开始编写游戏修改器之前,我们需要完成以下准备工作:1. 安装VB开发环境:确保你的电脑上已安装了VB开发环境。
你可以从官方网站上下载并安装最新的VB版本。
2. 选择游戏:选择你要编写游戏修改器的游戏。
确保你已经安装并熟悉该游戏。
第二步:创建新项目1. 打开VB开发环境,创建一个新的VB项目。
2. 在项目中添加一个新的窗体(Form),作为游戏修改器的主界面。
3. 在窗体上添加所需的控件,例如标签(Label)、按钮(Button)、文本框(TextBox)等,以便用户可以输入游戏参数或进行设置。
第三步:连接游戏进程1. 在VB中,使用进程(Process)对象来连接游戏进程。
通过进程对象,我们可以获取游戏的内存地址,以便在代码中修改它们。
2. 在窗体的加载事件中,使用以下代码连接游戏进程:```vbDim gameProcess As Process = Process.GetProcessesByName("游戏进程名称")(0)```请将代码中的"游戏进程名称"替换为你要修改的游戏的进程名称。
这将返回一个表示游戏进程的进程对象。
第四步:修改游戏参数1. 在VB中,使用读取和写入内存的方法来修改游戏参数。
通过读取内存地址并使用相应的数据类型,可以从游戏的内存中读取参数值或将新值写入内存中。
2. 获取游戏参数的内存地址,然后使用以下代码来读取和修改参数:```vb' 读取参数Dim parameterValue As Integer = ReadMemory(gameProcess, 参数地址)' 修改参数WriteMemory(gameProcess, 参数地址, 新值)```请确保你已经定义了ReadMemory和WriteMemory函数,并适当引入相关命名空间。
Hook(钩子技术)基本知识讲解,原理
Hook(钩⼦技术)基本知识讲解,原理⼀、什么是HOOK(钩⼦) APIWindows消息传递机制,当在应⽤程序进⾏相关操作,例如点击⿏标、按下键盘,操作窗⼝等,操作系统能够感知这⼀事件,接着把此消息放到系统消息队列,然后到应⽤程序的消息序列中,应⽤程序通过Getmessage函数取出消息,然后调⽤DispatchMessage函数将这条消息调度给操作系统,操作系统会调⽤在设计窗⼝类时指定的应⽤程序窗⼝对这⼀消息进⾏处理,处理过程如图所⽰:在《VC深⼊详解》⼀书将钩⼦过程⽐喻为警察为了抓逃犯⽽设置的检查站,基本原理也确实与此类似。
就是在应⽤程序将信息传递给操作系统时(图中③的),对消息进⾏捕获和过滤,从⽽阻⽌消息发送到指定的窗⼝过程,最终完成对某些消息的屏蔽功能。
HOOK(钩⼦,挂钩)是⼀种实现Windows平台下类似于中断的机制。
HOOK机制允许应⽤程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达⽬标窗⼝之前将其捕获,从⽽得到对消息的控制权,进⽽可以对该消息进⾏处理或修改,加⼊我们所需的功能。
钩⼦按使⽤范围分,可分为线程钩⼦和系统钩⼦,其中,系统钩⼦具有相当⼤的功能,⼏乎可以实现对所有Windows消息的拦截、处理和监控。
这项技术涉及到两个重要的API,⼀个是SetWindowsHookEx,安装钩⼦;另⼀个是UnHookWindowsHookEx,卸载钩⼦。
对于Windows系统,它是建⽴在事件驱动机制上的,说⽩了就是整个系统都是通过消息传递实现的。
hook(钩⼦)是⼀种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往⽬标窗⼝的消息并进⾏处理。
所以说,我们可以在系统中⾃定义钩⼦,⽤来监视系统中特定事件的发⽣,完成特定功能,如屏幕取词,监视⽇志,截获键盘、⿏标输⼊等等。
程序员在讨论时也常说“可以先钩住再处理”,即执⾏某操作之前,优先处理⼀下,再决定后⾯的执⾏⾛向。
超级HOOK详细用法介绍
超级HOOK详细用法介绍hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。
下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS程序中使用它。
关于HOOKS使用HOOK将会降低系统效率,因为它增加了系统处量消息的工作量。
建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。
HOOK链WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。
例如,WH_MOUSE HOOK用来监视鼠标消息。
WINDOWS为这几种HOOKS维护着各自的HOOK链。
HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。
如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。
(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)HOOK过程为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。
该函数语法如下:public function MyHook(nCode,wParam,iParam)as long‘加入代码end function其中MyHook可以随便命名,其它不能变。
该函数必须放在模块段。
nCode指定HOOK类型。
wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。
SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。
你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。
[注释]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。
hook的使用
hook的使用(原创实用版)目录1.引言2.Hook 的定义和作用3.Hook 的基本使用方法4.Hook 的实际应用场景5.Hook 的优缺点6.结论正文【引言】在编程领域,尤其是 Web 开发中,我们常常需要捕捉一些特定的事件,以便在事件发生时执行相应的操作。
这时,我们就需要使用到一种叫做 Hook 的技术。
本文将详细介绍 Hook 的使用方法和实际应用场景。
【Hook 的定义和作用】Hook,又称钩子,是一种可以捕捉到特定事件的编程技术。
在程序运行过程中,当满足某些条件时,Hook 可以自动执行我们预先定义好的操作。
通过使用 Hook,我们可以在不修改原始代码的基础上,实现对程序行为的扩展和修改。
【Hook 的基本使用方法】要使用 Hook,一般需要遵循以下几个步骤:1.选择需要钩住的事件。
这通常涉及到对事件的监听和捕获,例如在Web 开发中,我们可以使用 JavaScript 监听页面的滚动事件、点击事件等。
2.编写钩子函数。
当所监听的事件发生时,钩子函数将被自动调用。
在这个函数中,我们可以实现自己想要的操作。
3.将钩子函数绑定到相应的事件上。
这一步通常需要使用到一些编程语言或框架提供的 API,例如在 JavaScript 中,我们可以使用`addEventListener`方法将钩子函数绑定到事件上。
【Hook 的实际应用场景】Hook 技术在实际应用中非常广泛,以下是一些常见的应用场景:1.登录/登出事件:在Web应用中,我们可以使用Hook钩住用户的登录和登出事件,以便在用户操作时执行一些必要的操作,例如记录用户的登录日志、发送验证码等。
2.页面滚动事件:在网页设计中,我们可以使用 Hook 钩住页面的滚动事件,以便实现一些动态效果,例如随着页面滚动改变背景颜色、固定导航栏等。
3.点击事件:在 Web 开发中,我们可以使用 Hook 钩住页面元素的点击事件,以便在用户点击时执行相应的操作,例如弹出提示框、跳转到其他页面等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
vb外挂之HOOK技术终极详细解说By:史上最大小强很多学习vb的人都想学习外挂及hook,我在网上也找到了一段程序,后台键盘记录外挂,其实网上大多数流传的HOOK代码都跟这段代码几乎一个出处。
网上有关于这些代码的解释,但是关键部分根本就没解释,等于没说。
下面的程序解释得很详细。
有的地方全属个人看法,不过还是值得一看。
不对的地方欢迎大家指出。
当然,高手勿笑。
好吧,正式我们的hook学习。
Hook并不神秘,它说到底就是通过调用API函数在消息队列中安装钩子,实现截获消息,处理消息的功能。
在这里,我浅浅的讲讲windows的消息机制。
比如,我们按键盘的某个键时,系统就会生成一个消息到系统的消息队列,系统再发送到应用程序消息队列中,windows有不同的消息队列。
对于键盘钩子,是安装在系统的消息队列中。
看程序:(以下程序在模块中,呵呵,工程-----添加模块)Option Explicit ‘强制性变量声明,不允许出现未声明的变量。
呵呵,都懂!!Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer‘Getkeystate是api函数,顾名思义,获取某个键的状态,参数nvirtkey就是某个键的虚拟键键码,不同的系统虚拟键码不同。
比如vbkeycontrol或者vbkeyshift就可以作为参数。
返回值是16位的,如开关键打开,则位0设为1(开关键包括CapsLock,NumLock,ScrollLock);如某个键当时正处于按下状态,则位15为1;如已经抬起,则为0。
数据在储存器中,最高位为1时是负数,为0时是正数。
Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long‘Setwindowshookex,就是建立钩子的函数,最主要的的函数。
参数:Idhoook:要建立什么类型的hook。
有以下类型:WH_MSGFILTER = -1; 线程级; 截获用户与控件交互的消息WH_JOURNALRECORD = 0; 系统级; 记录所有消息队列从消息队列送出的输入消息, 在消息从队列中清除时发生; 可用于宏记录WH_JOURNALPLAYBACK = 1; 系统级; 回放由WH_JOURNALRECORD 记录的消息, 也就是将这些消息重新送入消息队列WH_KEYBOARD = 2; 系统级或线程级; 截获键盘消息WH_GETMESSAGE = 3; 系统级或线程级; 截获从消息队列送出的消息WH_CALLWNDPROC = 4; 系统级或线程级; 截获发送到目标窗口的消息, 在SendMessage 调用时发生WH_CBT = 5; 系统级或线程级; 截获系统基本消息, 譬如: 窗口的创建、激活、关闭、最大最小化、移动等等WH_SYSMSGFILTER = 6; 系统级; 截获系统范围内用户与控件交互的消息WH_MOUSE = 7; 系统级或线程级; 截获鼠标消息WH_HARDWARE = 8; 系统级或线程级; 截获非标准硬件(非鼠标、键盘)的消息WH_DEBUG = 9; 系统级或线程级; 在其他钩子调用前调用, 用于调试钩子WH_SHELL = 10; 系统级或线程级; 截获发向外壳应用程序的消息WH_FOREGROUNDIDLE = 11; 系统级或线程级; 在程序前台线程空闲时调用WH_CALLWNDPROCRET = 12; 系统级或线程级; 截获目标窗口处理完毕的消息, 在SendMessage 调用后发生WH_KEYBOARD_LL = 13; 解惑键盘消息。
MSDN是这样说的:安装一个钩子过程监听底层键盘事件。
本次键盘钩子用到的就是它。
WH_MOUSE_LL =14;解获鼠标消息。
MSDN是这样说的:安装一个钩子过程监听底层鼠标事件。
Ipfn:回调函数的指针。
重要的说说这个函数,可以这样解释,我们截获了消息怎么办,肯定要进行处理,这时就建立一个函数进行处理。
在调用的时候用addressof 函数名称来调用。
这个回调函数有固定的格式:Public Function CallKeyHookProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long‘CallKeyHookProc这个函数名字可以随便取,无固定。
至于这三个参数可能有的人看了下面的程序会问:我们并没有给它传递实参啊?就我的想法可能是因为正是因为它是固定的,用addressof调用,这个回调函数在被调用的时候系统就传递给了它参数,所以,就算它是我们定义的函数,它的参数也已有了固定的意思:Code:代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。
网上都这么说,可像我们这种菜不懂。
我觉得可以这样理解,它就代表着hook的状态,比如我们的键盘钩子,可能的code如下:HC_ACTION = 0 ‘当系统传递过来的code是此值时,表示信息要被处理。
HC_GETNEXT = 1 ‘下面这三个估计就是不能被我们处理吧。
HC_NOREM = HC_NOREMOVEHC_NOREMOVE = 3Wparam:对于键盘钩子来说,它包含了不同键的状态,比如WM_KEYUP、WM_KEYDOWM…….不同的钩子有不同类型的消息。
Lparam:包含了键的信息,比如扫描码等、,执行时间等。
它属于附加信息。
继续看setwindowshookex的参数:Hmod:包含钩子函数的模块(EXE、DLL)句柄; 一般是HInstance; 如果是当前线程这里可以是0。
本文这个参数取app.hinstance。
dwThreadId:代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。
本文中这个参数取0.Setwindowshookex成功后返回钩子的句柄。
这个句柄我们要把它保存下来。
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long ‘卸载钩子,hhook是钩子句柄。
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long‘对截获的消息进行处理后,我们可以调用这个函数把消息传递给下一个钩子(系统里有很多钩子,最后安装的钩子排在最前面,最先截获消息。
最先安装的在最后面。
参数不用解释了,同上)Public Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long‘通过扫描码获得键名参数:lParam:一共32位,位0到5=0;位16到23=按键的扫描码(注意第0位过后才是第一位);位24为增强型键盘上的扩展位;位25如设为1,表示忽略左右Shift和Ctrl键的区别lpBuffer:用一个变量保存得到的键名nSize:指定保存键名的变量的长度。
返回值:实际键名的长度例如:strLen = GetKeyNameText(lKey, strKeyName, 250) 如果IKEY是Esc键的扫描码,然后strkeyName的值是“Esc囗囗囗囗囗囗囗囗。
(一共247个囗,总共250字节)”,strlen是3,也就是ESC的字节数。
所以,得到的键名需要处理才能实际使用。
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)‘复制内存地址中的数据到另一个地址,lpvdest是目标地址,lpvsource是源地址,cbcopy 是要复制的字节长度,这个长度从源地址的首地址开始。
这个好理解。
以下是常量声明:(使用前都要声明常量,当然,下面有一些不需要的常量声明)Public Const WH_KEYBOARD = 2Public Const WH_KEYBOARD_LL = 13'-----------------------------------------Public Const HC_ACTION = 0Public Const HC_SYSMODALOFF = 5Public Const HC_SYSMODALON = 4'---------------------------------------Public Const WM_KEYDOWN = &H100Public Const WM_KEYUP = &H101Public Const WM_SYSKEYDOWN = &H104Public Const WM_SYSKEYUP = &H105Public Type KEYMSGSvKey As LongsKey As LongFlag As Longtime As LongEnd Type‘这里定义了一个数据结构类型,也算是个固定结构吧。
记住就行了。
Public strKeyName As String * 255‘保存键名的变量,指定长度255字节,反正最好255吧,不然程序会出错的。
要比nsize 大点。
Public keyMsg As KEYMSGS‘指定一个KEYMSGS类型的变量KeyMsgPublic bolCtrl As BooleanPublic bolShift As BooleanPublic bolCapsLock As Boolean这几个键表示按键的状态,比如是否按下ctrl键Public HookID As LongPublic REC As BooleanPublic Hookpass As String‘以上定义了程序中要用到的变量。