DLL注入之windows消息钩取

0x00 通过Windows消息的钩取

通过Windows消息钩取可以使用SetWindowsHookEx。该函数的原型如下:

SetWindowsHookEx(

__in int idHook, \\钩子类型

__in HOOKPROC lpfn, \\回调函数地址

__in HINSTANCE hMod, \\实例句柄

__in DWORD dwThreadId); \\线程ID

)。

我们通过一个HookMain.exe实现对将要注入的dll的控制。HookMain源码如下:

#include "pch.h"

#include <iostream>

#include<Windows.h>

#include<conio.h>

using namespace std;

#define DEF_DLL_NAME "KeyHook.dll"

#define DEF_HOOKSTART "HookStart"

#define DEF_HOOKSTOP "HookStop"

typedef void(*PFN_HOOKSTART)();

typedef void(*PFN_HOOKSTOP)();

void main()

{

HMODULE hDll = NULL;

PFN_HOOKSTART HookStart = NULL;

PFN_HOOKSTOP HookStop = NULL;

char ch = 0;

//加载KeyHook.DLL

hDll = LoadLibraryA(DEF_DLL_NAME);

//获取导出函数

HookStart = (PFN_HOOKSTART)GetProcAddress(hDll, DEF_HOOKSTART);

HookStop = (PFN_HOOKSTOP)GetProcAddress(hDll, DEF_HOOKSTOP);

//开始钩取

HookStart();

//等待知道用户输入“q”

printf("press 'q'to quite!\n");

while (_getch() != 'q');

//终止钩取

HookStop();

//卸载KeyHook.dll

FreeLibrary(hDll);

}

下面是监听键盘的钩子KeyHook的源码:

// KeyHook.cpp : 定义 DLL 应用程序的导出函数。

//

#include "stdafx.h"

#include "Windows.h"

#define DEF_PROCESS_NAME "notepad.exe"

HINSTANCE g_hInstance = NULL;

HWND g_hwnd = NULL;

HHOOK g_hHook = NULL;

BOOL WINAPI DllMain(HINSTANCE hinstdll, DWORD dwReason, LPVOID lpReserved)

{

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)

{

//0=key press,1=key release 当nCode=0是为键盘按下去,当nCode=1时表示键盘松开

if (!(lParam & 0x80000000))//释放键盘

{

GetModuleFileNameA(NULL, szPath, MAX_PATH);//函数GetModuleFileNameA的返回值会传给szPath

p = strrchr(szPath, '\\');//strrchr函数比较szPath中出现‘\\’的位置,并返回指针

//比较两个进程名称,若为notepad.exe则消息不回传递给应用(或者下一个钩子)

if (!_stricmp(p + 1, DEF_PROCESS_NAME))//strtcmp函数是比较两个字符串是否相等

return 1;

}

}

//若非notePad.exe,则调用CallNextHookEx()函数,将消息传递给应用程序(或者下一个钩子)

return CallNextHookEx(g_hHook, nCode, wParam, lParam);

}

/*

下面这段是用C代替c++

*/

#ifdef __cplusplus//c++

extern "C" {

#endif

__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

打开分别生成的Released文件,记住Hookmain.exe和KeyHook.dll放到一个盘目录下,HookMain用管理员方式打开。下面我们使用打开指定的被监听的程序notepad.exe,并用ProcessExpoler来查看的notepad.exe是否被注入。

图一:

图二:

图一是没有在natepad.exe中使用键盘的情况。图二是使用键盘的情况。我们可以看到图二中KeyHook.dll已经注入了notepad.exe进程中。(PS:本来今天晚上完成三种注入方式的,但是没办法,要准备该死的信息论了。所以今天只能草草写一个了。)

DLL注入之windows消息钩取的更多相关文章

  1. 《逆向工程核心原理》Windows消息钩取

    DLL注入--使用SetWindowsHookEx函数实现消息钩取 MSDN: SetWindowsHookEx Function The SetWindowsHookEx function inst ...

  2. Dll注入:Windows消息钩子注入

    SetWindowsHook() 是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之 ...

  3. Reverse Core 第三部分 - 21章 - Windows消息钩取

    @author: dlive @date: 2016/12/19 0x01 SetWindowsHookEx() HHOOK SetWindowsHookEx( int idHook, //hook ...

  4. Windows消息钩取

    @author: dlive @date: 2016/12/19 0x01 SetWindowsHookEx() HHOOK SetWindowsHookEx( int idHook, //hook ...

  5. 逆向学习-Windows消息钩取

    钩子 Hook,就是钩子.偷看或截取信息时所用的手段或工具. 消息钩子 常规Windows流: 1.发生键盘输入事件时,WM_KEYDOWN消息被添加到[OS message queue]. 2.OS ...

  6. 通过注入DLL后使用热补丁钩取API

    通过注入DLL后使用热补丁钩取API 0x00 对比修改API的前五个字节钩取API 对前一种方法钩取API的流程梳理如下: 注入相应的DLL 修改原始AI的函数的前五个字节跳往新函数(钩取API) ...

  7. 通过注入DLL修改API代码实现钩取(一)

    通过注入DLL修改API代码实现钩取(一) Ox00 大致思路 通过CreateRemoteThread函数开辟新线程,并将DLL注入进去 通过GetProcessAddress函数找到需钩取的API ...

  8. Dll注入技术之消息钩子

    转自:黑客反病毒 DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个 ...

  9. SetWindowsHookEx 消息钩取进程卡死

    <逆向工程核心原理> windows消息钩取部分的例子在win10下卡死,失败.通过搜索发现,要保证钩取的进程与注入的dll要保持cpu平台相同 SetWindowsHookEx可用于将d ...

随机推荐

  1. 快速升级Zabbix 5.0 版本

    Zabbix 5.0 增加了很多新功能,如:垂直菜单.隐藏菜单.用户界面中的测试项目.限制代理检查.查找并替换预处理步骤 ES7支持等等...快来部署体验一把尝鲜体验 Zabbix 5.0 吧     ...

  2. android-sdk-window的环境搭建以及appium简单录制脚本的使用

    大家好,今天给大家带来的是appium的环境搭建以及简单的录制脚本,自学的过程中入了不少坑,下面给大家开始分享! 使用Appium录制脚本必备三大金刚:Appium-desktop(至于为什么用这个, ...

  3. @atcoder - AGC008E@ Next or Nextnext

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个长度为 N 的序列 a,问有多少排列 p,满足对于每一个 ...

  4. (八)利用 Profile 构建不同环境的部署包

    接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local).(开发小组内自测的)开发环境(dev).(提供给测试团队的)测试环境(test).预发布环境(pre) ...

  5. Mysql:bit类型的查询与插入

    原文链接:https://www.cnblogs.com/cuizhf/archive/2013/05/17/3083988.html Mysql关于bit类型的用法: 官方的资料如下: 9.1.5. ...

  6. 【JMeter_14】JMeter逻辑控制器__交替控制器<Interleave Controller>

    交替控制器<Interleave Controller> 业务逻辑: 根据被控制器触发执行次数,去依次执行控制器下的子节点<逻辑控制器.采样器>. 被触发执行可以由线程组的线程 ...

  7. 漏洞复现-Office远程代码执行漏洞 (CVE-2017-11882&CVE-2018-0802)

    漏洞原理 这两个漏洞本质都是由Office默认安装的公式编辑器(EQNEDT32.EXE)引发的栈溢出漏洞(不要问什么是栈溢出,咱也解释不了/(ㄒoㄒ)/~~) 影响版本 Office 365 Mic ...

  8. 【SEED Labs】DNS Rebinding Attack Lab

    Lab Overview 实验环境下载:https://seedsecuritylabs.org/Labs_16.04/Networking/DNS_Rebinding/ 在这个实验中模拟的物联网设备 ...

  9. 明文暴露___JS前台加密,java后台解密实现

    1.前台JS <script type="text/javascript"> $(function() { $("#btn").click(func ...

  10. Perl入门(四)Perl的正则表达式

    正则表达式是Perl语言的特色,基本的语法不是很难,但是编写一个符合需求.高效的正则表达式,还是有一些挑战的. Perl的三种匹配模式 1.查找 语法:m/正则表达式内容/; 作用:查找匹配内容中是否 ...