DLL注入简单测试
文章目錄
- 什么是注入?
- 已知的注入方式:
- 代碼實現
什么是注入?
所謂注入就是在第三方進程不知道或者不允許的情況下將 模板 或者 代碼 寫 入對方進程空間,并設法執行的技術
在安全領域,“注入”是一種非常重要的技術手段,注入與反注入也一直處于不斷變化的,而且越來越激烈的對抗當中
已知的注入方式:
遠程線程注入,APC注入,消息鉤子注入,注冊表注入,導入表注入,輸入法注入等等
線程函數并非固定的,只需滿足條件:四個字節的參數,四個字節的返回值,那么其它都無所謂了
其實DLL注入就是利用CreateRemoteTheread來開啟一個遠程線程,但是這個線程函數地址在目標進程里面并不知道。
線程函數聲明:
DWORD WINAPI ThreadProc(_In_ LPVOID lpParameter );通過觀察,只要滿足四個字節的參數,四個字節的返回值
最意外的就是kernel32.dll中的LoadLibraryA滿足這個條件,而且大多數進程都會加載kernel32.dll,這種核心東西加載地址在每個進程中都是一樣的,這樣就有了注入思路了:
1.Kernel32.dll:最核心的功能模塊,比如管理內存,進程和線程相關的函數
2.User32.dll:是Windows用戶相關界面應用程序接口,如創建窗口和發送消息等
3.GDI32.dll:全稱是Graphical Device Interface(圖形設備接口),包含用于畫圖和顯示文本的函數
代碼實現
dll代碼:
#include "pch.h" #include<Windows.h>void thread() {while (1) {MessageBox(NULL, L"你被Hook了", L"放下武器", MB_OK);} }BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)thread, NULL, 0, NULL);break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE; }載體:
#include <iostream> #include<Windows.h> using namespace std;void inject(const char * name) {HANDLE handle=OpenProcess(PROCESS_ALL_ACCESS, FALSE, 24984);int length = strlen(name) + 1;LPVOID ipAllocAddr=VirtualAllocEx(handle,NULL,length,MEM_COMMIT,PAGE_READWRITE);WriteProcessMemory(handle, ipAllocAddr, name, length, NULL);HMODULE hMoudule=GetModuleHandle("Kernel32.dll");DWORD dwLoadr=(DWORD)GetProcAddress(hMoudule, "LoadLibraryA");CreateRemoteThread(handle, NULL, 0, (LPTHREAD_START_ROUTINE)dwLoadr, ipAllocAddr, 0, NULL);}void attack() {printf("攻擊了……………………\n");}void defend() {printf("防御了……………………\n");}void sitdown() {printf("坐下了……………………\n");}int main() {inject("G:/windows核心編程/test.dll/Debug/test.dll");}總結
- 上一篇: 两个小程序利用注入如何进行简单交互
- 下一篇: 图片轮播器,relativelayout