zoukankan      html  css  js  c++  java
  • 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:本来今天晚上完成三种注入方式的,但是没办法,要准备该死的信息论了。所以今天只能草草写一个了。)

  • 相关阅读:
    MySQL数据库高可用集群搭建-PXC集群部署
    高性能高并发网站架构,教你搭建Redis5缓存集群
    redis连接错误3种解决方案System Error MISCONF Redis is configured to save RDB snapshots
    进程异常行为-反弹Shell攻击,KILL多个进程
    Laravel中我们登录服务器通过 Tinker 手动创建后台管理用户
    Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]解决
    Laravel:php artisan key:generate三种报错解决方案,修改默认PHP版本(宝塔面板)
    大型网站如何防止崩溃,解决高并发带来的问题
    PHP微信公众平台OAuth2.0网页授权,获取用户信息代码类封装demo(二)
    iOS开发 ReactiveCocoa入门教程 第二部分
  • 原文地址:https://www.cnblogs.com/2f28/p/9954041.html
Copyright © 2011-2022 走看看