1. 程式人生 > >DLL注入之windows訊息鉤取

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!\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.exeKeyHook.dll放到一個盤目錄下,HookMain用管理員方式開啟。下面我們使用開啟指定的被監聽的程式notepad.exe,並用ProcessExpoler來檢視的notepad.exe是否被注入。

圖一:

 

圖二:

 

 

圖一是沒有在natepad.exe中使用鍵盤的情況。圖二是使用鍵盤的情況。我們可以看到圖二中KeyHook.dll已經注入了notepad.exe程序中。(PS:本來今天晚上完成三種注入方式的,但是沒辦法,要準備該死的資訊理論了。所以今天只能草草寫一個了。)