包含zblog的钩子实现的词条
- ZBLOG
- 2022-12-18 22:12:57
- 30
今天给各位分享zblog的钩子实现的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、钩子问题.
- 2、C语言newHook字段
- 3、python中钩子方法和构造函数是如何实现的?
- 4、利用C++编程,将hook(钩子)加到程序每一个函数,其中hook后跳转到自己自定义函数代码,实现函数打印功能
- 5、什么是钩子函数?钩子函数的使用。
- 6、Gitlab+Jenkins通过钩子实现自动部署web项目,图文详细教程
钩子问题.
以前做过编程,但现在都忘个差不多了,给你查了一点,看能不能有帮助
HOOK编程与消息处理一2009-06-14 16:02阅读本文需要一定的C++基础和windows编程基础,另外对动态链接库原理和机制也要有一定了解。我尽量讲解得简单明了一些。
因为考试系统项目中要对系统中的键盘消息进行处理,而WEB页面中对系统热键、功能键不能进行有效处理,如(ALT+F4 ALT+TABLE等等),因此需要编写一个WIN32下的客户端程序,内嵌一个WebBrownser实现页面显示(或用CHtmlView对象实现,其实道理都是一样的),这样我可以在客户端程序框架中对键盘消息进行处理。
本文介绍的内容主要是利用动态链接库安装全局进程钩子,实现应用程序的主导控制,因此本文的范畴还是在COM相关领域中。#此前在首页部分显示#
关于Hook编程,以前我总是认为很神秘,因为黑客技术中经常用到HOOK,比如最常见的盗取密码。下面我们来一窥门径。
首先我们来简单了解一下窗口句柄和WINDOWS消息处理机制;
窗口是Windows应用程序中一个非常重要的元素,一个Windows应用程序至少要有一个窗口,称为主窗口。窗口是屏幕上的一块矩形区域,是Windows应用程序与用户进行交互的接口。在windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。我们要对某个窗口进行操作,首先要得到这个窗口的句柄。句柄(HANDLE)是Windows程序中一个重要的概念,使用很频繁。在windows程序中有各种各样的资源(窗口、图标、光标等),系统在创那家这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄(图标句柄HICON、光标句柄HCURSOR、画刷句柄HBRUSH)。
Windows程序设计是一种完全不同于DOS方式的程序设计方法。它是一种事件驱动方式的程序设计模式,主要是基于消息的。例如当用户在窗口中画图的时候,按下鼠标左键,操作系统会感知这一事件,并将这一事件包装成一个消息,投递到应用程序消息队列中,然后应用程序通过调用GetMessage函数从消息队列中取出消息,然后调用DispatchMessage函数将这条消息调度给操作系统,操作系统会调用在设计窗口类时指定的应用程序窗口过程(WindowProc)对这一消息进行处理。
在实际应用中,可能要对某个特殊消息进行屏蔽,如在我的考试项目中要对键盘消息进行屏蔽,而鼠标消息不与处理。我们可以给我们的程序安装一个HOOK过程(钩子过程)来实现这一功能。在程序中,我们可以过SetWindowsHookEx函数来安装一个钩子过程。该函数声明如下:
HHOOK SetWindowsHookEx(
int idHook, // type of hook to install
HOOKPROC lpfn, // address of hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // identity of thread to install hook for
);
SetWindowsHookEx函数的作用是安装一个应用程序定义的钩子过程,并将其放到钩子链中。应用程序可以安装多个钩子过程,对我们感兴趣的多个消息进行检查。这样多个钩子过程就形成了钩子链,最后安装的钩子过程总是排在该链的前面。如果调用成功,SetWindowsHookEx函数返回值就是所安装的钩子过程的句柄,否则返回NULL。
各参数的含义各位读者可以看下MSDN,MSDN中的英文也是很好读懂的,各位不要害怕。
第一个参数idHook MSDN中给出的含义是Specifies the type of hook procedure to be installed. 中文意思就是指定将要安装的钩子过程的类型。在我的项目中因为要处理键盘消息,因此本文中我会将其设为WH_KEYBOARD。如果要处理鼠标消息可将其设为WH_MOUSE。
第二个参数lpfn 指向相应钩子过程。如果参数dwThreadId 为0,或者指定了一个其他进程创那家的线程的标识符,那么参数lpfn 必须指向一个位于某动态接库中的钩子过程。否则,参数lpfn 可以指向当前进程相关代码中定义的一个钩子过程。
第三个参数hMod 指定lpfn 指向的钩子过程所在DLL的句柄。如果参数dwThreadId 指定的线程由当前进程创建,并且相应的钩子过程定义于当前进程相关的代码中,那么必须将此参数设为NULL。
第四个参数dwThreadId 指定也钩子过程相关的线程标识。如果其值为0,那么安装的钩子过程将与桌面上运行的所有线程都相关。
关于进程内的钩子比较简单,大家参看MSDN中的MouseProc、CallNextHookEx以及上面的SetWindowsHookEx等函数的说明就可以实现。在这里我们要写一个应用全局钩子的应用程序,主要是我想在程序运行时对桌面运行的所有进程的键盘消息都进行屏蔽。好,我们现在建一个空的DLL工程名为HookTest,再建一个C++源文件HookTest.cpp,在源文件中写一个函数SetHook用以安装钩子过程,再写一个函数UnHook用以卸载钩子过程。代码如下:
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information)
{
if(VK_F2==wParam)
{
SendMessage(hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(hKeyboardHook);
}
return 1;
}
void SetHook(HWND hwnd)
{
hWnd=hwnd;
hKeyboardHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}
void UnHook()
{
if(hKeyboardHook)
{
SendMessage(hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(hKeyboardHook);
}
}
C语言newHook字段
C语言newHook字段:typedefHMODULE(WINAPI*HOOKAPI)(INLPCSTR);
#defineMYHOOKMETHOD(__fun)HMODULEWINAPI__fun
#defineDECLARE_REGISTER(__0bj,__lawfunc,__newfunc)Inline_Hook__Obj(__lawfunc,__newfunc)。
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
Hook技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。
要实现钩子函数,有两个步骤:
1.利用系统内部提供的接口,通过实现该接口,然后注入进系统(特定场景下使用)
2.动态代理(使用所有场景)
?
python中钩子方法和构造函数是如何实现的?
例子:
#!/usr/bin/python
# Filename: class_init.py
class Person:
def __init__(self, name):
self.name = name
def sayHi(self):
print Hello, my name is, self.name
p = Person(Swaroop)
p.sayHi()
这个例子中就是在init方法中定义了参数name,然后调用的时候直接用类名person带上传参swaroop就行了,swaroop参数就会传递给sayhi(),整个流程就对应c中的构造函数。
然后说钩子,其实就是实现一种内操作,有子进程的意思但又不是,至于装饰函数是不是钩子好像没官方说法,我认为可以算是。装饰器就是把一个函数对象返回给另一个函数来实现既定的功能,其实就是一种内操作。
PS:很多东西都是相关的,比如方法和它的具体实现功能,等你用到它的功能以后就很好理解了,单纯的研究理论也没什么意思。尤其是这种比较抽象的概念。
利用C++编程,将hook(钩子)加到程序每一个函数,其中hook后跳转到自己自定义函数代码,实现函数打印功能
用SetWindowsHookEx拦截QQ密码框,这个我也试过,拦截的是乱码。
原因据说是QQ用了nKey键盘保护。
QQ2011版的我没有试过,10版的我试过,用WinIO可以拦截密码。
不过WinIO加载了驱动,360会有提示,用DirectX监视键盘也拦截不下来。
谁知道11版的WinIO还管事不?,你可以从网上下一个WinIO。
WinIO包含一个库文件,一个动态链接库文件,一个驱动文件。
我告诉你个天下最好的办法吧:
1.将Kernel32.dll或者user32.dll替换成你的。
2.在键盘这个硬件上做手脚。
什么是钩子函数?钩子函数的使用。
WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。
局部钩子仅钩挂您自己进程的事件。
远程的钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种:
基于线程的 它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。
系统范围的 将捕捉系统中所有进程将发生的事件消息。 当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个局部钩子,您进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。
钩子一共有14种,以下是它们被调用的时机:
WH_CALLWNDPROC 当调用SendMessage时
WH_CALLWNDPROCRET 当SendMessage的调用返回时
WH_GETMESSAGE 当调用GetMessage 或 PeekMessage时
WH_KEYBOARD 当调用GetMessage 或 PeekMessage 来从消息队列中查询WM_KEYUP 或 WM_KEYDOWN 消息时
WH_MOUSE 当调用GetMessage 或 PeekMessage 来从消息队列中查询鼠标事件消息时
WH_HARDWARE 当调用GetMessage 或 PeekMessage 来从消息队列种查询非鼠标、键盘消息时
WH_MSGFILTER 当对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。它时为那些有自己的消息处理过程的控件对象设计的。
WH_SYSMSGFILTER 和WH_MSGFILTER一样,只不过是系统范围的
WH_JOURNALRECORD 当WINDOWS从硬件队列中获得消息时
WH_JOURNALPLAYBACK 当一个事件从系统的硬件输入队列中被请求时
WH_SHELL 当关于WINDOWS外壳事件发生时,譬如任务条需要重画它的按钮.
WH_CBT 当基于计算机的训练(CBT)事件发生时
WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的应用程序很少使用
WH_DEBUG 用来给钩子函数除错
附:如何使用钩子函数(接收到字母A按下时,窗体由最小化弹出的完整的代码)
Public Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
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
Public Const WH_KEYBOARD = 2
Public Const KEY_WINSTART = 91
Public Const KEY_WINMENU = 93
Global hHook As Long
Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If nCode = 0 Then
If wParam = KEY_WINMENU Or wParam = KEY_WINSTART Then
If (lParam And HC0000000) = 0 Then
MsgBox "", , ""
KeyboardProc = 1
Exit Function
End If
End If
End If
KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
Option Explicit
Private Sub Command1_Click()
form2.Show 1
End Sub
Private Sub form_Load()
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0, App.ThreadID)
Me.Show
End Sub
Private Sub form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hHook)
End Sub
Gitlab+Jenkins通过钩子实现自动部署web项目,图文详细教程
扩展参考:Jenkins+Gitlab通过脚本自动部署回滚web项目至集群
1):Gitlab服务器:ubuntu 192.168.152.131 ---参考搭建:Linux安装gitlab,docker安装gitlab教程
2):Jenkins服务器:ubunu 192.168.152.130 ---参考搭建:linux安装Jenkins,或docker安装Jenkins教程
在服务器上生成ssh-keygen,用于配置web服务器和Gitlab服务器。
3):web服务器:centos 192.168.152.150 ---已搭建好LNMP环境
4):开发者电脑:Windows+key密钥 (用于提交代码)
1:在gitlab创建项目Test Project
2.1): 配置一个开发者电脑的ssh公钥到gitlab
配置一个开发者电脑的ssh公钥到gitlab,这样才能模拟开发上传代码到gitlab。
windows生成key过程及git安装,可参考:Windows下git和github的使用图文详细教程_the丶only的博客-CSDN博客_github win
在windows测试clone,和提交代码。
注:最新版git 已经将默认分支master改为main了。所以看到main,而不是master不要太奇怪
测试成功,在gitlab也显示有index.html文件。
2.2): 配置jenkins公钥到gitlab
同理,同样需要jenkins公钥,因为jenkins也需要拉去gitlab的代码。
在 jenkins服务器 上查看公钥并复制添加到gitlab,并命名为jekins。
1:插件管理,安装插件
jenkins本身没什么功能,主要是依靠插件来实现各种强大的功能。
基本需要添加的插件:Gitlab Hook、Build Authorization Token Root、Publish Over SSH、Gitlab Authentication、Gitlab、Git Parameter
可以在 Manage Jenkins Manage Plugins 查看管理插件。在Available 选项搜索安装插件即可。
安装完成后,重启Jenkins。
2:添加需要部署的web主机
在 Manage Jenkins Configure System 中往下翻,找到 Publish over SSH 选项,点击add ssh server。
在Jenkins服务器上,查看私钥,注,是私钥,不是公钥。
将私钥填写在key位置,还有添加web服务器相关信息。
注:如果测试报错如下
Failed to connect or change directory
jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@2e54414f]
是因为默认用ssh-keygen命令,默认生成了OPENSSH 格式密钥。而Jenkins暂时不支持这种私钥,私钥开头结尾如下:
所以,需要生成rsa密钥格式的。用开头说的ssh-keygen加其他参数生成即可。
私钥开头结尾如下:
再次测试,显示success,则成功。然后点击save保存即可。
3:构建任务项目
首页创建任务或者一个项目
命名为web-project,选择为freestyle project 自由项目。然后ok确认。
3.1):源码管理 Source Code Management
选择源码管理,添加gitlab的项目clone地址。
注:最后路径选择分支,我gitlab主分支名字为main,如果是master,则写master,或者合并的其他分支。
在add添加用户
添加完成后,选择git用户,这时没有红色提醒,说明已成功连接
3.2):构建触发器 Build Triggers
现在Build Triggers,勾选build when....,其他默认,并记下链接
点击高级 advance 选项。
勾选filter branches regex选择,填写分支,生产token。其他默认
3.3):构建 Build
选择Build 选项。选择ssh
添加web服务器
添加完毕,最后save保存。
1:添加钩子webhooks.
选择自己的项目Test Project,在设置setting里,选择钩子webhooks.
填写刚才记下的和token值。
最后Add webhook完成:
2:如添加失败,报错,更改Network
注:如填写失败提示Url is blocked: Requests to the local network are not allowed
还需更改Network选项。
3:测试钩子
添加完成后,下面会出现钩子选择。点击test中的,push event。
出现successful,即添加成功。
在Jenkins也可以看到刚才的测试时间信息。
在开发电脑上测试提交,我这里为Windows电脑测试。
打开Git Bash,输入以下命令:
提交成功,回到Jenkins,查看是否构建成功:
绿色显示构建成功,无错误显示。回到gitlab查看项目。
时间显示刚才也提交成功,无错误。最后在浏览器输入web地址测试,本人配置了web访问端口8082。所以输入IP加端口访问。
内容也已经自动更新成功。
完结撒花!!!
zblog的钩子实现的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、zblog的钩子实现的信息别忘了在本站进行查找喔。
本文由admin于2022-12-18发表在靑年PHP官网,如有疑问,请联系我们。
本文链接:http://qnphp.com/post/9506.html