基于VC的HOOK技术实现

合集下载

移动存储设备防遗忘提醒系统的设计与实现

移动存储设备防遗忘提醒系统的设计与实现

移动存储设备防遗忘提醒系统的设计与实现邹建忠;乔榛;蒯啸玲【摘要】随着社会的发展,移动存储设备的使用不断向普遍化发展,而与之相伴发生的便是普遍发生的移动存储设备遗失现象。

为了避免用户在公共计算机上使用移动存储设备后由于遗忘而造成丢失的普遍现象,基于MFC利用VC++6.0开发平台设计实现了可移动存储设备防遗忘提醒系统。

该系统通过捕捉用户习惯性动作而给出相关提醒,以达到从根源上避免遗失情况的发生的目的。

当移动存储设备与计算机保持连接状态时,该系统捕捉到计算机关闭程序、关机等“习惯性动作”,或检测到计算机长时间无操作时,会通过弹出对话框、发出提醒语音等方式提醒用户取回自己的移动存储设备。

%With the development of the society,the use of mobile storage devices is developed to generalization constantly,and accompa-nied by is the common mobile storage equipment loss phenomenon. In order to avoid the phenomenon of loss caused by forgetting after users use mobile storage equipment on public computer,a reminder system of mobile storage device has been realized by means of a plat-form of VC++6. 0 based on MFC. This system gives the reminding by capturing the users' routine actions,to achieve the purpose of a-voiding the loss. When the removable storage device is connected to the computer,the system will capture the routine actions from the computer,such as shutting down programs and powering off,or the system detects that the computer has been under no operation for a long time,it will pop up a message-box or give out a warning voice to remind users of getting their removable storage devices back.【期刊名称】《计算机技术与发展》【年(卷),期】2015(000)001【总页数】5页(P159-163)【关键词】MFC;计算机;可移动存储设备;提醒系统;系统开发【作者】邹建忠;乔榛;蒯啸玲【作者单位】上海海事大学,上海 201306;上海海事大学,上海 201306;上海海事大学,上海 201306【正文语种】中文【中图分类】TP3110 引言随着社会的发展,移动存储设备的使用越来越普遍,而随之发生的U盘等设备的遗忘丢失现象也愈加频繁。

hook技术--代码hook

hook技术--代码hook

hook技术--代码hook1.简介:对于IAT hook ⽅法,它只能hook掉在iat中的API,如果是通过动态加载的就不⾏了因为动态加载的dll的API不在iat中,⽽是动态⽣成的.这时可以预先加载该dll和API,并对API前⼏个字节进⾏保存然后修改成跳转到⾃⼰的某函数中,然后进⾏⼀些操作后可以再跳回到原来的API.这就是所谓的API修改hook.2.以hook掉任务管理器的进程遍历功能,为例,⽤此来隐藏calc.exe这个进程windows上ring3层的遍历进程API底层都调⽤了ZwQuerySystemInformation 函数该函数在ntdll中,但没有公开在⽹上寻找该API的参数和返回值信息,在代码中体现代码思路是: 先获取ZwQuerySystemInformation的地址,保存前5个字节的代码. 再覆盖为⼀个跳转到我们实现的⼀个伪ZwQuerySystemInformation函数地址的jmp指令的机器代码.在我们的函数中找到calc.exe的进程名,然后再跳过这个节点即可.#include "stdafx.h"#include <Windows.h>#include <wchar.h>#include <malloc.h>#include<stdio.h>#define funcName "ZwQuerySystemInformation"#define dllName "ntdll.dll"#define processName L"calc.exe"typedef LONG NTSTATUS;typedef enum _SYSTEM_INFORMATION_CLASS {SystemBasicInformation = 0,SystemPerformanceInformation = 2,SystemTimeOfDayInformation = 3,SystemProcessInformation = 5,SystemProcessorPerformanceInformation = 8,SystemInterruptInformation = 23,SystemExceptionInformation = 33,SystemRegistryQuotaInformation = 37,SystemLookasideInformation = 45} SYSTEM_INFORMATION_CLASS;typedef struct _SYSTEM_PROCESS_INFORMATION {ULONG NextEntryOffset;ULONG NumberOfThreads;BYTE Reserved1[48];PVOID Reserved2[3];HANDLE UniqueProcessId;PVOID Reserved3;ULONG HandleCount;BYTE Reserved4[4];PVOID Reserved5[11];SIZE_T PeakPagefileUsage;SIZE_T PrivatePageCount;LARGE_INTEGER Reserved6[6];} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;typedef NTSTATUS(WINAPI *PFZWQUERYSYSTEMINFORMATION)(SYSTEM_INFORMATION_CLASS SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);BYTE orgCode[5];//原始指令BYTE fakeCode[5]; //伪造的jmp指令DWORD funcBase; //我们的函数基址// char debug[100]={0};DWORD WINAPI myZwQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);DWORD hook(DWORD funcbase, DWORD fakeFunc);DWORD unhook(DWORD funcbase);BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){ //获取⽬标函数基址和伪造函数基址DWORD fakeFunc;funcBase = (DWORD)GetProcAddress(GetModuleHandleA(dllName), funcName);fakeFunc = (DWORD)myZwQuerySystemInformation;switch (ul_reason_for_call){case DLL_PROCESS_ATTACH: //加载时就hook掉hook(funcBase, fakeFunc);break;case DLL_PROCESS_DETACH:unhook(funcBase);break;}return TRUE;}DWORD hook(DWORD funcbase, DWORD fakeFunc){DWORD page;//如果已经被hook了就不再继续if(*(BYTE*)funcbase==0xe9){return0;}VirtualProtect((LPVOID)funcbase, 5, PAGE_EXECUTE_READWRITE, &page);memcpy(orgCode, (LPVOID)funcbase, 5);fakeCode[0] = 0xe9;DWORD opCode = fakeFunc -funcBase - 5;//jmp指令的操作码计算公式为:⽬标地址-当前指令地址-5 // sprintf(debug,"hook fakeFunc is %p, funcbase is %p",fakeFunc,funcbase);memcpy(fakeCode + 1, &opCode, 4);//填充为指令memcpy((LPVOID)funcBase, fakeCode, 5); //修改代码VirtualProtect((LPVOID)funcbase, 5, page, &page);return1;}DWORD unhook(DWORD funcbase){DWORD page;if(*(BYTE*)funcbase!=0xe9){return0;}VirtualProtect((LPVOID)funcbase, 5, PAGE_EXECUTE_READWRITE, &page);memcpy((LPVOID)funcBase, orgCode, 4); //恢复代码VirtualProtect((LPVOID)funcbase, 5, page, &page);return1;}DWORD WINAPI myZwQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength)/*这个函数的hook和⼀般的函数不同,这种函数属于查询类的函数,真正有⽤的信息在该函数调⽤完了后才会写到缓冲区类的参数,⽽调⽤前的参数信息基本没⽤,因此我们要对该函数进⾏正常调⽤,完后了再截取信息*/{DWORD fakeFunc;funcBase = (DWORD)GetProcAddress(GetModuleHandleA(dllName), funcName);fakeFunc = (DWORD)myZwQuerySystemInformation;PSYSTEM_PROCESS_INFORMATION p, pPre;unhook(funcBase); //取消hook以正常调⽤DWORD status=4;status=((PFZWQUERYSYSTEMINFORMATION)funcBase)(SystemInformationClass,SystemInformation,SystemInformationLength,ReturnLength);//正常调⽤该函数if(status!=0){hook(funcBase, fakeFunc); //hook住return0;}if (SystemInformationClass== SystemProcessInformation) //只对查询进程的信息感兴趣 {p = ((PSYSTEM_PROCESS_INFORMATION)SystemInformation);while (1){if(p->Reserved2[1]!=0){if (lstrcmpiW((WCHAR*)p->Reserved2[1], processName)==0){if (p->NextEntryOffset==0)//说明是最后⼀个了{pPre->NextEntryOffset = 0; //将后⾯⼀个节点的next指针置0即可}else{//跳过本节点 NextEntryOffset字段是相对于本节点的偏移,⽽不是绝对地址 //当当前节点是第⼀个节点时这个式⼦也成⽴pPre->NextEntryOffset += p->NextEntryOffset;}}else{pPre = p;}}if(p->NextEntryOffset==0){break;}p =((PSYSTEM_PROCESS_INFORMATION)((DWORD)p + p->NextEntryOffset)); }}hook(funcBase, fakeFunc); //hook住return1;}。

用HOOKCall提升挂的效率和及时性

用HOOKCall提升挂的效率和及时性

用HOOKCall提升挂的效率和及时性用HOOK Call提升挂的效率和及时性博客分类:•Delphi游戏DelphiVB VC++Lotyong 的 [轉帖]用HOOK Call提升挂的效率和及时性来到广海也一年了,没做什么贡献(发过一篇2分文),看到不少朋友发文章帮助新手成长,确实很高兴,同时自己也比较汗颜,没怎么帮到大家。

一年来,不少新朋友都已经从小菜鸟,成长到了中/高级菜鸟,也许发现自己的挂和市面上的还有一定差距,现在我来帮大家缩小这个差距。

-------------------------以下阅读最好是具备一定基础的中级菜鸟(能熟练应用HOOK对游戏进行注入的),因为不会一一解释太过基础的词汇,请在论坛搜索相关知识。

--------------------------下面从取游戏数据的角度来说明目前的情况1、按键精灵,通过取色来进行,效率很低(由于找基址的普及,现在按键也用内存取值了)2、内存挂,通过基址+偏移的方式进行,用定时轮询来保证及时性。

3、注入挂,同样通过基址+偏移方式进行,也采用定时器保证及时性,好处是内call调用方便,也省过了ReadProcessMemory读取函数,可以直取内存。

这是目前广海菜菜们的三种挂,相比以前来说,注入的开始多起来,这是好事情,说明大家水平都提高了,有人说安全性不高,注入的容易被反外挂检测到。

实际上,无论是内存型,还是注入型,都有对应的API函数让反外挂检测到(像内存用的ReadProcessMemory),所以关键还是在分析反外挂检测,拦截检测函数,改变检测结果。

这里顺便提一下,不是今天的主题。

我们提到了一个概念,就是及时性,为什么要保证及时性呢,外挂的一个基础功能,就是保护角色不死亡,自动加血,如果不能及时加血,那么后果,大家都很清楚。

同样的,高级一些的功能,如根据怪物剩余血量选择技能进行攻击,也是对及时性要求高的。

再有一点,大家能比较的,打怪效率,好的挂怪物刚死亡,就开始打下一个了,而有的挂要等一会儿,这是为什么?同样也是及时性判断。

hook普通方法

hook普通方法

hook普通方法
在编程中,“Hook普通方法”是指利用某些技术手段,劫持或替换目标方法的执行,从而实现对目标方法的监控或增强。

以下是一些常见的Hook方法:
- DOM操作:通过修改DOM元素的属性和样式,实现对网页的控制和修改。

- 事件监听:通过监听网页上的事件,触发自定义的操作和行为。

- AJAX拦截:通过拦截网页上的AJAX请求,实现对数据的控制和修改。

- 函数替换:通过替换网页上的函数,实现对函数的控制和修改。

使用Hook 方法需要注意其适用场景和安全风险,合理使用可以为编程工作带来很大的便利。

如果你需要更详细的信息或帮助,请提供更具体的问题描述。

VC++如何编写键盘钩子

VC++如何编写键盘钩子

系统钩子和DLL钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。

钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。

此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。

在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。

在本程序中为方便起见采用了标准静态连接MFC DLL。

键盘钩子程序示例本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyKook和动态连接库LaunchDLL。

首先创建一个MFC AppWizard(DLL)工程,并选择Regular statically linked to MFC DLL (标准静态链接MFC DLL)选项,以建立MFC扩展动态连接库LaunchDLL.dll。

之后,在相应的头文件中添加宏定义和待导出函数的声明:#define DllExport __declspec(dllexport)……DllExport void WINAPI InstallLaunchEv();……class CLaunchDLLApp : public CWinApp{public:CLaunchDLLApp();//{{AFX_VIRTUAL(CLaunchDLLApp)//}}AFX_VIRTUAL//{{AFX_MSG(CLaunchDLLApp)// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !//}}AFX_MSGDECLARE_MESSAGE_MAP()};同时在实现文件中添加全局变量Hook和全局函数LauncherHook()、SaveLog():HHOOK Hook;LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam);void SaveLog(char* c);最后,完成以上提到的这几个函数的具体编码实现:CLaunchDLLApp theApp;……DllExport void WINAPI InstallLaunchEv(){Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)LauncherHook,theApp.m_hInst ance,0);}在此我们实现了Windows的系统钩子的安装,首先要调用SDK中的API函数SetWindowsHookEx()来安装这个钩子函数,其原型是:HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息,在本程序中钩子需要为全局钩子,故设定为0。

HOOK的原理

HOOK的原理

这种DLL注入方式有两个优点: 这种机制在Win 9x/Me和Win NT/2K中都是得到支持的,预计在以后的版本中也将得到支持;钩子DLL可以在不需要的时候,可由我们主动的调用 UnHookWindowsHookEx来卸载,比起使用注册表的机制来说方便了许多。尽管这是一种相当简洁明了的方法,但它也有一些显而易见的缺点:首先值得我们注意的是,Windows钩子将会降低整个系统的性能,因为它额外增加了系统在消息处理方面的时间;其次,只有当目标进程准备接受某种消息时,钩子所在的DLL才会被系统映射到该进程的地址空间中,钩子才能真正开始发挥作用,因此如果我们要对某些进程的整个生命周期内的API调用情况进行监控,用这种方法显然会遗漏某些API的调用 。
通常可采用的几种注入方式:
1.利用注册表
如果我们准备拦截的进程连接了User32.dll,也就是使用了User32.dll中的API(一般图形界面的应用程序都是符合这个条件),那么就可以简单把你的钩子驱动器DLL的名字作为值添加在下面注册表的键下: HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs 值的形式可以为单个DLL的文件名,或者是一组DLL的文件名,相邻的名称之间用逗号或空格间隔。所有由该值标识的DLL将在符合条件的应用程序启动的时候装载。这是一个操作系统内建的机制,相对其他方式来说危险性较小,但它也有一些比较明显的缺点:该方法仅适用于NT/2K操作系统,显然看看键的名称就可以明白;如果需要激活或停止钩子的注入,只有重新启动Windows,这个就似乎太不方便了;最后一点也很显然,不能用此方法向没有使用User32.dll的应用程序注入DLL,例如控制台应用程序等。另外,不管是否为你所希望,钩子DLL将注入每一个GUI应用程序,这将导致整个系统性能的下降!

mfc 键盘hook例子

mfc 键盘hook例子

mfc 键盘hook例子全文共四篇示例,供读者参考第一篇示例:MFC是Microsoft Foundation Classes的缩写,是微软公司开发的一种面向对象的C++库。

它提供了许多对Windows编程常用的类和函数,方便开发人员编写Windows应用程序。

在MFC中,键盘hook是一种用于监控键盘消息的技术。

通过键盘hook,我们可以在程序运行时捕获、处理键盘输入,实现自定义的按键响应逻辑。

在本文中,我们将以一个简单的MFC键盘hook例子来演示如何实现键盘消息的拦截和处理。

通过这个例子,读者可以了解MFC中如何使用键盘hook,并学习如何在程序中对键盘消息进行相应的处理。

我们需要创建一个MFC应用程序。

在Visual Studio中新建一个MFC应用程序项目,选择“桌面应用程序(MFC)”模板,并按照向导设置好项目名称和路径。

在新建的MFC应用程序项目中,我们可以添加一个新的类来处理键盘hook。

右键单击项目名称,选择“添加”->“类”,在“添加类”对话框中选择“MFC类from General”模板,填写类的名称(比如CHookManager)并点击“添加”。

在CHookManager类中,我们需要实现键盘hook的安装和卸载函数。

在类的.h文件中定义以下成员变量和函数:```cppclass CHookManager{public:CHookManager();virtual ~CHookManager();在类的.cpp文件中实现这些函数:```cppBOOL g_bHookInstalled = FALSE;HHOOK g_hHook = NULL;CHookManager::CHookManager(){}LRESULT CALLBACK CHookManager::KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){if (nCode >= 0){// 处理键盘消息KBDLLHOOKSTRUCT* pKbdStruct = (KBDLLHOOKSTRUCT*)lParam;if (pKbdStruct->vkCode == VK_ESCAPE){// 拦截ESC键return 1;}}return CallNextHookEx(g_hHook, nCode, wParam, lParam);}void CHookManager::InstallHook(){if (!g_bHookInstalled){g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(NULL), 0);g_bHookInstalled = TRUE;}}在上面的代码中,我们定义了一个HHOOK类型的全局变量g_hHook和一个BOOL类型的全局变量g_bHookInstalled,用于存储键盘hook的句柄和安装状态。

hook技术进程防杀

hook技术进程防杀
不过没有关系,既然现在我们已经知道了这个dll工作的大至流程,我们也可以自己写一个拦截createprocess的dll了,而我们把这个程序改进一下,使他成为一个全局的钩子,而且我们可以选择程序的开启,在程序开启以前弹出一个msgbox,上面有是和否的按钮,你按下是程序就不能启动,而按下否程序就照常启动,而弹出的按钮里不但有这个程序的路径,还有启动这个程序的路径。怎么样,比他的还要高级一些吧。
因为表面上Detours可以很容易的钩住api,但是他的自由度太低了。最重要的是,他无法完成ssdt hook,还是提高自己的水平最重要。
我改出了两个版本一个是asm的一个是vc的,但是奇怪的是asm代码没有问题,而vc的代码却出了问题,我希望高手能帮我解决以下两个问题,
第一个问题:就是在vc代码中(根据王艳萍的windows程序设计代码修改)
10001124 56 push esi
10001125 50 push eax
10001126 FF15 FC700010 call dword ptr [100070FC] ; USER32.MessageBoxW
1000112C 8B45 2C mov eax, dword ptr [ebp+2C]
先运行一次,按下按钮后,果然explorer弹出了程序的路径。此时,你如果使用icesword类的可以查看程序模块的程序查看explorer的模块,你就会发现explorer里面多了个InterceptDll.dll的模块,当我们卸载了这个dll后,这个拦截的效果就没有了。看来这个程序的核心不是那个启动的程序,而是这个dll。现在让我们看看这个InterceptDll.dll到底做了什么。
这就引起了我的好奇,难道这个软件用了什么牛x的新技术?居然这么值钱!那得看看,于是就把该软件下载下来研究了研究。谁知道,他所用的技术不但一点创新都没有,还有着很大的局限性。于是就有了这篇文章,还希望高手不要见笑。

vc++HOOK详细讲解

vc++HOOK详细讲解

vc++HOOK详细讲解消息钩子函数入门Windows 系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。

而钩子是Windows 系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。

钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。

这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。

可见,利用钩子可以实现许多特殊而有用的功能。

因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。

钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。

(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。

(3)外壳钩子可以监视各种Shell 事件消息。

比如启动和关闭应用程序。

(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。

(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。

此外,还有一些特定事件的钩子提供给我们使用,不一一列举。

下面描述常用的Hook 类型:1、WH_CALLWNDPROC 和WH_CALLWNDPROCRET Hooks WH_CALLWNDPROC 和WH_CALLWNDPROCRET Hooks 使你可以监视发送到窗口过程的消息。

系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook 子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPRO CRET Hook 子程。

WH_CALLWNDPROCRET Hook 传递指针到CWPRETSTRUCT 结构,再传递到Hook 子程。

CWPRETSTRUCT 结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。

2、WH_CBT Hook在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2. 完成系统指令;3. 来自系统消息队列中的移动鼠标,键盘事件;4. 设置输入焦点事件;5. 同步系统消息队列事件。

C#Hook

C#Hook

C#Hook前⾔ 在说C# Hook之前,我们先来说说什么是Hook技术。

相信⼤家都接触过外挂,不管是修改游戏客户端的也好,盗取密码的也罢,它们都是如何实现的呢? 实际上,Windows平台是基于事件驱动机制的,整个系统都是通过消息的传递来实现的。

当进程有响应时(包括响应⿏标和键盘事件),则Windows会向应⽤程序发送⼀个消息给应⽤程序的消息队列,应⽤程序进⽽从消息队列中取出消息并发送给相应窗⼝进⾏处理。

⽽Hook则是Windows消息处理机制的⼀个平台,应⽤程序可以在上⾯设置⼦程以监视指定窗⼝的某种消息,⽽且所监视的窗⼝可以是其他进程所创建的。

当消息到达后,在⽬标窗⼝处理函数之前处理它。

钩⼦机制允许应⽤程序截获处理window消息或特定事件。

所以Hook就可以实现在键盘/⿏标响应后,窗⼝处理消息之前,就对此消息进⾏处理,⽐如监听键盘输⼊,⿏标点击坐标等等。

某些盗号⽊马就是Hook了指定的进程,从⽽监听键盘输⼊了什么内容,进⽽盗取账户密码。

C# Hook 我们知道C#是运⾏在.NET平台之上,⽽且是基于CLR动态运⾏的,所以只能操作封装好的函数,且⽆法直接操作内存数据。

⽽且在C#常⽤的功能中,并未封装Hook相关的类与⽅法,所以如果⽤C#实现Hook,必须采⽤调⽤WindowsAPI的⽅式进⾏实现。

WindowsAPI函数属于⾮托管类型的函数,我们在调⽤时必须遵循以下⼏步: 1、查找包含调⽤函数的DLL,如User32.dll,Kernel32.dll等。

2、将该DLL加载到内存中,并注明⼊⼝ 3、将所需参数转化为C#存在的类型,如指针对应Intptr,句柄对应int类型等等 4、调⽤函数 我们本篇需要使⽤的函数有以下⼏个: SetWindowsHookEx ⽤于安装钩⼦ UnhookWindowsHookEx ⽤于卸载钩⼦ CallNextHookEx 执⾏下⼀个钩⼦ 详细API介绍请参考MSDN官⽅声明 接下来在C#中需要⾸先声明此API函数:[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,IntPtr hInstance, int threadId);[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook);[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]public static extern int CallNextHookEx(int idHook, int nCode,IntPtr wParam, IntPtr lParam); 声明后即可实现调⽤,SetWindowsHookEx()把⼀个应⽤程序定义的钩⼦⼦程安装到钩⼦链表中,SetWindowsHookEx函数总是在Hook链的开头安装Hook⼦程。

c#HooK

c#HooK

一、声明Windows API 中的函数和常量//键盘Hook结构函数[StructLayout(LayoutKind.Sequential)]public class KeyBoardHookStruct{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}#region DllImport//设置钩子[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]//抽掉钩子public static extern bool UnhookWindowsHookEx(int idHook);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]//调用下一个钩子public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);//取得模块句柄[DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern IntPtr GetModuleHandle(string lpModuleName);//寻找目标进程窗口[DllImport("USER32.DLL")]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);//设置进程窗口到最前[DllImport("USER32.DLL")]public static extern bool SetForegroundWindow(IntPtr hWnd);//模拟键盘事件[DllImport("User32.dll")]public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo);//释放按键的常量private const int KEYEVENTF_KEYUP =2;本例所使用的函数比较少,它们都在系统的USER32.dll里,包括:设置和取消钩子、调用下一个钩子、导入进程、模拟键盘等等。

VC中picture控件动态换背景及控件被picture盖住解决方案

VC中picture控件动态换背景及控件被picture盖住解决方案

VC中picture控件动态换背景及控件被picture盖住解决方案VC中的picture控件实际是一个CStatic类型,知道了这点,第一个问题就很容易了。

CStatic * ps = (CStatic *)GetDlgItem(IDC_STATIC); //picture是CStatic类型CBitmap cb;cb.LoadBitmap(IDB_TESTGROUND);ps->SetBitmap(HBITMAP(cb)); //强制转为HBITMAP使用这个picture控件时有个问题,就是有些控件可能会被picture里设置好的背景图给盖住。

解决方法是俺在网上看到的,试验成功,如下:打开资源文件(就是项目的.rc文件,然后找到对应对话框的定义:比如我这个的:IDD_PICTURE_DIALOG DIALOGEX 0, 0, 529, 400STYLE WS_POPUP | WS_VISIBLEEXSTYLE WS_EX_APPWINDOWFONT 9, "宋体"BEGINCONTROL 150,IDC_STATIC,"Static",SS_BITMAP,0,0,533,400CONTROL "List1",IDC_LIST1,"SysListView32",LVS_REPORT | WS_BORDER |WS_TABSTOP,27,121,203,162CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",WS_B ORDER,102,320,316,6,WS_EX_TRANSPARENTEND在这个begin与end之间定义的就是对话框的控件,调整这些语句的位置,越是在前面的越是在底层。

这个是直接方法,根本方法,不过在操作上有个简便方法,就是在编辑界面全选所有的控件CTRL+A,然后按住SHIFT,取消对图片控件的选择,将剩下的控件剪切,再粘贴,这样图片控件就到了最底层了,看资源文件也已经对应的被改好了。

消息钩子函数入门篇--(2)示例

消息钩子函数入门篇--(2)示例

消息钩⼦函数⼊门篇--(2)⽰例由于全局钩⼦函数必须包含在动态链接库中,所以本例由两个程序体来实现。

1.建⽴钩⼦Mousehook.DLL (1)选择MFC AppWizard(DLL)创建项⽬Mousehook;(2)选择MFC Extension DLL(共享MFC拷贝)类型; (3)由于VC5没有现成的钩⼦类,所以要在项⽬⽬录中创建Mousehook.h⽂件,在其中建⽴钩⼦类: class AFX_EXT_CLASS Cmousehook:public CObject { public: Cmousehook(); //钩⼦类的构造函数 ~Cmousehook(); //钩⼦类的析构函数 BOOL starthook(HWND hWnd); //安装钩⼦函数 BOOL stophook(); 卸载钩⼦函数 }; (4)在Mousehook.app⽂件的顶部加⼊#include"Mousehook.h"语句; (5)加⼊全局共享数据变量: #pragma data_seg("mydata") HWND glhPrevTarWnd=NULL; //上次⿏标所指的窗⼝句柄 HWND glhDisplayWnd=NULL; //显⽰⽬标窗⼝标题编辑框的句柄 HHOOK glhHook=NULL; //安装的⿏标钩⼦句柄 HINSTANCE glhInstance=NULL; //DLL实例句柄 #pragma data_seg() (6)在DEF⽂件中定义段属性: SECTIONS mydata READ WRITE SHARED (7)在主⽂件Mousehook.cpp的DllMain函数中加⼊保存DLL实例句柄的语句: DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { //如果使⽤lpReserved参数则删除下⾯这⾏ UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("MOUSEHOOK.DLL Initializing!/n"); //扩展DLL仅初始化⼀次 if (!AfxInitExtensionModule(MousehookDLL, hInstance)) return 0; new CDynLinkLibrary(MousehookDLL); //把DLL加⼊动态MFC类库中 glhInstance=hInstance; //插⼊保存DLL实例句柄 } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("MOUSEHOOK.DLL Terminating!/n"); //终⽌这个链接库前调⽤它 AfxTermExtensionModule(MousehookDLL); } return 1; } (8)类Cmousehook的成员函数的具体实现: Cmousehook::Cmousehook() //类构造函数 { } Cmousehook::~Cmousehook() //类析构函数 { stophook(); } BOOL Cmousehook::starthook(HWND hWnd) //安装钩⼦并设定接收显⽰窗⼝句柄 { BOOL bResult=FALSE; glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0); if(glhHook!=NULL) bResult=TRUE; glhDisplayWnd=hWnd; //设置显⽰⽬标窗⼝标题编辑框的句柄 return bResult; } BOOL Cmousehook::stophook() //卸载钩⼦ { BOOL bResult=FALSE; if(glhHook) { bResult= UnhookWindowsHookEx(glhHook); if(bResult) { glhPrevTarWnd=NULL; glhDisplayWnd=NULL;//清变量 glhHook=NULL; } } return bResult; } (9)钩⼦函数的实现: LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam) { LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam; if (nCode>=0) { HWND glhTargetWnd=pMouseHook->hwnd; //取⽬标窗⼝句柄 HWND ParentWnd=glhTargetWnd; while (ParentWnd !=NULL) { glhTargetWnd=ParentWnd; ParentWnd=GetParent(glhTargetWnd); //取应⽤程序主窗⼝句柄 } if(glhTargetWnd!=glhPrevTarWnd) { char szCaption[100]; GetWindowText(glhTargetWnd,szCaption,100); //取⽬标窗⼝标题 if(IsWindow(glhDisplayWnd)) SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption); glhPrevTarWnd=glhTargetWnd; //保存⽬标窗⼝ } } return CallNextHookEx(glhHook,nCode,wparam,lparam); //继续传递消息 } (10)编译项⽬⽣成mousehook.dll。

Windows平台上消息处理技术浅析

Windows平台上消息处理技术浅析

第33卷第8期湖南科技学院学报V ol.33 No.8 2012年8月Journal of Hunan University of Science and Engineering Aug.2012Windows平台上消息处理技术浅析谢智明(湖南科技学院 计算机与通信工程系,湖南 永州 425100)摘 要:本文介绍了在Windows平台上获取消息并进行处理的技术,举例说明了如何编写消息处理机制应用程序的步骤与方法。

关键词:hook;消息获取中图分类号:TP39文献标识码:A 文章编号:1673-2219(2012)08-0046-031 hook机制Windows系统建立在事件驱动的机制上,也就是整个系统都是通过消息的传递来实现的。

hook机制是一种特殊的消息处理机制,可以监视系统或进程中的各种事件消息,获取发往目标窗口的消息并进行处理。

这样,我们就可以在系统中安装自定义的hook,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。

hook的种类很多,每种hook可以截获并处理相应的消息,如键盘hook可以截获键盘消息,外壳 hook可以截取、启动和关闭应用程序的消息等。

hook可以分为线程hook和系统hook, 线程hook监视指定线程的事件消息, 系统hook监视系统中的所有线程的事件消息。

因为系统hook会影响系统中所有的应用程序,所以hook函数必须放在独立的动态链接库(DLL) 中。

2 实现hook机制的关键技术2.1 windows的hook程序,需要用到几个sdk中的api函数下面列出这几个函数的原型及说明:hhook setwindowshookex(int idhook,hook_proc lpfn,hinstance hmod,dword dwthreadid);参数说明如下:idhook:hook的类型lpfn:hook处理函数地址hmod:包含hook函数的模块句柄dwthreadid:hook的监控线程函数说明:函数将在系统中挂上一个由idhook指定类型的hook,监控并处理相应的特定消息。

浅谈c++hook钩子的使用介绍

浅谈c++hook钩子的使用介绍

浅谈c++hook钩⼦的使⽤介绍⼀、基本概念:钩⼦(Hook),是Windows消息处理机制的⼀个平台,应⽤程序可以在上⾯设置⼦程以监视指定窗⼝的某种消息,⽽且所监视的窗⼝可以是其他进程所创建的。

当消息到达后,在⽬标窗⼝处理函数之前处理它。

钩⼦机制允许应⽤程序截获处理window消息或特定事件。

钩⼦实际上是⼀个处理消息的程序段,通过系统调⽤,把它挂⼊系统。

每当特定的消息发出,在没有到达⽬的窗⼝前,钩⼦程序就先捕获该消息,亦即钩⼦函数先得到控制权。

这时钩⼦函数即可以加⼯处理(改变)该消息,也可以不作处理⽽继续传递该消息,还可以强制结束消息的传递。

⼆、运⾏机制:1、钩⼦链表和钩⼦⼦程:每⼀个Hook都有⼀个与之相关联的指针列表,称之为钩⼦链表,由系统来维护。

这个列表的指针指向指定的,应⽤程序定义的,被Hook⼦程调⽤的回调函数,也就是该钩⼦的各个处理⼦程。

当与指定的Hook类型关联的消息发⽣时,系统就把这个消息传递到Hook⼦程。

⼀些Hook⼦程可以只监视消息,或者修改消息,或者停⽌消息的前进,避免这些消息传递到下⼀个Hook⼦程或者⽬的窗⼝。

最近安装的钩⼦放在链的开始,⽽最早安装的钩⼦放在最后,也就是后加⼊的先获得控制权。

Windows 并不要求钩⼦⼦程的卸载顺序⼀定得和安装顺序相反。

每当有⼀个钩⼦被卸载,Windows 便释放其占⽤的内存,并更新整个Hook链表。

如果程序安装了钩⼦,但是在尚未卸载钩⼦之前就结束了,那么系统会⾃动为它做卸载钩⼦的操作。

钩⼦⼦程是⼀个应⽤程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。

⽤以监视系统或某⼀特定类型的事件,这些事件可以是与某⼀特定线程关联的,也可以是系统中所有线程的事件。

钩⼦⼦程必须按照以下的语法:LRESULT CALLBACK HookProcint nCode,WPARAM wParam,LPARAM lParam);HookProc是应⽤程序定义的名字。

vc6 hook 传递参数

vc6 hook 传递参数

vc6 hook 传递参数摘要:1.Vc6 hook 简介2.传递参数的方式3.实际应用案例4.总结正文:Vc6 hook 传递参数Vc6(Visual C++ 6.0)是一款经典的C++编译器,其代码生成效率高,被广泛应用于各种开发场景。

在Vc6 中,hook 技术被广泛使用,以实现对系统函数的拦截和修改。

传递参数是hook 过程中的一个重要环节,本文将详细介绍Vc6 hook 传递参数的相关内容。

传递参数的方式在Vc6 中,hook 传递参数主要分为以下几种方式:1.直接传递参数这种方式最为简单,直接将参数按照顺序传递给被hook 的函数。

这种方法的优点是实现简单,但缺点是容易出错,因为参数的顺序和类型都需要严格匹配。

2.使用寄存器传递参数在Vc6 中,可以通过修改寄存器的值来传递参数。

将参数的值存储在某个寄存器中,然后在hook 函数中读取该寄存器的值。

这种方法的优点是速度快,但缺点是需要确保参数的值不会被其他操作影响。

3.使用内存传递参数这种方法将参数存储在内存中,然后在hook 函数中直接访问该内存地址。

这种方法的优点是可以灵活处理不同类型的参数,但缺点是速度较慢,且需要确保内存地址的安全性。

实际应用案例以下是一个使用Vc6 hook 技术传递参数的实际案例:```cpp// 被hook 的函数原型int original_function(int a, int b);// hook 函数int hook_function(int a, int b) {// 处理参数int result = a + b;// 执行被hook 的函数int original_result = original_function(result, b);// 处理结果return original_result * 2;}// 安装hookvoid install_hook() {// 获取被hook 函数的地址void* original_function_address = original_function;// 保存原始指令byte original_instructions[5] = {0x90, 0x90, 0x90, 0x90, 0x90};// 获取当前指令byte current_instructions[5];// 写入hook 函数地址memcpy(current_instructions, &hook_function, 5);// 保存修改后的指令byte new_instructions[5] = {0xE9, 0x90, 0x90, 0x90, 0x90};// 安装hookmemcpy(original_function_address, new_instructions, 5);}```总结Vc6 hook 传递参数是实现函数拦截和修改的关键技术,有多种方式可以选择。

Hook(钩子技术)基本知识讲解,原理

Hook(钩子技术)基本知识讲解,原理

Hook(钩⼦技术)基本知识讲解,原理⼀、什么是HOOK(钩⼦) APIWindows消息传递机制,当在应⽤程序进⾏相关操作,例如点击⿏标、按下键盘,操作窗⼝等,操作系统能够感知这⼀事件,接着把此消息放到系统消息队列,然后到应⽤程序的消息序列中,应⽤程序通过Getmessage函数取出消息,然后调⽤DispatchMessage函数将这条消息调度给操作系统,操作系统会调⽤在设计窗⼝类时指定的应⽤程序窗⼝对这⼀消息进⾏处理,处理过程如图所⽰:在《VC深⼊详解》⼀书将钩⼦过程⽐喻为警察为了抓逃犯⽽设置的检查站,基本原理也确实与此类似。

就是在应⽤程序将信息传递给操作系统时(图中③的),对消息进⾏捕获和过滤,从⽽阻⽌消息发送到指定的窗⼝过程,最终完成对某些消息的屏蔽功能。

HOOK(钩⼦,挂钩)是⼀种实现Windows平台下类似于中断的机制。

HOOK机制允许应⽤程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达⽬标窗⼝之前将其捕获,从⽽得到对消息的控制权,进⽽可以对该消息进⾏处理或修改,加⼊我们所需的功能。

钩⼦按使⽤范围分,可分为线程钩⼦和系统钩⼦,其中,系统钩⼦具有相当⼤的功能,⼏乎可以实现对所有Windows消息的拦截、处理和监控。

这项技术涉及到两个重要的API,⼀个是SetWindowsHookEx,安装钩⼦;另⼀个是UnHookWindowsHookEx,卸载钩⼦。

对于Windows系统,它是建⽴在事件驱动机制上的,说⽩了就是整个系统都是通过消息传递实现的。

hook(钩⼦)是⼀种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往⽬标窗⼝的消息并进⾏处理。

所以说,我们可以在系统中⾃定义钩⼦,⽤来监视系统中特定事件的发⽣,完成特定功能,如屏幕取词,监视⽇志,截获键盘、⿏标输⼊等等。

程序员在讨论时也常说“可以先钩住再处理”,即执⾏某操作之前,优先处理⼀下,再决定后⾯的执⾏⾛向。

objection hook objective-c 构造函数 实例化方法

objection hook objective-c 构造函数 实例化方法

objection hook objective-c 构造函数实例化方法引言1.1 概述本文将介绍Objective-C中的objection hook构造函数和实例化方法,并对其进行详细解析。

objection是一种面向对象的框架,它允许开发者使用依赖注入的方式来管理和创建对象。

通过hook构造函数和实例化方法,我们可以在对象创建过程中进行一些自定义操作,从而实现更灵活、可定制的对象创建流程。

1.2 文章结构文章将分为五个主要部分进行阐述。

首先,我们将先介绍objection框架的基本概念和特点,以及Objective-C中构造函数的概念和作用。

然后,我们将重点探讨如何在objection框架下使用构造函数来实现对象的创建与初始化。

接着,我们会深入研究objection hook的实现原理,在第三部分中详细解析hook的概念和应用场景,并揭示其背后的原理机制。

第四部分将重点关注构造函数的定义与使用技巧,包括常见参数传递方式和使用技巧等内容。

最后,在结论部分中对前文进行总结回顾,并对Objection Hook的目标与未来发展进行展望。

1.3 目的本文旨在帮助读者深入了解objection hook objective-c 构造函数实例化方法的概念和实现原理,并掌握其在开发中的具体应用技巧。

通过学习本文,读者将能够更好地理解和使用objection框架,提高自己在Objective-C开发中的技术水平。

同时,本文也为读者提供了对Objection Hook未来发展方向的展望,帮助读者把握行业趋势并做出正确的技术选型和方向规划。

以上是对引言部分的详细说明,请根据需要进行修改、补充相关内容。

2. objection hook objective-c 构造函数实例化方法2.1 objection简介Objection是一个基于Objective-C的轻量级依赖注入框架,它提供了一种简单和灵活的方式来管理和解决对象之间的依赖关系。

[c++]初识c++钩子

[c++]初识c++钩子

[c++]初识c++钩⼦因为研究⽊马,需要⽤到键盘钩⼦,所以准备仔细的学习⼀下。

顺便整理⼀下⾃⼰的思路。

1、什么是钩⼦?⾸先windows操作系统是建⽴在事件驱动机制的基础上的,简单来说,系统各窗⼝之间的沟通都是通过消息的相互传递⽽实现的,通常应⽤程序只能处理来⾃程序内部进程之间或进程⾃⼰传递的消息。

如果需要对进程之外传递的消息进⾏拦截处理,就要⽤到(HOOK)钩⼦技术。

基本原理,钩⼦的本质是⼀段⽤以处理系统消息的程序,通过系统调⽤,将其挂⼊到系统。

钩⼦的种类有很多(⽐如键盘钩⼦,⿏标钩⼦等),每⼀种钩⼦负责截获并处理相应的消息。

钩⼦机制允许应⽤程序截获并处理发往指定窗⼝的消息或特定事件。

在特定消息发出,并在到达⽬的窗⼝之前,钩⼦程序先⾏截获此消息并得到对其的控制权。

此时在预先设定好的钩⼦函数中可以对截获的消息进⾏各种修改处理,甚⾄强⾏终⽌该消息的继续传递。

任何⼀个钩⼦都由系统来维护⼀个指针列表(钩⼦链表),其指针指向钩⼦的各个处理函数,最近安装的钩⼦放在链表的开始,最早安装的钩⼦则放在最后,当钩⼦监视程序出现时,操作系统调⽤链表的最近钩⼦处理函数,也就是说,最后加⼊的钩⼦将获得优先控制权。

另外钩⼦的处理函数必须是⼀个回调函数(callback function),⽽且不能定义为类成员函数,必须为普通的C函数。

使⽤钩⼦时可以根据其监视范围的不同将其分为全局钩⼦和线程钩⼦,其中线程钩⼦只能监视某个线程,⽽全局钩⼦则可以对当前系统下运⾏的所有线程进⾏监视,显然,线程钩⼦可以看做是全局钩⼦的⼀个⼦集,全局钩⼦虽然功能⽐较强⼤但同时实现起来⽐较繁琐,⽐如钩⼦实现函数必须封装在动态链接库中才可以使⽤。

2、SetWindowsHookEx()API函数SetWindowsHookEx()把⼀个应⽤程序定义的钩⼦线程安装到钩⼦链表中,该函数总是在Hook链表的开头安装。

SetWindowsHookEx()函数原型如下:HHOOK SetWindowsHookEx(int idHook;HOOKPROC lpfn;HINSTANCE hMod;DWORD dwThreadld);参数idHook指定了钩⼦的类型,总共有如下13中WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。

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

NO%ê‘ ;3,55-12345!6755-89 * !+’aáS1345!6755-89 77==>!I+,755-!" * * Ê
^aá12. ¡¢% Õ7 ëOÕ c‘8æ.ê‘ìWS/0TU|ÛÜ8®ÑÒ .Ö×?@M ÓFí¾ ¡¢._‘îKÝï©%f #ðh¥­8O%ê‘ ¡¢. .0#$0755* !+’Q RË12%]eñòSTU|.ÑÒ·Ö×?@M ^ ¡¢óghñôõ12e% ¾7 ¡¢$ . .05H755* !+’gh12M ^QRË12O% ^Ì¥TUÝöÃÄ÷ e% ø÷Ͼ7SÑÒ.Ö×?@ùÚ´¥/0à Ä.àM úûz]12.QR_‘=gh78 üý.M [ * + , 12%þ#TU12BKÿ/!" . #W%¾7Ó $ òiS%& lK. 12345!6 TUÑÒ=9:­’ Ö× ?@M Ó$ () c‘PÛ $* +,TUS­8 - Ñ Ò.+,?@M ¿uS12.Xµ. x@=X/ ._ ‘0123s.45 % 678 .Á 9 òi^¿l : ; <.;<÷‘I =. 0> S ?{ @A12 -B 12 #CIJ12.QR¦_‘M - . / 0 D DE \ @26S#+ :]] FG 8H *I\ JK } LMNO P Q\BTTB%?\ B 1$2I,0%:\ @26S#+ :]] 8æ R ‘ S T *U\ VK }$ WXYXZPQ\ BTTD%DT\ *U\ VK } ? C#N24 ^\>$SI+236-2 \ @26S#+ :]] [\H ]S^PQ\D___%D\
^ QR 12 e_‘+ ’ ./012345!6755-89 * !%½GY12.?@+’( *5S6/"$5R* !%QR+ ’,-.1234ƧPÇÈ I+,755- $}
0#$0755- * 71MC ,134! É ÅÅ I+,755- O 71MC!./012345!6755-89* 17J*=;.8&*5S6/"$5R&I+A * ,Q360#3R/&T !" Ê
;QML 1QM("Q *5S6/"$5R * 230 3:54/&1"()(* !"#$#%&’"()(* +"#$#%! É ’"*=;.87==>.L);:L V() W! +"#$#%" H*5S6/755- O *=;.87==>.L);:L *
_ ?E _
万方数据
GH$#I%# 4#0#J6/I KL/60C#0#K! * 71MC I+,"$/NL#$134OM;’’" 71MC I+,755-OM;’’" GH$#I%# 4#0#J6/I * ! ÅÅ .8:LQ=M. PP 4/F ¿:$f’±¼ L/60C#0# GH(Á¯° L/60C#0# )8(C 1)QL8 .7()8C 7QM.L(M:8 I+,Q360#3R/OM;’’" PP ÃÄ34 PP C’’ 34 PP 1234
12QRËO%^ÌÍÎefÏÐ ÑÒ%ÓµÑÒÔÕ7ÑÒ?@+’ *5S6/"$5R * !.Ö× ?@M ^]% Ø/ÙÚ¥TUÛÜ8Ð.ÝÑÒ O%Ú´/0l^ÞH|.ÃÄ34%½­Xß¾7 U/012345!L/90 * !+’Ú´¥ÃÄàM ^?@+’aá O%¾7 :#++M/90755-89 * !+’f9:5â¥12ãä $.|Xv12?@+’}
?( 12 § "$3%%4 ù\"l + 2 34 .H / 0 2§ <=># d¿\"<=¦§l¹2 cÙ˦§l$5 60 2§ CD%$ Çk7ù\"<=¦§<89l:;02 § $&ACF1G$?$ &lëB2 .<-= ùîië Bl ?E ¨í®ëB2K¥l\"cdëB\" 0.< ® 2 §&>" d -2 Ç»mK\"d&’ëBl èé\"Y K¦§>?¡MÈ{@Ù.i\":;Y AB r[ëB\";Ü, C ?D èé\". E×ØÄ "[FG½HI(2Jx>FK½HI(STY údÔE l<=ÜLL6á\"Ld&’liBMN2 L 6>&’(&OHË32 ÚÛr[.iíPQ BMN l \"2 RL6{?\"<=hBÄ>ÂÃ\"læ.ië BY K¥ 012!"#$%&’3%%456 S ¾¦§lÍTi2§ CD%$2 ¨x®ëBlSn :;2> 012!"#$%&’3%%456 ( ¾¦§M Nr\"lÂÃÈ2 .<& l U 2&’ Vö % Ë 3)[A\"½»tÅ<l\"<=¦§¡<=Y .i\"<=¦§>¡Al<=¥µ,WX xYZ , [±²\ð.i\"<=¦§Y .<,±²2¨Qh¦ § )G<<@1’23%%456 ( ¾¶]^Y ®¦§{@Ù) [\"½» (lð.i\"<=hBl56 2 _ [ò’ l @ Ù‘ + Ç,>"l\"+ÚY ®¦§l*+,-.ð1
#$%&’ ,,- () ./012345!6755-89 * !+’,-. /01234"&’ 3:54/ (561278.9:;<"& ’ !"#$#% = +"#$#% >(5612?@+’.&’A%# BCDEFGH.12IJKLM NO%)PQR12STU.VWKXY.Z[%\] ^12_‘abOcdef#ghijk#lmnoM j k12.+’( ;3,55-12345!6755-89 * !%p+’qrs tuKXv&’‘PwY]0) ./012345!6755-89 * !+ ’l,-.1234%xJyz{|} <==’ ;3,55-12345!6755-89 77==> ,,-!" * ? !"#$%&’()
/-- K 年 K 月




第 / 期
基于 () 的 3778 技术实现
-./!
0 1
针对 3778 ( 钩子)技术在 () 编程中的应用进行讨论, 并着重对应用比较广泛的全局 3778 做了阐述。
234
3778
钩子链表
全局钩子
鼠标钩子
!"#$%"%&’(’)*& *+ ,--. /%01&*$*23 4)’1 56
I;50JIA )G<<@1623%%456 S 33778 CC49"#2 #)%$19!:B;BD
klmn//--HM.-M.H
o HL o
万方数据
!"#$#%& ’"()(* +"#$#%!"
2F 3:54/XOT! * É 71MC I+,L#$I/0134OH*5S6/755-AX,!34 " 71MC "#$/30134OI+,L#$I/0134" PP´åÃÄ34 !,2+/ "#$/30134 YOM;’’! * É I+,L#$I/0134O"#$/30134" "#$/30134OU/0"#$/30 I+,L#$I/0134!" PP´c‘8æçÃÄ34 * 2F I+,L#$I/0134YOI+,"$/NL#$134 ! * É R,#$ 6Z:#H0253 DTT!" * U/012345!L/90 I+,L#$I/0134& 6Z:#H0253&DTT !" PP´åÃÄà * ÅÅ Ê Ê PPèé5âÑÒ $/0S$3 :#++M/90755-89 77==>!I+,755-& 3:54/& !"#$#%& * * +"#$#%!" Ê
7(& /*&28(& 9:;’8(0’ .%34*8< AC1 =G=1F $"’NO’’1’ 2C1 "P=<1P1#2G2"%# %> C%%4 21NC#%<%QR "# ()9G#$ PG"#<R 16=%O#$’ 2C1 G<<MF%O#$ C%%4, 3778 3%%4 )CG"# B<<MF%O#$ 3%%4 D%O’1 3%%4 Ê%&’xQhË3\"½»tÅ<lÍ.i\"< =¦§Ú¡HIÿ9<=lY dK2dù!" \"2í # {Ù˦§Ä"[½ $ cL2Ê%&’% á?$ & Ë3Y >ò ’ ST¥J¦§ 012!"#$%&’3%%456( ¾ {Ù˦ §Ä"[\"½»ltÅ)"Y 012!"#$%&’3%%456 ( ¾¦§ *+,-.ð/ 33778 012!"#$%&’3%%456 ( "#2 "$3%%49 3778:;7) <= >#9 3?@0AB@)5 CD%$9 E!7;E $&ACF1G$?$ ¾0 \"lawx.y36<=&’HIlBC2 Qh& ’z32{?|}~&’Y \"l/2./\" 9:;<=AlHIY \"A3BC9: ;<=1-HIU2 ?-1L 6xaBlL6xJ?@B-Y >UHI2;>-1D2\"BC ¡9:KH I;¢r?-£¤Y K¥>\"¦§(¨L6r9: -HI¡©/ª«<=2^¡¬­®HIl¯°±²Y ³´.i\"µJ&’¶·¸.i¹º» ¼ \"½ »¾2?¹¿\"-©i<=¦§Y ÀÁÂÃ-\"Ä >½-tÅ2ÀÆÂÃ-\"ÇÄ>ÀÈ2É\"-H IT¥2 Ê%&’Ë3½»ÌÅ<-Í.i\"<=¦ §Î¡<=2ÏxÐÀÈÑ}-\"Ò :¢Ó¤Y > ÔÕÖ~-\"<=¦§×Øx.iÙ˦§2 ÚÛÜ‘ ÝdNÞ¦§2×ØÝdßQ-¦§à >á3\"¥ 56âã?äå-Üæ{?çdèé\"êëB\" ì_2?(ëB\"í‘îiëB2Úèé\"ÇL r>ï&’ðñ¡-ëB¡Y / !"#()*+, J[èé\"òï-óôõÚÛ>W‘öMè÷ øùëB\"2 úKðû¨ü,rA3ý-èé\"ÂÃþá3¡uvY
相关文档
最新文档