14种DLL注入技术
本文是我搜集整理的DLL注入方法,有一些自己實現了,在文末的鏈接里有源碼,其余沒有實現的也有git鏈接或別的源碼鏈接。
參考鏈接:https://bbs.pediy.com/thread-227075.htm
?
第一種? CreateRemoteThread遠程線程調用
DLL注入是指向某一個特定的進程空間強制插入一個特定的DLL文件映像,值得注意的是這種插入是強制性的插入,從技術層面來看,DLL注入是利用LoadLibrary()加載特定的DLL文件到進程的內存空間。注入的對象是可以是自身,也可以是遠程進程。DLL注入技術實現主要分為5個部分,
1.打開進程,獲取進程的句柄,
2.是在內存空間開辟一段內存空間
3.是向剛剛開辟的內存中寫入需要注入DLL的路徑,
4.是利用GetProcessAddree()獲取LoadLibrary的地址。
5.是調用遠程線程,利用LoadLibrary()去加載DLL。
?
第二種??RtlCreateUserThread創建用戶線程
RtlCreateUserThread是CreateRemoteThread的底層實現,所以使用RtlCreateUserThread的原理是和使用CreateRemoteThread的原理是一樣的。唯一的區別是使用CreateRemoteThread寫入目標進程的是Dll的路徑,而RtlCreateUserThread寫入的是一段shellcode。因為直接調用了RtlCreateUserThread創建線程,繞過了win7/vista對這方面的檢測所以可以注入到系統進程中(比如winlogon.exe),當然此方法也有缺陷,因為沒有和csrss通訊,可能在線程體里面調用某些api函數可能會失敗。還有需要注意的是因為RtlCreateUserThread沒有經過系統封裝所以線程體必須自己調用ExitThread來結束線程。
?
第三種 APC注入
通過CreateRemoteThread函數創建一個線程就可以使用遠程進程中的一個函數。然而,線程創建需要系統開銷,所以調用一個現有的線程會更加高效。
Windows的異步過程調用(APC)可以滿足這種要求
APC可以讓一個線程在它正常的執行路徑運行之前執行一些其他的代碼。每個線程都有一個附加的APC隊列,它們在線程處于可警告的等待狀態時被處理。
所以只需要將目標進程的線程的APC隊列里面添加APC過程,當然為了提高命中率可以向進程的所有線程中添加APC過程。然后促使線程從休眠中恢復就可以實現APC注入。
?
第四種 設置進程上下文
核心是通過函數SetContextThread
實現注入,像很多方法比如內存注入,通過傀儡進程注入核心都是這個思想。都是掛起線程,然后往內存中寫入shellcode然后,重新設置Context,然后調用SetThreadContext和ResumeThread恢復線程執行。
?
第五種? 反射式注入
反射式dll注入不需要dll文件落地,減少被查殺的風險。首先將需要注入的dll寫入進程內存,然后為該dll添加一個導出函數,利用這個導出函數讓其自動的裝載dll。注射器是將DLL文件寫入目標進程內存。反射裝載器實現的就是模擬dll裝載器裝載dll文件的操作。
反射式注入流程如下:
1、讀入原始DLL文件至內存緩沖區;
2、解析DLL標頭并獲取SizeOfImage;
3、為DLL分配新的內存空間,大小為SizeOfImage;
4、將DLL標頭和PE節復制到步驟3中分配的內存空間;
5、執行重定位;
6、加載DLL導入的庫;
7、解析導入地址表(IAT);
8、調用DLL的DLL_PROCESS_ATTACH;
?
第六種? 輸入法注入
切換輸入法時候,輸入法管理器imm32.dll就會加載IME模塊,這樣就形成了輸入法注入的充要條件。而由于這個Ime文件本質上只是個存放在C:\WINDOWS\system32目錄下的特殊的DLL文件,因此我們可以利用這個特性,在Ime文件中使用LoadLibrary()函數待注入的DLL文件。
?
第七種 全局鉤子注入
利用windows的消息機制,可以在事件發送到os之間設置一條鉤鏈,來鉤取不同的消息,如以下代碼,利用SetwindowsHookEx可以鉤取一個鍵盤消息。并且調用鉤子處理函數來處理這個消息,所達到的效果和dll注入是一樣的(執行dll內部的代碼)
?
第八種? DLL劫持
DLL劫持原理見鏈接??https://blog.csdn.net/liuhaidon1992/article/details/103815868
注入實現見文末鏈接
?
第九種? 注冊表注入
REG注入原理是利用在Windows 系統中,當REG以下鍵值中存在有DLL文件路徑時,會跟隨EXE文件的啟動加載這個DLL文件路徑中的DLL文件。當如果遇到有多個DLL文件時,需要用逗號或者空格隔開多個DLL文件的路徑。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion \Windows\AppInit_DLLs中,os就會自動去加載位于該注冊表的有效的DLL。所以只需要在注冊表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion \Windows\AppInit_DLLs中添加DLL的絕對路徑,并把數值改為1,可以使得所有加載USER32.dll的進程全部加載目標路徑的DLL。
利用AppCertDlls注冊表,將HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls下寫入dll的路徑,可以將此注冊表項下的DLL加載到調用CreateProcess,CreateProcessAsUser,CreateProcessWithLogonW,CreateProcessWithTokenW和WinExec的每個進程中。值得注意的是win xp-win 10 默認不存在這個注冊表項
?
第十種? 掛起線程注入
OpenThread-->SuspendThread-->申請內存-->寫入代碼-->GetThreadContext-->獲取EIP-->修改EIP-->SetThreadContext-->ResumeThread。
?
第十一種? 掛起進程注入
CreateProcess注入方法之一,CREATE_SUSPENDED以掛起的方式打開進程,后面方法與掛起線程注入相似。
?
第十二種? 進程替換技術(進程hollowing)
除了注入之外,我們還可以使用進程替換技術將一個可執行文件寫入一個運行的進程內部,這種技術讓惡意代碼擁有和被替換進程相同的特權,這個技術關鍵是:需要以掛起狀態創建進程,也就是說,這個進程將會被載入內存,但是主線程過去,在外部程序恢復主線程之前,程序不會工作,恢復主線程之后,程序工作。如下代碼是進程替換代碼的偽代碼.該程序通過調用CreateProcess并將進程創建標志設置為CREATE_SUSPENDED(0x00000004)完成。新進程的主線程被創建為掛起狀態,直到ResumeThread函數被調用才會運行。接下來,惡意軟件需要用惡意的有效載荷來替換合法文件的內容。這可以通過調用ZwUnmapViewOfSection或NtUnmapViewOfSection來取消映射目標進程的內存(這一步的目的在于是重新寫入傀儡進程的時候,進程對于這部分待注入的內存還有所有權,為了避免沖突,在重寫入進程之前,需要取消進程對內存的映射)。這兩個API基本上釋放了一個部分指向的所有內存。現在內存被取消映射,加載器執行VirtualAllocEx為惡意軟件分配新內存,并使用WriteProcessMemory將每個惡意軟件的部分寫入目標進程空間。惡意軟件調用SetThreadContext將entrypoint指向已編寫的新代碼段。最后,惡意軟件通過調用ResumeThread來恢復掛起的線程。
CreateProcess(...,"目標進程.exe",CREATE_SUSPENDED);//以掛起狀態創建進程
ZwUnmapviewOfSection()?????????????????????????????//釋放內存,解除內存映射
VirtualAllocEx()???????????????????????????????????//為惡意代碼分配新空間
writeProcessMenory(header)?????????????????????????//寫入數據(文件頭)
for(i=0;i<NumberOfSection;i++)
????WriteProcessMenory(section)????????????????????//寫入節區數據
···
ResumeThread()?????????????????????????????????????//重新啟動主線程
?
第十三種方法? 調試器注入
CreateProcess注入方法之二,DEBUG_ONLY_THIS_PROCESS以調試的方法打開進程,利用CREATE_PROCESS_DEBUG_EVENT,向目標程序中寫入我們的ShellCode完成相應功能,并且我們的ShellCode中寫入以CC斷點,代碼執行指令時觸發EXCEPTION_DEBUG_EVENT事件,在EXCEPTION_DEBUG_EVENT的處理函數中回到原來的執行流程。
?
第十四種方法 導入表注入
靜態注入的方法。修改PE文件,添加一個新節,修改導入表添加一個新的DLL實現注入。
源碼鏈接: https://pan.baidu.com/s/1VeYcCcGvAOW8oxzclf6d4A 提取碼: 9spe?
總結
以上是生活随笔為你收集整理的14种DLL注入技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinHex V14.6 SR-2 注册
- 下一篇: 2022年面试工具篇Jmeter接口面试