最新要闻
- 天天最资讯丨中国人民大学苏州校区专业有哪些专业_中国人民大学苏州校区怎么样
- 焦点热讯:净利润翻倍超18亿元 爱玛电动车业绩大增送出股权激励
- 天天热点!1799元一台顶三台!小米米家无线洗地机2 Lite预售:吸拖洗都行
- 每日快看:蔚来CFO评价中国车企价格战:中国车企太多了
- 【快播报】私拉线路充电致17辆电动自行车被烧毁:科普飞线充电危害
- 今日要闻!华硕ROG新款XG Mobile显卡坞上市:搭载RTX 4090移动版 售价超2万
- 快资讯:“星月童话”来了!月掩金星天象明晚亮相:错过要等3年
- 天天百事通!女生疑在奶茶中喝出10余颗玻璃珠:店家回应
- 视点!黄金定价模式生变背后:央行们正失去对货币环境的控制
- 泉水煮蛋怎么做
- 全球短讯!常用消毒剂无效 致命真菌在美国蔓延:近半感染者90天内死亡
- 《龙马精神》推广曲《真心英雄》MV出炉:成龙郭麒麟重唱经典
- 环球聚焦:二手路虎变法拉利!男子80万买到泡水路虎 车商被判退一赔三
- 今日要闻!尿道结石怎么治疗才能除病根_尿道结石该怎么治疗
- 虚幻引擎5推出重磅新功能MetaHuman Animator:实现真人面部动作高速模拟
- 焦点速看:开放世界元宇宙游戏《仙剑世界》来了:万物皆可交互
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天日报丨DLL注入-Windows消息钩取
0x01 钩子
钩子,英文Hook,泛指钓取所需东西而使用的一切工具。后来延伸为“偷看或截取信息时所用的手段或工具”。
(相关资料图)
- 挂钩:为了偷看或截取来往信息而在中间设置岗哨的行为
- 钩取:偷看或操作信息的行为
0x02 消息钩子
敲击键盘时,消息会从OS(Operating System的简称)移动到应用程序,而消息钩子就是在这个过程中偷看信息。
下面以键盘信息为例
常规Windows消息流:1、发生键盘输入事件时,WM_KEYDOWN消息被添加到[OS message queue];2、OS判断哪个应用程序中发生了事件,然后从[OS message queue]中取出消息,添加到相应应用程序的[application message queue]中;3、应用程序监视自身的[application message queue],发现新添加的WM_KEYDOWN消息后,调用相应的事件处理程序处理。附带钩子的信息流:
- 发生键盘输入事件,WM_KEYDOWN消息被添加到OS消息队列;
- OS判断哪个应用程序发生了事件,从OS消息队列中取出消息,发送给应用程序;
- 钩子程序截取信息,对消息采取一定的动作(因钩子目的而定);
- 如钩子程序不拦截消息,消息最终传输给应用程序,此时的消息可能经过了钩子程序的修改。
如下图,OS消息队列和应用程序消息队列之间存在一条钩链(Hook Chain),设置好键盘消息钩子后,处于钩链中的键盘消息钩子会比应用程序先一步看到相应信息。在键盘消息钩子函数的内部,除了可以查看消息之外,还可以修改消息本身,而且还能对消息实施拦截,阻止消息传递。可以同时设置多个相同的键盘消息钩子,按照设置的顺序依次调用,从而组成的链条称为钩链。
0x03 SetWindowsHookEx()
在Windows中可以使用SetWindowsHookEx()API来设置消息钩子,这个函数除了可以设置当前进程的钩子之外,它还可以设置全局钩子。全局钩子,顾名思义,即当前正在运行的进程都会被设置相应的钩子。
Windows API作用类似是一个个功能函数。
定义如下
HHOOK SetWindowsHookExA( int idHook, //hook type 钩子类型 HOOKPROC lpfn, //hook procedure 回调函数地址 HINSTANCE hMod, //hook procedure所属的dll句柄 DWORD dwThreadId //想要挂钩的线程PID);
第一个参数表征钩子的类型,但钩子的类型是微软规定好的,你只能选一种,自己不能乱写第二个参数是钩子执行程序,即当钩子勾到所需信息时运行的程序第三个参数是要注入的dll句柄第四个参数是想要挂载的线程ID,如果该参数为0,则表明钩子是一个全局钩子
HHOOK:返回值,钩子句柄,需要保留,等不使用钩子时通过UnhookWindowsHookEx函数卸载钩子。idHook:钩子的拦截消息类型,选择钩子程序的拦截范围,具体值参考文章结尾的消息类型。Lpfn:消息的回调函数地址,钩子子程的地址指针,一般是填函数名。hMod:钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。在dll中可通过AfxInitExtensionModule(MousehookDLL, hInstance)获得DLL句柄。dwThreadId:钩子所监视的线程的线程号,可通过GetCurrentThreadId()获得线程号。对于全局钩子,该参数为NULL(或0)。
使用SetWindowsHookEx()设置好钩子后,在某个进程中生成指定消息时,OS会将相关的DLL文件强制注入相应的进程,然后调用注册的钩子过程。
0x04 键盘消息钩取练习
下面做一个简单练习,先看图KeyHook.dll文件是一个含有钩子过程(KeyboardProc)的DLL文件,HookMain.exe是最先加载KeyHook.dll并安装键盘钩子的程序。HookMain.exe加载KeyHook.dll后使用SetWindowsHookEx()安装键盘钩子;若其他进程(如图中所示)发生键盘输入事件,OS就会强制将KeyHook.dll加载到像一个进程的内存,然后调用KeyboardProc()函数。先分析源码
keyHook.cpp
//KeyHook.cpp #include "stdio.h"#include "windows.h" //定义目标进程名为notepad.exe#define DEF_PROCESS_NAME "notepad.exe" //定义全局变量HINSTANCE g_hInstance = NULL;HHOOK g_hHook = NULL; //DllMain()函数在DLL被加载到进程后会自动执行BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved){switch( dwReason ){case DLL_PROCESS_ATTACH:g_hInstance = hinstDLL;break; case DLL_PROCESS_DETACH:break;} return TRUE;} //LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){char szPath[MAX_PATH] = {0,};char *p = NULL;if( nCode >= 0 ){ //释放键盘按键时,bit 31 : 0 => press, 1 => releaseif( !(lParam & 0x80000000) ){GetModuleFileNameA(NULL, szPath, MAX_PATH);p = strrchr(szPath, "\\"); //比较当前进程名称,若为notepad.exe,则消息不会传递给应用程序或下一个钩子函数//_stricmp()函数用于比较字符串,i表示不区分大小写,若两个值相等则返回0if( !_stricmp(p + 1, DEF_PROCESS_NAME) ){return 1;}}} //比较当前进程名称,若非notepad.exe,则消息传递给应用程序或下一个钩子函数return CallNextHookEx(g_hHook, nCode, wParam, lParam);} //在C++中调用C的库文件,用extern "C"告知编译器,因为C++支持函数重载而C不支持,两者的编译规则不同#ifdef __cplusplusextern "C"{#endif//__declspec,针对编译器的关键字,用于指出导出函数//当调用导出函数HookStart()时,SetWindowsHookEx()函数就会将KeyboardProc()添加到键盘钩链__declspec(dllexport) void HookStart(){g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstance, 0);} __declspec(dllexport) void HookStop(){if(g_hHook){UnhookWindowsHookEx(g_hHook);g_hHook = NULL;}}#ifdef __cplusplus}#endif
因为要生成的是KeyHook.dll文件,因而在开始创建项目时应先选择Win 32控制台应用程序,再到应用程序类型中勾选DLL,编写好cpp文件后选择Release再生成文件即可得到DLL文件。当调用导出函数HookStart()时,SetWindowsHookEx()函数就会将KeyboardProc()添加到键盘钩链。安装好键盘钩子后,无论哪个进程,只要发生键盘输入事件,OS都会强制将KeyHook.dll注入相应的进程中。KeyboardProc()函数中发生键盘输入事件时,会比较当前进程名称和“notepad.exe”是否一致,若一致则返回1,终止KeyboardProc()函数,即截获并删除消息,从而实现对notepad.exe程序的键盘输入事件进行钩取并截获删除、键盘消息不能传递到notepad.exe的消息队列中。
KeyboardProc()函数定义如下:
LRESULT CALLBACK KeyboardProc( int code,//HC_ACTION(0), HC_NOREMOVE(3) WPARAM wParam,//virtual-key code LPARAM lParam//extra information);
其中wParam指用户按下的键盘按键的虚拟键值。
HookMain.cpp
//HookMain #include "stdio.h"#include "windows.h"//Console Input/Output,定义了通过控制台进行数据输入和数据输出的函数//主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等#include "conio.h" //定义一些常量#define DEF_DLL_NAME "KeyHook.dll"#define DEF_HOOKSTART "HookStart"#define DEF_HOOKSTOP "HookStop" //定义两个参数为空、返回值为void即没有的函数指针typedef void (*PFN_HOOKSTART)();typedef void (*PFN_HOOKSTOP)(); void main(){//定义及初始化句柄变量和函数指针HMODULE hDll = NULL;PFN_HOOKSTART HookStart = NULL;PFN_HOOKSTOP HookStop = NULL; //加载KeyHook.dllhDll = LoadLibraryA(DEF_DLL_NAME); //若加载不成功,则输出错误信息if( hDll == NULL ){printf("[-]无法加载%s [%d]\n", DEF_DLL_NAME, GetLastError());return;} //获取导出函数地址HookStart = (PFN_HOOKSTART)GetProcAddress(hDll, DEF_HOOKSTART);HookStop = (PFN_HOOKSTOP)GetProcAddress(hDll, DEF_HOOKSTOP); //开始钩取HookStart(); //直至用户输入“q”退出钩取printf("[*]等待输入 "q" 来停止钩取...\n");while( _getch() != "q" ); //终止钩取HookStop(); //卸载KeyHook.dllFreeLibrary(hDll);}
先加载KeyHook.dll,再调用HookStart()函数开始钩取,当获取到用户输入“q”后调用HookStop()函数终止钩取。
代码流程分析概括
安装好键盘钩子后,无论在哪个进程中,只要发生了键盘输入事件,OS就会强制将KeyHook.dll注入到进程中,加载了KeyHook.dll的进程,发生键盘事件时会首先调用执行KeyHook.KetyboardProc()。
KetyboardProc()函数中发生键盘输入事件时,会比较当前进程的名称与“notepad.exe”是否相同,相同返回1,终止KetyboardProc()函数,意味着截获并删除了消息,这样键盘消息就不会传递到notepad.exe程序的消息队列。
练习示例HookMain.exe
注:HookMain.exe 要和 KeyHook.dll放在一个目录下运行HookMain.exe之后,再打开notepad.exe,输入键盘信息,发现打不上去,notepad.exe卡死。我使用的系统是win10 64位系统,经过多方面搜索,终于确定问题,版本不匹配,dll因为CPU架构不匹配不能注入时,程序会通过SendMessage来调用你的KeyBoardProc,然后程序就卡住了,一直卡在对话框界面,卡死…直接编译成64位的程序解决问题,同时,注入程序和dll都要是64位.(参考知乎回答https://www.zhihu.com/question/64221483)
这里就不便示例了,就是大概这样
0x05 调试HookMain.exe
使用Ollydbg打开,可以看到是典型的VC++启动函数,图中显示的是HookMain.exe的EP(Entry Point,程序入口地址)代码
查找核心代码
我们关心的是核心的键盘钩取部分的代码,如何查找核心代码?
- 逐步跟踪(除非迫不得已!)
- 检索相关API (Ctrl+G)
- 检索相关字符串
我们已经知道程序的功能,会在控制台显示字符串“press ‘q’ to quit!”,所以先检查程序导入的字符串(Search for -All referencen text strings):地址40104d处引用了要查找的字符串,双击跳转:来到main函数处。
调试main函数
在401000处双击下断,F9运行,到断点停下来后,开始F8/F7调试,了解main函数中主要的代码流。401006地址处调用LoadLibraryA(Keyhook.dll),然后由40104b地址处的CALL EBX指令调用KeyHook.HookStart()函数。在40104b处,F7单步跟进查看:这里的代码是被加载到HookMain.exe进程中的KeyHook.dll的HookStart()函数,第一句就是调用SetWindowsHookExW()函数,在进行参数入栈操作后,我们可以在栈中看到函数的4个参数值。再附上一张作者写的流程
参考博客dll注入看雪原创Windows消息钩取CSDN—Windows消息钩取关于逆向工程核心原理-Windows消息钩取关于《逆向工程核心原理》键盘钩子的总结
关键词:
天天日报丨DLL注入-Windows消息钩取
动态焦点:网络安全(中职组)-B模块:Web渗透测试
微信小程序原生AI运动(动作)检测识别解决方案
每日热闻!美联储表态已现温和迹象 市场仍存下半年降息“奢望”
天天最资讯丨中国人民大学苏州校区专业有哪些专业_中国人民大学苏州校区怎么样
焦点热讯:净利润翻倍超18亿元 爱玛电动车业绩大增送出股权激励
天天热点!1799元一台顶三台!小米米家无线洗地机2 Lite预售:吸拖洗都行
每日快看:蔚来CFO评价中国车企价格战:中国车企太多了
【快播报】私拉线路充电致17辆电动自行车被烧毁:科普飞线充电危害
今日要闻!华硕ROG新款XG Mobile显卡坞上市:搭载RTX 4090移动版 售价超2万
Vue 核心(一)
从零开始搞一个androidApp,实现h5自动更新、jsbridge
快资讯:“星月童话”来了!月掩金星天象明晚亮相:错过要等3年
天天百事通!女生疑在奶茶中喝出10余颗玻璃珠:店家回应
视点!黄金定价模式生变背后:央行们正失去对货币环境的控制
泉水煮蛋怎么做
记录--你还在傻傻的npm run serve吗?快来尝尝这个!
CloudQuery 社区重启 | 愿归来仍是少年
ChatGPT为我们带来了什么?
.net core 关于对swagger的UI(Index.html)或接口的权限验证;
每日头条!oracle学习之路(5)Navicat连接Oracle数据库:Oracle library is not loaded 解决方案
世界快资讯丨美联储鸽派声明缓解日本央行政策压力 日债收益率多数下跌
瑞士央行加息50个基点至1.50% 不排除进一步加息可能
全球短讯!常用消毒剂无效 致命真菌在美国蔓延:近半感染者90天内死亡
《龙马精神》推广曲《真心英雄》MV出炉:成龙郭麒麟重唱经典
环球聚焦:二手路虎变法拉利!男子80万买到泡水路虎 车商被判退一赔三
天天播报:CSAPP-Bomb Lab
全球快资讯丨Python工具箱系列(二十九)
视焦点讯!让业务容器化更安全便捷,阿里云容器镜像服务 ACR 推出免费制品中心
环球热点评!云服务器部署AI绘图记录
全球热资讯!pdf.js 使用
今日要闻!尿道结石怎么治疗才能除病根_尿道结石该怎么治疗
虚幻引擎5推出重磅新功能MetaHuman Animator:实现真人面部动作高速模拟
焦点速看:开放世界元宇宙游戏《仙剑世界》来了:万物皆可交互
焦点短讯!中华老字号!西安饭庄糕点礼盒19.9元冲量大促:一次买16枚
两女子高速上突然跳车:闻到汽油味、以为要爆炸
环球实时:阿里又开源一款数据同步工具 DataX,稳定又高效,好用到爆!
一周的时间搞一个疫苗预约系统
环球热消息:Apache Kafka JNDI注入(CVE-2023-25194)漏洞复现浅析
快讯:河北沧州2022年成人高考成绩查询入口已开通
当前时讯:【新华500】新华500指数(989001)23日低开高走涨0.88%
今日观点!女生10年收集万瓶香水价值一套房:圈粉超47万
世界热文:捐100亿元建世界一流名校 曹德旺:大学没有教会年轻人动手能力
【天天快播报】汽车疯狂降价潮引担忧:狂欢之后会不会是淘汰潮?
热推荐:【操作系统】面试题总结(持更)
天天简讯:权值(点分治)
当前速看:JavaScript学习笔记
环球最资讯丨WMS深入浅出
环球关注:剑指 Offer 17. 打印从 1 到最大的 n 位数(java解题)
环球观焦点:Intel 56核心刚出生就落伍!AMD Zen4撕裂者下半年来袭:96核心
【新视野】力压美国印度!中国富豪全球第一:钟睒睒蝉联首富 马化腾张一鸣紧随其后
石榴汁弄衣服上怎么洗才能不会变干(石榴汁弄衣服上怎么洗)
环球最资讯丨机箱中的海景房 乔思伯TK-1双曲面侧透游戏机箱579元:颜值爆表
成都比亚迪、特斯拉、宝马三车相撞 特斯拉和宝马车轮飞了
天天简讯:Go语言:利用 TDD 逐步为一个字典应用创建完整的 CRUD API
【世界播资讯】springcloud Stream整合rabbitmq消息驱动生产者踩坑
【天天报资讯】Vue之移动端viewport-vw适配
LevelDb-用户接口
世界视讯!Spring Cloud Alibaba微服务搭建(二)- 安装mysql
【世界速看料】新能源汽车充电时为何要交停车费 专家:可防止充电之后不挪窝
当前热点-全球首枚3D打印火箭!美国“人族一号”发射失败
明年底有望普及!PCIe 5.0 SSD尴尬了 买的人太少:性能残血、价格死贵
我和你本应该各自好各自坏是什么歌?我和你本应该各自好各自坏歌词
mirror男团中谁的人气最高?mirror男团年龄排序
亡羊补牢的亡是什么意思?亡羊补牢成语故事
班主任管理班级的策略与措施是什么?班主任教育随笔示范
《最终幻想16》新片段 宠物可以防止你迷路
看点:MS SQL服务器教程_编程入门自学教程_菜鸟教程-免费教程分享
卿卿日常李薇的真实身份是什么?卿卿日常郝葭死了吗?
质感旗舰!真我GT Neo5 SE未来感十足:纳米级光哑熔合工艺打造
女子不敢在隧道开车 交给无证男子驾驶 听到后果惊恐万分
196元暴涨至1910元 民宿回应五一价格翻十倍:先挂着 随时调整
最资讯丨专盯未成年?女孩添加“爱豆”QQ后被骗贷款3万4
连鸽两次 世界首枚3D打印火箭将再发射:这回能顺利吗?
全球热点!Python工具箱系列(二十八)
天天通讯!不知道
酝酿产智融合“化学反应” 浙江衢州集中签约多家研究院
天天日报丨“帝王座驾、以辇为尊” 比亚迪云辇系统官宣:或为底盘新技术
天天热文:早午餐合成一顿?医生提醒:细胞营养需求加大 更易长胖
即时看!警惕!义乌一女子险被电商“客服”骗走800万
当前观点:配可滑动中控屏、宾利同款B柱挂钩!极氪X内饰官图发布
每日看点!【数论与组合数学 3】Hensel 引理、原根
世界观察:Android使用SurfaceView实现签名板
每日聚焦:机器学习算法(三):基于horse-colic数据的KNN近邻(k-nearest neighbors)预测分类
全球微头条丨领域驱动设计DDD应用与最佳实践
环球观天下!Linux安装Redis教程
看热讯:小孩飞机票怎么收费
1000N连续旋转爆震 国内全新发动机点火成功:颠覆性优势
自爆卡车?奔驰EQE车库逆行:反怪特斯拉Model 3车主不让路
精选!男子在电竞酒店枕头下发现一窝老鼠 官方回应引网友吐槽:怎么能住
微头条丨8只海豚在美国海滩搁浅全部死亡 6只被安乐死
焦点速递!吉利全新SUV博越COOL官图发布:四出排气、1.5升发动机
要去海南旅游的老友们请注意,海南离岛免税购物,有新变化!
今日热闻!数据库系统原理之关系数据库
深入消息队列MQ,看这篇就够了!
全网最详细中英文ChatGPT-GPT-4示例文档-从0到1快速入门条目分类应用——官网推荐的48种最佳应用场景(附python/node.js/curl命令源
环球动态:以太网发明者鲍勃·梅特卡夫获图灵奖 计算机界的诺贝尔奖
又一股惨遭退市!市值暴跌99%
世界热议:《CS2》地图对比:起源2加持画质更明亮、细节丰富
去年净赚499亿元创纪录!保时捷2.7万名员工每人6.7万元奖金