1. 程式人生 > >常見註入手法第四講,SetWindowsHookEx全局鉤子註入.以及註入QQ32位實戰.

常見註入手法第四講,SetWindowsHookEx全局鉤子註入.以及註入QQ32位實戰.

函數調用 還需要 xxx span ray 地址 geb 64位 llb

              常見註入手法第四講,SetWindowsHookEx全局鉤子註入.以及註入QQ32位實戰.

PS:上面是操作.最後是原理

一丶需要了解的API

  使用全局鉤子註入.我們需要了解幾個WindowsAPI. 不需要太多.

1. 設置鉤子API

  

HHOOK WINAPI SetWindowsHookEx(
  _In_  int    idHook,            設置鉤子的類型.意思就是我要設置的鉤子是什麽鉤子. 可以是監視窗口過程.可以是監視消息隊列.
  _In_ HOOKPROC lpfn,             根據鉤子類型.設置不同的回調函數.
  _In_ HINSTANCE hMod,            鉤子設置的Dll實例句柄,就是DLL的句柄
  _In_ DWORD dwThreadId             設置鉤子的線程ID. 如果為0 則設置為全局鉤子.
);
                          HHOOK 返回值. 是一個鉤子過程句柄.

2.獲取模塊句柄API

  

HMODULE WINAPI GetModuleHandle(
  _In_opt_ LPCTSTR lpModuleName           獲取的實例句柄的文件名.可以是Dll可以使exe  如果為NULL 這是當前dll/exe的實例句柄
);                                       返回值 返回實例句柄.

3.取消設置鉤子API

  

BOOL WINAPI UnhookWindowsHookEx(
  _In_ HHOOK hhk                        參數一是 SetWindowHookEx的返回值.也就是鉤子過程句柄. 
);                                      返回值: 返回值是BOOL類型.表示設置是否成功或者失敗.

4.繼續調用鉤子鏈中的鉤子過程.

  

LRESULT WINAPI CallNextHookEx(
  _In_opt_ HHOOK hhk,          保存的鉤子過程,也就是SetWindowsHookEx返回值.
  _In_      int     nCode,            根據SetWindowsHookEx設置的鉤子回調而產生的不同的nCode代碼. 什麽意思? 意思就是如果設置的鉤子類型是鼠標消息.那麽那個nCode就是鼠標消息.如果是鍵盤這是鍵盤
  _In_ WPARAM wParam,                 同2參數一樣.附加參數. 根據鉤子回調類型.附加參數有不同的意義.比如如果是鼠標.那麽這個有可能代表的就是鼠標的x位置.鍵盤就可能是鍵代碼
  _In_ LPARAM lParam                  同3參數一樣.附加參數.
);

  

5.鉤子回調

鉤子回調根據SetWindowsHookEx參數1來設定的.比如如果我們設置WH_CBT 那麽我們設置的回調函數就是CBT回調. 具體查詢MSDN

技術分享圖片

LRESULT CALLBACK CBTProc(         這個回調函數裏面寫我們的代碼就可以了.
  _In_  int     nCode,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);

二丶全局鉤子註入步驟.

其實看上面幾個API其實註入就不難了.

那麽鑒於學習.說一下註入的步驟.

1.調用SetWindowsHookEx設置鉤子.

2.在設置過程中.需要一個回調.所以我們填入一個回調.

3.回調函數中調用CallNextHookEx函數. 如果不調用.那麽相當於我們設置了不反悔.程序可能出現問題.當然是按需返回.

4.取消HOOK設置.

步驟就四步.那麽我們開始.

1.建立DLL工程. 建立DLL工程可以使用VC++6.0 也可以使用VS系列都可以.這裏就不在累贅. 建立DLL工程很簡單.如果不會網絡百度.

2.工程中添加一個HOOK.h的頭文件.以及一個HOOK.cpp的實現文件.

3.編寫代碼.

HOOK.h中的代碼.

#pragma once


#define MYWINDAPIEXPORT __declspec(dllexport)

HHOOK g_HookProc;  //定義為全局HOOK                     返回的鉤子過程



void MYWINDAPIEXPORT SetHook();//設置HOOK鉤子.          //我們的啟動函數.導出函數.外部設置HOOK

void MYWINDAPIEXPORT UnHook();                         //取消設置HOOK

LRESULT CALLBACK MyProc(int nCode, WPARAM wParam, LPARAM lParam); //設置HOOK過程中需要的回調函數

HOOK.cpp的代碼.

#include <Windows.h>
#include "HOOK.H"

void MYWINDAPIEXPORT SetHook()
{
    g_HookProc = ::SetWindowsHookEx(WH_CBT, MyProc,GetModuleHandle(TEXT("Win32Project1.dll")),0); //參數1.HOOK的類型. Hook的回調地址 模塊句柄. 線程ID,為0代表是全局鉤子
    
}

void MYWINDAPIEXPORT UnHook()                                                                    //取消設置HOOK
{
    if (NULL != g_HookProc)
        ::UnhookWindowsHookEx(g_HookProc);
}

LRESULT CALLBACK MyProc(int nCode, WPARAM wParam, LPARAM lParam)  //我們自己的程序處理             
{
    /*
    執行我們的程序
    */
    ::MessageBox(NULL, NULL, NULL, NULL);

    return CallNextHookEx(g_HookProc, nCode, wParam, lParam);                                    //繼續調用鉤子過程
}

上面的.h + cpp就是我們的的代碼的.那麽我們還需要一個外部程序來調用我們的導出函數 SetHOOK() 以及 UnHOOK.

因為SetHook 和 UnHOOK導出函數是在dll中使用的.所以我們想要使用 這兩個函數有兩種方法.

1.靜態調用: 再生成DLL的時候會生成對應的lib. 我們需要在我們的程序中 添加 .h頭文件. 使用宏指令包含.lib文件.

2.動態調用. 動態調用涉及到兩個API. 一個是Loadlibaray() GetProcAddress() 第一個是獲取dll的實例句柄. 第二個是根據實例句柄以及函數名來獲取函數的地址. 也稱為函數指針.

這裏采用第一種方法.如果采用第二種方法.也可以.但是我們的代碼需要加上 extends "C" 來導出.不然就名稱粉碎了.那麽使用GetProcAddress填寫函數名就獲取不到函數指針了.

新建MFC工程.

1.添加HOOK.h頭文件.

2.使用宏命令包含我們的dll的lib #pragam comment(lib,"xxxx.lib")

3.在Hook按鈕點擊位置調用導出函數SetHOOK.

4.在UnHOOK按鈕點位置.調用導出函數UnHOOK.

1.界面:

  技術分享圖片

2.我們原有的HOOK.H文件.

技術分享圖片

3.靜態使用的lib庫.

技術分享圖片

4.按鈕點擊裏面的函數調用.

技術分享圖片

5.使用工具查看是否註入了DLL 推薦是Pchunter工具.

技術分享圖片

可以看到已經註入了.

PS: 因為我們寫的是32位DLL所以註入的程序都是32位的.如果是64位DLL那麽註入到程序應該為64.詳情請查詢MSDN SetWindosHookEx.

三丶原理講解

上面講了這麽多操作.原理應該不是太懂.

其實SetWindowsHookEx就是在應用程序執行過程中.替我們加了一層. 而我們提供回調地址那麽當操作來了就會通知我們回調.這個時候我們回調函數就可以做我們的事情了.

比如:

  A函數 -> B函數 -> C函數. 正常執行流程是 A函數調用B B調用C.

而我們添加了一層.

  A - 我們 (利用CallNextHookEx決定是否調用下一個過程) 是 - >B ->C

A ->我們(不是的情況下) 不調用B.

DLL怎麽註入的疑問?

  上圖我們寫的這麽多.並沒有針對QQ或者其他32位程序註入DLL. 為什麽會註入了DLL.

原理:

  原理就是我們的窗口程序. 直接使用DLL裏面的SetWindowsHookEx設置了一個回調. 而這個API是給全局所有應用程序都設置了這個回調.那麽如果有32位程序會觸發回調.那麽我們的DLL就會註入到裏面去了.

 

常見註入手法第四講,SetWindowsHookEx全局鉤子註入.以及註入QQ32位實戰.