您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么逆向分析微軟IFEO鏡像劫持從ring3到ring0的實現機理,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
IFEO(Image File Execution Options )是設置在Windows注冊表中,創建IFEO注冊表項的目的是讓開發人員可以選擇調試他們的軟件,是為了開發人員可以使用注冊表項將任何程序附加到任何可執行文件,但是很多被利用了去實現進程注入。很多只知道ring3的部分機制,但是并不知道完整的機制,今天們就來分析下它的ring3到ring0的整個過程的機理。
開發一個小的test.exe解析命令行,為了方便上調試器調試加上Messagebox 彈框
編譯后,我們可以修改注冊表演示下IFFO
**HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\{name of the executable}**
加個notepad.exe的項目然后添加Debugger的keyvalue
“Debugger”=”{full path to the debugger}”
然后我們在windows左下角搜索框輸入notepad
然后啟動notepad.exe,這時我們的test.exe就會被啟動了
今天的目的就是來分析下這種機制的原理。
把上述代碼繼續改造的MessageBox去掉,加直接啟動notepad.exe的啟動參數里的進程
然后上ollydbg調試運行。
啟動后對CreatPorcessW下斷點輸入命令: bp CreatPorcessW
斷點停下來
繼續F8 然后F7進入
**775F1054 |. E8 22010100 CALL kernel32.CreateProcessInternalW**
通過IDA
查看CreateProcessInternalW前面基本都是一些字符串拷貝的動作
在Ollydbg開始階段就直接F8單步運行過去
接著就是創建環境
這些也直接單步走過,當我們單步到這里的時候
調試器在這里下斷點
然后F8
發現
NtCreateUserProcess(&Process, &ThreadHandle, 0x2000000, 0x2000000, v188, v189, v64, 1, v60, &v194, &v347)
函數的eax的返回值是0xC0000039,也就是說這里調用內核去創建的時候是直接失敗的,
返回值是STATUS_OBJECT_PATH_INVALID
意識就是說路徑對象無效,通過分析第九個參數結構體的數據發現路徑確實沒有任何問題
我們可以做個對比實驗,把IFEO的對應注冊表Debugger刪除后再運行調試
下面是正常情況下把注冊表刪除了后的運行
參數基本一模一樣,然后直接F8 單步運行,結果出現了返回值eax == 0
也就是STATUS_SUCCES,沒有debugger注冊表鍵值的時候NtCreateUserProcess內核返回值是0
,現在我們大致可以猜測內核里也對這個IFEO位置的注冊表鍵值做了處理,為了搞清楚內核如何處理,直接上windbg用虛擬機進行雙機調試,調試內核。
接下來在NtCreateUserProcess上下斷點,當Ollydbg里執行NtCreadtUserProcess
時windbg里斷點停下來
有個最簡單的方法就是不斷的嘗試單步進入函數后單步Call返回值為0xC0000039的函數,最后經過反復的實現發現NtCreateUserProcess內在調用**PspAllocateProcess**
函數時返回0xC0000039
在fffff800`0412651f 出下斷點
運行后斷下
調試器停在了call nt!PspAllocateProcess (fffff8000412852c)
,F10 后查看eax值r eax
,顯示
也就是說在這個函數里可能會涉及處理注冊表的過程,用ida打開ntkrnlmap.exe的內核文件,慢慢查看會發現有這么一段代碼
在這段代碼里判斷IFEOKEY 是否有對應Debugger注冊表設置,往上面翻會發現IFEOKey打開的就是當前進程名的IFEOKey的注冊表
RtlpOpenImageFileOptionsKey
調用了RtlpOpenBaseImageFileOptionsKey
,RtlpOpenBaseImageFileOptionsKey
會ZwOpenKey IFEO
注冊表
為了驗證我們的結果,在RtlQueryImageFileKeyOption
函數下斷點
進入 RtlQueryImageFileKeyOption
函數單步執行到ZwQueryValueKey
時,F10后
查看rsi里的值
會發現此時讀取到Debugger的設置注冊表,然后返回到調用之前的下面一句指令:
判斷eax是否是0,此時函數返回值就是0,然后就進入了
mov r12d,0xC00000039h
最后把 r12d 賦值給了eax返回
就是最后我看到創建進程失敗了,錯誤號0xC00000039
當前者失敗后,ring3 層就進入了
76B4F75F . FF15 5006B176 CALL DWORD PTR DS:[<&ntdll.LdrQueryImageFileKeyOption>] ; ntdll.LdrQueryImageFileKeyOption
函數去讀取IFEO的Debugger注冊表
獲取了數據后,解析參數成功后就把當前進程的路徑加載Debugger對應的進程后面作為一個參數組合成一個啟動進程參數
在上圖可以看到兩個路徑被加到一起。構造的的新參數就是
UNICODE "C:\Users\Administrator\Desktop\test.exe C:\Windows\System32\notepad.exe"
最后goto LABEL_87
重新組建進程參數環境去執行新的進程,又會進入NtCreateUserProcess
,但這時啟動的是test.exe
這時返回值就是0了,創建成功
至此整個過程就分析完畢了,微軟的IFEO機制本來是給開發人員調試程序用的,后來慢慢被惡意軟件用來鏡像劫持,在微軟的官方msdn里有一段描述說使用DEBUG_ONLY_THIS_PROCESS和DEBUG_PROCESS方式 CreateProcess時是不會讀取注冊表去劫持的,而實際測試時確實如此,具體原理讀者可以自行分析。 特別申明:逆向分析調試是一種武器,切莫用于非法途徑。
上述內容就是怎么逆向分析微軟IFEO鏡像劫持從ring3到ring0的實現機理,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。