• DLL注入之windows消息钩取


    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! ");

    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.exeKeyHook.dll放到一个盘目录下,HookMain用管理员方式打开。下面我们使用打开指定的被监听的程序notepad.exe,并用ProcessExpoler来查看的notepad.exe是否被注入。

    图一:

    图二:

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

  • 相关阅读:
    cf Round #766(Div. 2)
    网易评论盖楼效果前台实现。。。
    Golang 基础之基础语法梳理 (三)
    Golang 基础之基础语法梳理 (一)
    Golang 基础之基础语法梳理 (二)
    adonisJS mysql
    angular form表单
    adonisJS 入门(路由/控制器/模型/视图)
    angular 父子组件传值及通讯
    adonisJS 视图/查询/列表/单条
  • 原文地址:https://www.cnblogs.com/2f28/p/9954041.html
Copyright © 2020-2023  润新知