基于VC的HOOK技术实现
- 格式:pdf
- 大小:258.16 KB
- 文档页数:2
移动存储设备防遗忘提醒系统的设计与实现邹建忠;乔榛;蒯啸玲【摘要】随着社会的发展,移动存储设备的使用不断向普遍化发展,而与之相伴发生的便是普遍发生的移动存储设备遗失现象。
为了避免用户在公共计算机上使用移动存储设备后由于遗忘而造成丢失的普遍现象,基于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技术--代码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提升挂的效率和及时性用HOOK Call提升挂的效率和及时性博客分类:•Delphi游戏DelphiVB VC++Lotyong 的 [轉帖]用HOOK Call提升挂的效率和及时性来到广海也一年了,没做什么贡献(发过一篇2分文),看到不少朋友发文章帮助新手成长,确实很高兴,同时自己也比较汗颜,没怎么帮到大家。
一年来,不少新朋友都已经从小菜鸟,成长到了中/高级菜鸟,也许发现自己的挂和市面上的还有一定差距,现在我来帮大家缩小这个差距。
-------------------------以下阅读最好是具备一定基础的中级菜鸟(能熟练应用HOOK对游戏进行注入的),因为不会一一解释太过基础的词汇,请在论坛搜索相关知识。
--------------------------下面从取游戏数据的角度来说明目前的情况1、按键精灵,通过取色来进行,效率很低(由于找基址的普及,现在按键也用内存取值了)2、内存挂,通过基址+偏移的方式进行,用定时轮询来保证及时性。
3、注入挂,同样通过基址+偏移方式进行,也采用定时器保证及时性,好处是内call调用方便,也省过了ReadProcessMemory读取函数,可以直取内存。
这是目前广海菜菜们的三种挂,相比以前来说,注入的开始多起来,这是好事情,说明大家水平都提高了,有人说安全性不高,注入的容易被反外挂检测到。
实际上,无论是内存型,还是注入型,都有对应的API函数让反外挂检测到(像内存用的ReadProcessMemory),所以关键还是在分析反外挂检测,拦截检测函数,改变检测结果。
这里顺便提一下,不是今天的主题。
我们提到了一个概念,就是及时性,为什么要保证及时性呢,外挂的一个基础功能,就是保护角色不死亡,自动加血,如果不能及时加血,那么后果,大家都很清楚。
同样的,高级一些的功能,如根据怪物剩余血量选择技能进行攻击,也是对及时性要求高的。
再有一点,大家能比较的,打怪效率,好的挂怪物刚死亡,就开始打下一个了,而有的挂要等一会儿,这是为什么?同样也是及时性判断。
hook普通方法
在编程中,“Hook普通方法”是指利用某些技术手段,劫持或替换目标方法的执行,从而实现对目标方法的监控或增强。
以下是一些常见的Hook方法:
- DOM操作:通过修改DOM元素的属性和样式,实现对网页的控制和修改。
- 事件监听:通过监听网页上的事件,触发自定义的操作和行为。
- AJAX拦截:通过拦截网页上的AJAX请求,实现对数据的控制和修改。
- 函数替换:通过替换网页上的函数,实现对函数的控制和修改。
使用Hook 方法需要注意其适用场景和安全风险,合理使用可以为编程工作带来很大的便利。
如果你需要更详细的信息或帮助,请提供更具体的问题描述。
系统钩子和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。
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的句柄和安装状态。
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之前,我们先来说说什么是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⼦程。