Windows 钩子,基本的dll注入
Windows操作系统是基于钩子完成的消息传递与用户交互,它以事件驱动的方式运行。每一个窗口都拥有自己的消息队列,当外部设备触发消息时,消息被发送到系统消息队列,再有操作系统安排将消息发送到特定进程上,这即是消息链。
所谓消息钩子,即是在系统将消息发送到用户程序前,提前截获此消息,并进行处理,也可以把它直接发送给用户程序。如:
当键盘(外部设备)发生键盘输入时,WM_KEYBOARD消息被添加到操作系统的消息队列中,再由操作系统将消息取出,判断此消息是哪个程序发生的,然后将这个消息发送到此用户程序中。应用程序有自己的Message Pump,不断从消息队列中取出消息进行处理。
本文使用消息钩子实现简单的消息勾取功能,目标程序为记事本,使用此钩子可以勾取记事本的键盘事件,使记事本中不能接收到键盘输入消息,也就不能像文本框中输入数据。
注意:消息钩子必须写在dll中,并由dll进行函数调用,将钩子回调函数注入目标进程的虚拟内存,这样达到消息勾取的目的,也是最简单的dll注入。
环境介绍:
编译器:gcc version 4.8.1 (tdm64-2)
系统环境: win7 sp1 x64
文件整理: 一个hook.c文件用于将dll注入到目标进程,一个key.c文件用于定义hook回调函数和调用安装钩子、卸载钩子的函数。
/*author : ezdate : 2015/4/3describe : program to inject .dll into target process
*/#include <windows.h>
#include <stdio.h>
#include <conio.h># define dll_name "hook.dll"
# define hookproc "hookproc"
# define hookstop "hookstop"typedef void (*phookproc) ();
typedef void (*phookstop) ();int main (int argc, char** argv) {phookproc pstart = 0;phookstop pstop = 0;HMODULE mdu = LoadLibrary (dll_name);if (! mdu) {printf ("load library error!\r\n");exit (0);}pstart = (phookproc) GetProcAddress (mdu, hookproc);pstop = (phookstop) GetProcAddress (mdu, hookstop);pstart ();printf ("press q to end this program...\r\n");while (_getch () != 'q') ;pstop ();FreeLibrary (mdu);return 0;}
以上文件开启一个控制台,用于调用dll中的安装钩子函数,将钩子安装到所有进程中。
/*author : ezdate : 2015/4/3describe : a dll that support export function to installand uninstall hook from current process
*/
#include <stdio.h>
#include <windows.h># define process_name "notepad.exe"HINSTANCE _hinstance = NULL;
HHOOK _hhook = NULL;
HWND _hwnd = NULL;BOOL WINAPI DllMain (HINSTANCE hinst, DWORD dwreason, LPVOID lpreserved)
{switch (dwreason) {case DLL_PROCESS_ATTACH:_hinstance = hinst;break;case DLL_PROCESS_DETACH:break;}return TRUE;
}LRESULT CALLBACK message_proc (int ncode, WPARAM wparam, LPARAM lparam) {char path [0xFF] = {0, };char* p = NULL;if (! ncode) {if (! (lparam & 0x80000000)) {int path_len = GetModuleFileName (NULL, path, 0xFF);p = strrchr (path, '\\');if (! _stricmp (p + 1, process_name)) {return 1;}}}return CallNextHookEx (_hhook, ncode, wparam, lparam);
}#ifdef __cplusplus
extern "C" {
#endif__declspec (dllexport) void __stdcall hookproc () {_hhook = SetWindowsHookEx (WH_KEYBOARD, message_proc, _hinstance, 0);
}__declspec (dllexport) void __stdcall hookstop () {if (_hhook) {UnhookWindowsHookEx (_hhook);_hhook = NULL;}
}#ifdef __cplusplus
}
#endif
最后编译:
dll 的编译: gcc key.c -shared -o key.dll -Wl,--out-implib,key.o
可执行程序编译: gcc -o hook hook.c
下面简单介绍以上代码调用的Windows API:
1、HMODULE WINAPI LoadLibrary(
_In_LPCTSTR lpFileName // file name and path
);
将PE文件加载到当前进程的虚拟内存中,其返回值为进程虚拟内存中加载dll位置的起始位置(我计算机上为8位十六进制整数)。
2、FARPROC GetProcAddress(
HMODULE hModule, // module handler
LPCSTR lpProcName // func name
);
从加载到虚拟内存中的dll 中查找导出函数,即查找EAT,用函数名查找。
3、HOOK WINAPI SetWindowsHookEx (
_In_ int idHook,
_In_ HOOKPROC lpfn,
_In_ HINSTANCE hMod,
_In_ DWORD dwThreadId
);
设置windows hook,最后一个参数如果设置为0,则设置到所有的线程中。
4、BOOL WINAPI UnhookWindowsHookEx( __in HHOOK hhk);
卸载windows hook。
可以使用此技术,加载全局的鼠标和键盘钩子,在windows操作系统启动后执行,这样键盘和鼠标都会“无效”。
Windows 钩子,基本的dll注入相关推荐
- Windows注入与拦截(3) -- 使用钩子方式完成DLL注入
一. 钩子技术介绍 前面介绍了< Windows注入与拦截(2) – 使用注册表方式完成DLL注入>,本文介绍使用钩子的方式将DLL注入到进程的地址空间中. Windows提供了3个API ...
- 关于dll注入方式的学习(全局钩子注入)
何为dll注入 DLL注入技术,一般来讲是向一个正在运行的进程插入/注入代码的过程.我们注入的代码以动态链接库(DLL)的形式存在.DLL文件在运行时将按需加载(类似于UNIX系统中的共享库(shar ...
- 《windows核心编程系列》十八谈谈windows钩子
windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...
- 【安全技术】关于几种dll注入方式的学习
何为dll注入 DLL注入技术,一般来讲是向一个正在运行的进程插入/注入代码的过程.我们注入的代码以动态链接库(DLL)的形式存在.DLL文件在运行时将按需加载(类似于UNIX系统中的共享库(shar ...
- 《逆向工程核心原理》学习笔记(三):DLL注入
目录 前言 一.windows消息钩取 1.钩子 2.SetWindowsHookEx() 3.键盘消息钩取 4.调试练习 (1)调试HookMain.exe (2)调试KeyHook.dll 二.D ...
- 2020-11-23(Windows系统的dll注入 )
一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...
- MFC 全局钩子dll注入监听键盘消息
MFC自带的键盘监听功能只有焦点在MFC程序界面时才能监听键盘消息,要想在MFC程序界面外监听键盘消息,可以通过DLL注入使用全局钩子来监听.首先,通过Visual Studio生成全局钩子的动态库, ...
- Dll注入过滤任意Windows控制台命令行输入
命令提示符也就是命令行控制台,新版本也叫做Windows 终端.如何做到当命令被输入控制台窗口后能够做到过滤呢? 其中,有一种就是键盘钩子判断键盘输入,但实用性可能不高. 另外一种方法就是获取控制台缓 ...
- Windows系统的dll注入
一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...
最新文章
- myeclipse导入项目报错Target runtime Apache Tomcat v8.0 is not defined
- RabbitMq(十一) 死信交换机DLX介绍及使用
- 前端抓潜,必须设置门槛,筛选优质客户
- 【收藏】让错误的程序看得出错
- 变电站通信网络与系统-特定通信服务映射(SCSM)
- Java中的System.exit()
- Two Sum(Leetcode001)
- 编译原理第五章课后题
- Git学习笔记(基础操作+分支操作+PR)
- 在线作图工具:ProcessOn,流程图-思维导图-原型图-UML图等
- html5不用reload重置网页,refresh和reload
- python 时间戳转各时区时间
- 【知识图谱问答】DBpedia介绍
- 【tensorflow 读取图片方式】本地文件名读取以及url方式读取
- SAP MM06物料删除
- 解析几何 曲线与二次曲面 曲面方程与坐标变换(2.1,2.2)
- mysqladmin的用法简介
- 【Ubuntu版】制作U盘启动盘
- sp工具中最疼的是_OnRobot推出小型壁虎单垫(SP)夹持器,扩展创新的壁虎夹持器系列...
- 韩国KOBA蓄电池 全系列电池供应
热门文章
- html导航栏圆角,怎么实现css圆角?
- PLSQL手动输入一个字符串,倒序打印输出字符串 , 如输入的是 abcd 打印输出 dcba
- Jirafeau一键式文件共享软件安装教程
- html:点击图片放大到全屏,再次点击缩回
- 视频显示输出接口及发展历史
- 处理机调度——看这一篇就够了
- 上班族适合的兼职副业,副业做什么比较靠谱,副业赚钱的路子有哪些
- Ubuntu Server 20.04 LTS 安装配置 PostgreSQL
- python renamer模块_python - 发布自己的模块(脚本) 到pypi.org
- android app如何挣钱,用业余爱好挣钱,这款 App 能帮你把特长变现 #Android&iOS