全局钩子注入DLL

摘要:
0x00原理描述:Windows系统是消息驱动的。每个进程都有自己的消息队列。每个进程将通过GetMessage调用WIN32APISetWindowsHookEx。您可以在系统的钩子链中安装指定的钩子。如果使用SetWindowsHookEx安装WH_ GETMESSAGE类型的挂钩,并且挂钩过程函数可以放置在DLL中以实现全局DLL注入0x01关键API描述:实现全局挂钩注入DLL的核心API:
0x00 原理说明:

Windows系统基于消息驱动,每个进程都有各自的消息队列,每个进程都会GetMessage

调用WIN32API SetWindowsHookEx 可以在系统的钩子链中安装一个指定的钩子

如果使用 SetWindowsHookEx 安装 WH_GETMESSAGE 类型的钩子,并且钩子过程函数放在DLL中,就可以实现全局的DLL注入

0x01 关键API说明:

实现全局钩子注入DLL最核心的API:

HHOOK WINAPI SetWindowsHookEx(
  _In_ int       idHook,
  _In_ HOOKPROC  lpfn,
  _In_ HINSTANCE hMod,
  _In_ DWORD     dwThreadId
);

参数说明:

1、 idHook:钩子类型,此处填写WH_GETMESSAGE

2、 lpfn:钩子的过程函数,也就是钩子触发的时候要执行的代码

3、 hMod:钩子过程函数所在的DLL模块句柄,在DLL初始化的获得(DllMain的第一个参数)

4、 dwThreadId:与钩子程序关联的线程ID,此处填0,表示关联系统中的所有线程

返回值:

钩子句柄

0x02 编写需要注入的DLL:

DLL大致需要实现以下内容:

1、 设置钩子

2、 取消钩子

3、 钩子过程函数

4、 导出相关函数

DLL的主要实现代码如下:

#include "pch.h"

HHOOK g_hHook;
HMODULE g_hModule;

LRESULT CALLBACK GetMsgProc(
     _In_ int    code,
     _In_ WPARAM wParam,
     _In_ LPARAM lParam
)
{
     return CallNextHookEx(g_hHook, code, wParam, lParam);
}

BOOL LoadHook(void)
{
     g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, g_hModule, 0);
     if (g_hHook){
         MessageBox(NULL, TEXT("钩子加载成功!"), TEXT("提示"), MB_OK);
         return TRUE;   
     }
     else
         return FALSE;
}

VOID UnloadHook(void)
{
     if(g_hHook)
         UnhookWindowsHookEx(g_hHook);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                        DWORD  ul_reason_for_call,
                        LPVOID lpReserved
                      )
{
     switch (ul_reason_for_call)
     {
     case DLL_PROCESS_ATTACH:
         g_hModule = hModule;
         MessageBox(NULL, TEXT("加载DLL!"), TEXT("提示"), MB_OK);
         break;
     case DLL_THREAD_ATTACH:
     case DLL_THREAD_DETACH:
     case DLL_PROCESS_DETACH:
         break;
     }
     return TRUE;
}

新建def文件导出相关函数:

LIBRARY


EXPORTS
LoadHook
UnloadHook

编译生成 TestDLL.dll 文件

0x03 编写调用程序:

DLL不能主动执行,因此需要编写调用程序:

#include <windows.h>
#include <stdio.h>

#define  DLL_NAME    "TestDLL.dll"

int main(int argc, char* argv[])
{
     do{
         HMODULE hModule = LoadLibraryA(DLL_NAME);
         if(hModule == NULL)
             break;
         FARPROC pfnLoadHook = GetProcAddress(hModule, "LoadHook");
         FARPROC pfnUnloadHook = GetProcAddress(hModule, "UnloadHook");
         if(pfnLoadHook==NULL || pfnUnloadHook==NULL)
             break;
         if (pfnLoadHook())
             printf("全局钩子加载成功! ");
         else{
             printf("全局钩子加载失败! ");
             break;
         }
         printf("按任意键卸载全局钩子! ");
         getchar();
         pfnUnloadHook();
         printf("全局钩子卸载完成! ");
     }while(FALSE);

    getchar();
     return 0;
}

注:为了简化出错处理,使用了 do-while(0) 结构

0x04 验证:

先打开PCHunter查看:

1

可以看到此时系统应用层没有任何全局消息钩子

为了方便观察,打开系统自带的Notepad,并使用调试器附加:

2

编译生成 TestDLL.dll 文件和调用程序放在同一路径下,并且执行调用程序:

3

可以发现已经成功将DLL注入到了当前系统的很多进程当中,用调试器附加的Notepad进程可以非常直观的看到结果

同时在PCHunter中也可以直观的看到结果:

4

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DOCTYPE html PUBLIC 指定了 HTML 文档遵循的文档类型定义winform项目笔记:下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于Windows的任务计划管理

今天突然兴致勃勃地研究了一下Windows的任务计划程序,发现挺不错的! 用这个Windows自带程序,可以很人性化的详细地设置一些任务,例如启动某个程序、执行某条命令、在屏幕前端显示消息、甚至可以发送电子邮件。 另外,它与命令行的at命令是相关联的,at命令执行之后,这里就会添加一项任务。但要注意的是,at命令添加的是at服务,命名是At*(At1、At...

wifi的几种工作模式

WIFI配置具体的模式主要有以下这几种:STA模式、AccessPoint模式、Monitor模式、Ad-hoc(IBSS)模式、WDS模式、Mesh模式。 第一种:STA模式 任何一种无线网卡都可以运行在此模式下,这种模式也可以称为默认模式。在此模式下,无线网卡发送连接与认证消息给热点,热点接收到后完成认证后,发回成功认证消息,此网卡接入无线网络。这种模...

涨姿势了解一下Kafka消费位移可好?

摘要:Kafka中的位移是个极其重要的概念,因为数据一致性、准确性是一个很重要的语义,我们都不希望消息重复消费或者丢失。而位移就是控制消费进度的大佬。本文就详细聊聊kafka消费位移的那些事,包括: 概念剖析 kafka的两种位移 关于位移(Offset),其实在kafka的世界里有两种位移: 分区位移:生产者向分区写入消息,每条消息在分区中的位置信息...

Python import / pyd / dll

使用Python import 模块时, 先会在模块的搜索path里依次搜索(前面会覆盖之后出现的同名模块),次序为:  1. 程序的主目录(交互模式下当前的工作目录或 脚本文件所在的目录) 2. 环境变量 PYTHONPATH目录(如果已经进行了设置) 3. 标准链接库目录(标准库模块所在目录 C:Python27或C:Python27Libsite-p...

[转] 谈谈mq消息消费的2种方式

本章内容 从消费者的角度出发,分析一下消息消费的两种方式: push方式 pull方式 push方式 消息消费的过程: mq接收到消息 mq主动将消息推送给消费者(消费者需提供一个消费接口) mq属于主动方,消费者属于一种被动消费,一旦有消息到达mq,会触发mq推送机制,将消息推送给消费者,不管消费者处于何种状态。 优点: 消费者代码较少:对于消费...

VS中合并dll 方便发布

     过程简介:在VS2012中通过NuGet安装ILmerge和MSBuild.ILMerge.Task,在程序编译时,经过这两个插件直接自动将exe和dll打包成一个exe放置在debug或release文件夹中,或者将dll合成一个dll。    首先,我们需要当前VS所适配的最新的NuGet,这一点可以在Nuget官网下载相应版本或者将VS更新...