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. (一)c++之细解 const 与 static

    const成员变量与const成员函数与const对象 static成员变量与static成员函数与static全局变量 const成员变量 1. const用于类中成员变量时,将类成员变为只读属性( ...

  2. 数值格式化 NumberFormat、 DecimalFormat、 RoundingMode

    NumberFormat [简介] java.text.NumberFormat extends java.text.Format extends java.lang.Object 实现的接口:Ser ...

  3. .net core3.1 abp动态菜单和动态权限(思路) (二)

    ps:本文需要先把abp的源码下载一份来下,跟着一起找实现,更容易懂 在abp中,对于权限和菜单使用静态来管理,菜单的加载是在登陆页面的地方(具体是怎么知道的,浏览器按F12,然后去sources中去 ...

  4. [转] C++项目中的extern "C" {}

    点击阅读原文 引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus extern "C" { #endif /*...*/ #if ...

  5. @topcoder - SRM603D1L3@ SumOfArrays

    目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 给定两个长度为 n 的数列 A, B.现你可以将两数列重排列,然后对 ...

  6. ado.net Web前端:关于JavaScript知识点的简单梳理

    学习js:1.htmml2.cssjs+html+css == html5 js的组成:1).ecamscript ES是js的标准,js 是es 的实现2)文档对象模型(Document Objec ...

  7. 专家解读:利用Angular项目与数据库融合实例

    摘要:面对如何在现有的低版本的框架服务上,运行新版本的前端服务问题,华为云前端推出了一种融合方案,该方案能让独立的Angular项目整体运行在低版本的框架服务上,通过各种适配手段,让Angular项目 ...

  8. chromedp入门

    chromedp入门 chromedp是什么? chromedp是go写的,支持Chrome DevTools Protocol 的一个驱动浏览器的库.并且它不需要依赖其他的外界服务(比如 Selen ...

  9. Python3-collections模块-容器数据类型

    Python3中的collections模块实现了一些专业的容器数据类型 最常用的容器数据类型 字典.列表和元组.集合都已经被Python默认导入,但在实现一些特定的业务时,collections模块 ...

  10. 入门大数据---Hbase是什么?

    一.Hbase是什么? Hbase属于NoSql的一种. NoSql数据库分为如下几类: Key-Value类型数据库 这类数据库主要会使用到一个哈希表,这个表有一个特定的键和一个指针指向特定的数据. ...