逆向工程核心原理 Chapter 21 | Windows消息钩取

开始DLL注入章节的学习。

知识点学习

消息钩子

这里主要是要弄明白Windows GUI程序的工作模式/流程。

GUI以事件驱动方式工作。核心概念:message queue

在这里插入图片描述

在这里插入图片描述

最具代表性的:MS提供的spy++

在这里插入图片描述

SetWindowsHookEX()

SetWindowsHookExA 函数 (winuser.h) - Win32 apps | Microsoft Learn

HHOOK SetWindowsHookExA([in] int       idHook, 	// hook type[in] HOOKPROC  lpfn,   	// hook procedure [in] HINSTANCE hmod,   	// hook procedure所属的DLL句柄 (Handle)[in] DWORD     dwThreadId // 待hook的线程ID
);

在这里插入图片描述

像这样,使用SetWindowsHookEX()设置好钩子后,

运行钩取示例 HookMain.exe

附件给的:

在这里插入图片描述

经测试,要在win7环境跑。

运行HookMain后打开notepad,再开Process Explorer。

选中notepad.exe CTRL+D

在这里插入图片描述

说明KeyHook.dll已经注入notepad.exe进程了。

然后HookMain.exe中输入q后就退出,KeyHook.dll也不在notepad.exe中了。

源码分析/书写

这一章的逆向都很简单,主要关注的是怎么自己写dll inject。

HookMain.cpp

// HookMain.cpp
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<Windows.h>#define DLL_NAME "KeyHook.dll" // dll's name
#define HOOKSTART "HookStart" // start function in DLL
#define HOOKSTOP "HookStop" // stop functiontypedef void(*P_FUNC)(); // 函数指针int main() {HMODULE hDll = NULL;P_FUNC HookStart = NULL;P_FUNC HookStop = NULL;// 加载KeyHook.dllhDll = LoadLibraryA(DLL_NAME);// 获取导出函数地址HookStart = (P_FUNC)GetProcAddress(hDll, HOOKSTART);HookStop = (P_FUNC)GetProcAddress(hDll, HOOKSTOP);//HookStart();printf("press 'q' to quit!\n");while (_getch() != 'q');//HookStop();// 卸载KeyHook.dllFreeLibrary(hDll);return 0;
}

KeyHook.cpp

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"// KeyHook.cpp
#include<stdio.h>
#include<Windows.h>constexpr auto PROCESS_NAME = "notepad.exe";
HINSTANCE hInstance = NULL;
HHOOK hHook = NULL;
HWND hWnd = NULL;BOOL APIENTRY DllMain( HMODULE hinstDLL,DWORD  dwReason,LPVOID lpReserved)
{switch (dwReason){case DLL_PROCESS_ATTACH:hInstance = hinstDLL;break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH: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 = key press   ;   1 = key releaseif ((lParam & 0x80000000) == 0) {GetModuleFileNameA(NULL, szPath, MAX_PATH); // 获取当前进程的可执行文件路径p = strrchr(szPath, '\\');// 比较当前进程名称,若为`notepad.exe`,则消息不会传递给下一个钩子。if (!_stricmp(p + 1, PROCESS_NAME))return 1;}}// 若不是`notepad.exe`,则将消息传递给下一个钩子。return CallNextHookEx(hHook, nCode, wParam, lParam);
}#ifdef __cplusplus
extern "C" {
#endif__declspec(dllexport)void HookStart(){hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstance, 0);
}__declspec(dllexport)void HookStop() {if (hHook) {// 注销挂钩UnhookWindowsHookEx(hHook);hHook = NULL;}}#ifdef __cplusplus
}
#endif

KeybroadProc回调函数的说明:KeyboardProc 回调函数 - Win32 apps | Microsoft Learn

LRESULT CALLBACK KeyboardProc(_In_ int    code,  // HC_ACTION:0  HC_NOREMOVE:3_In_ WPARAM wParam,_In_ LPARAM lParam
);

GetModuleFileNameA

GetModuleFileNameA 函数 (libloaderapi.h) - Win32 apps | Microsoft Learn

检索包含指定模块的文件的完全限定路径。 模块必须已由当前进程加载。

DWORD GetModuleFileNameA([in, optional] HMODULE hModule, // 正在请求其路径的已加载模块的句柄。 如果此参数为 NULL, 则 GetModuleFileName 将检索当前进程的可执行文件的路径。[out]          LPSTR   lpFilename, // 指向接收模块的完全限定路径的缓冲区的指针。[in]           DWORD   nSize
);

CallNextHookEX

LRESULT CallNextHookEx([in, optional] HHOOK  hhk, // 忽略此参数。[in]           int    nCode,[in]           WPARAM wParam,[in]           LPARAM lParam
);

SetWindowsHookExA

SetWindowsHookExA 函数 (winuser.h) - Win32 apps | Microsoft Learn

HHOOK SetWindowsHookExA([in] int       idHook,[in] HOOKPROC  lpfn,[in] HINSTANCE hmod,[in] DWORD     dwThreadId
);

两个源码写好后,先生成KeyHook.dll(注意选x86),将生成的dll放在HookMain的文件夹下,生成HookMain.exe。

但尝试运行:本地机直接卡炸。。(可能是写的有Bug)虚拟机的话缺库,跑不了。

看来后续得在win10虚拟机安个visual studio了。。

调试分析

这部分的dll都很简单,调试直接跟就行,就不展开了。

总结

逆向技术中极其重要的板块,Windows内网高级Bypass的基础。
Windows编程还很不熟悉,相应的API写法得多练习。

在这里插入图片描述

共勉!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/414944.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网易易盾携手雷斧科技,打造公平竞技环境

这是一个充满复古像素风格的游戏世界&#xff0c;玩家们控制着自己的像素角色&#xff0c;手持着各种像素化武器&#xff0c;时而酣畅对战&#xff0c;时而自由创作地图、武器和皮肤。 《像素射击》是由雷斧科技开发的一款集生存、对战、沙盒创造于一体的像素风格的3D多人在线…

极狐GitLab 17.3 重点功能解读

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;可以私有化部署&#xff0c;对中文的支持非常友好&#xff0c;是专为中国程序员和企业推出的企业级一体化 DevOps 平台&#xff0c;一键就能安装成功。安装详情可以查看官网指南。 极狐GitLab 17.3 正式发布了多项与敏捷项目管…

ecmascript和javascript的区别

ECMAScript ECMAScript&#xff08;通常缩写为ES&#xff09;是JavaScript的规范&#xff0c;由Ecma International组织制定和维护。ECMAScript是一种脚本语言标准&#xff0c;主要用于Web应用程序开发&#xff0c;但也适用于其他类型的应用程序&#xff0c;如桌面和移动应用程…

相亲交友小程序开发功能分析

相亲交友小程序的开发功能分析可以从用户端和管理后台两个主要方面来进行。 用户端功能 注册与登录&#xff1a; 用户可以通过手机号、微信号或其他第三方平台进行注册登录&#xff0c;简化注册流程。 实名认证&#xff1a; 引入实名认证机制&#xff0c;确保用户信息的真实…

Java 技术教程:@JsonInclude(JsonInclude.Include.NON_EMPTY) 注解详解

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

C语言连接MySql(vs2022、Vc++6.0、DevC++)

本文c&#xff08;OraOla编写&#xff09;与Java(Wideskyzz编写) 由于csdn的排版太垃圾了&#xff0c;所以可以直接看资料 上传资料也麻烦&#xff0c;所以可直接访问我的gitee C语言连接MySql: C语言&#xff08;vs2022、Vc6.0、DevC&#xff09;连接MySqlhttps://gitee.co…

Python检测和识别车牌-python经典练手项目

车牌检测与识别技术用途广泛&#xff0c;可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。 本文将使用Python创建一个车牌检测和识别程序。该程序对输入图像进行处理&#xff0c;检测和识别车牌&#xff0c;最后显示车牌字符&#xff0c;作为…

OceanBase 的ODP OBproxy 的记录

OceanBase 的ODP的路由说明一、简述为什么使用ODP的原因 &#xff08;强一致性情况下&#xff09; 1.分布式数据库在SQL解析这块存在本地执行计划&#xff0c;远程执行计划&#xff0c;分布式执行计划。 本地执行计划&#xff1a;整个SQL的表都在session所在的Observer 节点上。…

数据结构代码集训day14(适合考研、自学、期末和专升本)

题目均来自b站up&#xff1a;白话拆解数据结构&#xff01; 今日题目如下&#xff1a;&#xff08;1&#xff09;试写一个算法判断给定字符序列是否是回文。 &#xff08;2&#xff09;给定一个算法判断输入的表达式中括号是否匹配。假设只有花、中、尖三种括号。 题1 回文序列…

教学能力知识

第一章课程理论知识 一、课程理念 二、课程目标 1.核心素养 2.课程总目标 三、教学建议 四、教学环节 第二章教学实施 第一节导入新课类 二.导入方法 第二节教学方法类 教学方法的选择依据 第三节教法实施原则类 设计意图 第四节设计意图类 1.教学目标 2.教学重难点 3.教学…

【Linux】:用户缓冲区

1.前言&#xff08;引出现象&#xff09; 我们看一段代码&#xff0c; 我们运行这段代码&#xff0c; 再次运行&#xff0c;并将打印结果重定向到文件log.txt中&#xff0c; 结果除了系统调用write的输出&#xff0c;其余输出都多打印一次。这是为什么呢&#xff1f;我们先…

《花100块做个摸鱼小网站! 》第五篇—通过xxl-job定时获取热搜数据

⭐️基础链接导航⭐️ 服务器 → ☁️ 阿里云活动地址 看样例 → &#x1f41f; 摸鱼小网站地址 学代码 → &#x1f4bb; 源码库地址 一、前言 我们已经成功实现了一个完整的热搜组件&#xff0c;从后端到前端&#xff0c;构建了这个小网站的核心功能。接下来&#xff0c;我们…

029、架构_高可用_水位和分组

GoldenDB分组技术 GoldenDB灵活智能的数据可用性策略名称是gTank。包含了分组技术和高低水位两个技术点。在分布式一主多备架构下,全节点的数据同步,耗时长、用户体验差。因此GoldenDB采用分组技术,将数据节点和事务节点GTM实现分组管理,实现业务的灵活配置。 数据节点集群…

基于 OpenCV 的数字图像处理实验平台设计

基于 OpenCV 的数字图像处理实验平台设计 前言简介正文资源链接&#xff08;含源码&#xff09; 前言 哈哈上学那会儿做的一个软件&#xff0c;当时把OpenCV各个基础算法都集成在了一起&#xff0c;还有一定程度的顺序执行部分相关算法的功能&#xff0c;那时候网上相关内容比较…

/单元测试

承接上文 统一异常处理&#xff0c;封装结果-CSDN博客 ******************************************** 登录业务 Service public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {Resourceprivate JwtUtils j…

jQuery入门(六)jQuery实现瀑布流分页案例

一、瀑布流分页案例分析 1.1) 功能分析&#xff1a; 鼠标下拉&#xff0c;加载分页数据(10条) &#xff0c;如下图&#xff1a; 案例分析&#xff1a; 1.2) 如何确定当前显示的数据已经浏览完毕&#xff1f; 公式&#xff1a;(滚动条距底部的距离 滚动条上下滚动的距离 当…

Echarts中国地图省市区县三级联动

NodeV14.20.0安装 # 历史版本Node下载地址 https://nodejs.org/en/download/prebuilt-installer# NodeV14.20.0配置与部署 https://nodejs.org/dist/v14.20.0/node-v14.20.0-x64.msi构建默认Vue3工程目录 npm install -g vue/cli --registryhttps://registry.npm.taobao.org …

22. K8S及DevOps

22. K8S及DevOps 一. 章节简介二. DevOps1. 简介2. CICD三. Kubernetes1. [官网](https://kubernetes.io/zh-cn/)2. K8S安装2.1 服务器要求2.2 准备工作演示服务器IP主副服务器设置`hostnamectl`设置host与ip绑定关闭防火墙时间同步关闭selinux安全策略关闭swap分区网桥过滤与地…

SAPUI5基础知识25 - 聚合绑定(Aggregation Binding)

1. 背景 Aggregation Binding 是 SAPUI5 中的一种数据绑定方式&#xff0c;用于将数据模型中的集合&#xff08;如数组&#xff09;绑定到 UI 控件的聚合&#xff08;如列表项、表格行等&#xff09;。 常见的场景包括将一个数组绑定到 sap.m.List 的 items 聚合&#xff0c;…

人脸静态活体检测(高精度版) API 对接说明

人脸静态活体检测&#xff08;高精度版&#xff09; API 对接说明 本文将介绍人脸静态活体检测&#xff08;高精度版&#xff09;API 对接说明&#xff0c;它可用于对用户上传的静态图片进行防翻拍活体检测&#xff0c;以判断是否是翻拍图片。 接下来介绍下 人脸静态活体检测…