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.exe和KeyHook.dll放到一個盤目錄下,HookMain用管理員方式開啟。下面我們使用開啟指定的被監聽的程式notepad.exe,並用ProcessExpoler來檢視的notepad.exe是否被注入。
圖一:
圖二:
圖一是沒有在natepad.exe中使用鍵盤的情況。圖二是使用鍵盤的情況。我們可以看到圖二中KeyHook.dll已經注入了notepad.exe程序中。(PS:本來今天晚上完成三種注入方式的,但是沒辦法,要準備該死的資訊理論了。所以今天只能草草寫一個了。)