逆向隨筆——對可以過TP的注入驅動的一次逆向

前言:

逆一些東西,有點收穫,就寫篇隨筆記錄一下。因爲寫的隨便,就不發看雪了。
今天一個朋友給我發了一個說是可以過TP的注入驅動,希望我逆一下看看是什麼套路。

正文:

接收過來壓縮包,看了一下
在這裏插入圖片描述
loadddll32和64分別是用在32和64的驅動,MemOpe和dnf.exe都是測試用例(不過我是用自己寫的123.exe進行測試)。

先跑起來,看看線程和模塊上有沒有什麼特別的地方
在這裏插入圖片描述
在這裏插入圖片描述有一個線程Pchunter標紅,而且“模塊”那裏沒有,很可疑,先記下。
進程模塊這裏出現了注入的MemOpe.dll,看來不是內存加載。

爲了減小干擾,先試試把“驅動級別的dll注入器.exe”進程強關了,看驅動還有沒有效果。
測試了下仍可以正常注入。說明整個注入過程全由驅動完成,其加載驅動的exe不參與。

由於是x86sys程序,x64dbg用不上,只好拿IDA
(順便吐槽一下,之前嘗試用windbg動態調試看看。那用的叫一個難受,單步1步,windbg的反彙編窗口卡1秒。watch窗口也看不了一些[ebp-xx]之類的變量數據,可能是我還不會用)

代碼很乾淨,函數很少。在這裏插入圖片描述先看看輸入表。在這裏插入圖片描述
注意框起來的API,看到這幾個api。我想到了ssdt,attach進程,創建線程,設置模塊加載回調,申請r3內存空間。
接下來看看都有什麼操作。
1.和加載驅動的exe通信,獲取目標進程名和要注入的dll路徑在這裏插入圖片描述
2.設置模塊加載回調
在這裏插入圖片描述
再看看回調裏面有什麼東西

3.判斷LoadImage的進程是不是目標進程>>判斷加載的模塊是不是ntdll.dll>>開一個內核線程
注意這個ntdll
在這裏插入圖片描述
再來看看內核線程執行的函數裏面有什麼

4.Attach到目標進程(之前Pchunter看到的標紅線程應該就是這個原因)
取R3和R0的ZwProtectVirtualMemory,ZwWriteVirtualMemory,ZwReadVirtualMemory,ZwQueryVirtualMemory,LdrLoadDll(無R0),ZwTestAlert(無R0) 地址
在這裏插入圖片描述5.往目標進程申請一片full_access內存放shellcode,並對其用到的API地址進行重定位,同時對ntdll!ZwTestAlert下了一個HOOK,用來跳轉到自己的shellcode
(一個進程被Create,ntdll最先加載,再由其加載kernel,user等其他系統DLL。由於ntdll上的線程會經過ntdll!ZwTestAlert這個API,所以對其下Hook來跳轉執行自己的shellcode實現DLL加載)
在這裏插入圖片描述在這裏插入圖片描述
效果圖:在這裏插入圖片描述
在這裏插入圖片描述

總結一下大致流程:

1.目標進程創建>>
2.驅動通過Load_Image回調發現目標進程及其Ntdll>>
3.對其Ntdll線程必經的ntdll!ZwTestAlert下Hook,同時寫入shellcode>>
4.Ntdll線程經過ntdll!ZwTestAlert並跳轉到shellcode>>
5.執行LdrLoadDll加載目標DLL>>
6.DLL注入完成

尾聲:

感謝xjun前輩的指點

(小聲bb一句,這全是破綻的驅動注入能過TP,我覺得TP真是放水了。。。)
說實話,一開始逆的時候。逆到那個Shellcode操作的地方,怎麼都看不明白,還以爲注入是靠的內核線程attach了目標進程,然後親自調用了什麼API才注入的。這裏看不懂,就只能先看其他函數,全部看遍了也沒有相關的API和操作。沒辦法,試試windbg,動態看看對shellcode的操作。。。結果怎麼樣,前面也吐槽了。
最後還是配合着看線程環境(看到注入dll的是ntdll模塊上的線程),看目標進程裏的shellcode才分析出來具體原理。

雖然很想發到看雪,不過拙文一篇,就不去獻醜了。權當是自娛自樂了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章