通過逆向PCHunter驅動學習64位 windows內核之 精準定位

2021-02-19 看雪學院

首先感謝下PCHunter的作者提供了這麼優秀且還是免費的內核工具。

這次逆向是我在科銳學習32位內核課程後,練手的小項目,感覺自己寫得比較用心的,所以作為自己的首貼逆向貼,發布到看雪上來,與大家分享一下。

這篇作為第一篇,主要內容是通過分析PCHunte3環請求到0環的通信協議內容,來精準定位PCHunter驅動功能相關函數,之後的篇幅會在此基礎上,逐篇分析PCHunter的各項內核功能的實現。

---

樣本名:PCHunter64ao.sys (之後簡稱樣本)

版本號:1.0.0.5

樣本來源:PCHunter64.exe 釋放的驅動文件

調試環境:host:  win7_64 + IDA + VirtualKd

                 dest:  WMware(win7_64)


當前樣本模塊加載基址:

PCHunter64ao.sys  FFFFF88003400000 00000000000C0000

nt                              fffff800`03e00000 fffff800`043ea000

因為雙機調試環境搭建相關的帖子很多,所以略去。

在調試目標機開啟PCHunter前, IDA載入樣本PCHunter64ao.sys。


概述:

經過IDA分析之後,得知樣本函數數量規模,大於等於1004個。

我的首要任務是解決在這眾多的函數中,如何找到我們要分析的功能?

根據自己開發驅動的經驗,功能較多的驅動服務中,3環應用程式一般使用DeviceIoControl函數,通過其提供的控制碼功能,來實現與0環的功能請求通信,0環則通過派遣回調函數表對應的 IRP_MJ_DEVICE_CONTROL 項中,3環傳入的控制碼來實現用戶請求功能的區分和功能向下派發。

但是在實際分析過程中我發現,PCHunter 3環所有的用戶請求控制項碼都是同一個,樣品並沒有使用常歸的通信手法,難道另闢蹊徑或是加密了?

之後經過一系列努力,最後發現作者確實是在設備控制的基礎上,又實現了一套自己的3環與 0環通信協議,並對協議作了加密,解密後的內容中又發現了動態與靜態的2處校驗碼。

至此心中對作者又升起一股由衷的敬意。一款免費的驅動工具,作者卻一點也不馬虎。

下面開始具體介紹菜鳥分析挑戰之旅(大神老鳥可以略過)。

---

通過IDA很快找到樣本入口處,也就是DirverEntry,F2設置斷點,在目標機中打開PCHunter工具,於是IDA中斷下來了。

如下圖所示:


此時我已經有了pDriverObject對象指針

WINDBG>dt nt!_DRIVER_OBJECT

    +0x000 Type             : Int2B

    +0x002 Size             : Int2B

    +0x008 DeviceObject     : Ptr64 _DEVICE_OBJECT

    //略

    +0x068 DriverUnload     : Ptr64     void

    +0x070 MajorFunction    : [28] Ptr64     long

下一目標是要找到 pDriverObject+0x070 位置的寫入,也是註冊其成員派遣函數表的代碼。

根據結構體信息參照,從入口向下,不遠處就看到了關鍵位置,如下圖所示:


設備控制回調下標宏是 IRP_MJ_DEVICE_CONTROL,是第14項

計算偏移等於 0x70+8*14= 0xE0,由此可以斷定圖上第二個紅框就是設備控制回調函數註冊的地方,對其進行命名。

鑑於0環和3環的通信常規是用控制碼,下一步目標就是進入設備控制派遣函數中分析3環傳來的控制碼。

經過對該函數中第二個參數,IRP結構體的反覆校驗後,得到了通信控制碼,並且找到SystemBuffer及它的長度校驗位置。在此一併進行了標記,

如下圖所示:

signed __int64 __fastcall DispatchDeviceControl(__int64 pDevObj, _IRP *pIRP)

但是當我回到目標機器,多次刷新不同的PCHunter功能後,發現中斷下來的控制碼全部相同,此時斷定了其採用的是統一通信控制碼,並且在之後對這個固定通信控制碼作合法校驗,如果不等於此校驗碼就提前結束函數。

于是之前的思路就走不通了,剩下還有一種可能,就是它的功能是通過3環傳的IOBuffer內的數據來區分用戶功能請求的。

接著向下分析發現,發現了對3環傳入的 IOBuffer 的操作相關代碼:



這段彙編代碼是個循環,循環內逐字節的先作異或再求反的動作,疑似在做解密。

於是乎,我在此位置下斷,並通過在3環反覆操作PCHunter相同和不同功能,得到多份解密後的內容,經過分析比較後得出結論:

PCHunter確實是通過3環傳入0x30位元組的IntputBuffer實現通信協議的,

下面是總結後的通信協議相關欄位的功能:

解密後的請求協議內容:


接著向下分析,


樣本在完成通信協議內容解密後,先用前4位元組作為固定籤名,用以驗證3環請求調用者的身份。

之後是校驗協議中的動態校驗碼:


在用戶請求動態校驗成功後,再對 (請求功能號作 -0Fh + 90Dh)*8 的運算,運算結果就是服務功能函數的相對分發基址(g_srvfn) 的偏移, 通過全局服務請求函數信息指針加上該偏移,就能找到實現服務請求的相關功能函數,再調用此函數就實現了3環用戶請求的向下派發,如下圖所示:


對應的得出用戶請求功能處理偽函數聲明信息:

函數指針聲明:

__int64 (__fastcall *)pfnSrvFunc(pIndata,IndataSize,pRetBuf,RetBufSize);

函數指針偏移:偏移 =  (用戶請求號 - 0Fh +90Dh) * 8   ;

相關功能函數地址:在rax中

在用戶請求功能處理函數執行完後,用戶請求的操作結果和數據返回在協義的相關欄位,

如Retbuffer中。

到此,如何定位PCHunter用戶層相關功能請求的處理函數就分析完了,之後再分析PCHunter其它功能,就只要在上圖紅框處下斷點 (請求功能向下派發處 ),觀察用戶層操作之後,通信協議中的功能號 和 傳入傳出的buff數據,就能精準定位PCHunter驅動功能的實現代碼。

本文由看雪論壇 hjbfa 原創

轉載請註明來自看雪社區

往期熱門閱讀:

掃描二維碼關注我們,更多乾貨等你來拿!



相關焦點

  • 詳解Windows滲透測試工具Mimikatz的內核驅動
    Mimikatz通過其中包含的Mimidrv驅動程序,提供了利用內核模式的功能。Mimidrv是已經籤名的Windows驅動模型(WDM)內核模式軟體驅動程序,在相關命令前加上感嘆號(!)即可與標準Mimikatz可執行文件共同使用。Mimidrv沒有相應文檔,並且很少被人使用,但它卻提供了一個非常值得關注的方式,讓我們可以在ring 0執行一些操作。
  • Linux 內核學習:環境搭建和內核編譯
    實際上,選擇哪種發行版都關係不大,發行版之間的差別基本上都是外圍組件,對linux的內核的修改都不會很多。況且我們在學習linux內核,或者開發linux驅動時,一般都是以官方內核(即Linus維護的主線內核)為基準.所以我們搭建好環境後幾乎都是要選擇一個版本的官方內核來重新編繹以備用的。
  • Windows內核驅動程序靜態逆向之套路方法
    編者按:這是一篇講解Windows內核驅動逆向分析之套路方法的好文,可以幫助大家奠定逆向分析木馬驅動文件的基礎,具有很強的指導性。通過此文,理清思路,掌握固定模式的逆向分析套路,方便大家按圖索驥。攻擊者在驅動程序中得到了一些新的攻擊維度,無論是通過傳統的漏洞利用原語,還是濫用合法的驅動程序功能,這些都無法在用戶模式中實現。隨著Windows安全性的不斷發展,研究內核模式驅動程序中的漏洞利用對於我們的攻防技術而言變得越來越重要。為了輔助分析這些漏洞,我認為比較重要的一件事是,我們需要在研究中探尋內核漏洞,並找到一些值得關注並且可以濫用的功能。
  • Linux內核學習:簡單的字符設備驅動
    學習Linux內核最好的入門方式之一是從字符設備驅動開始模仿(來自於《奔跑吧 Linux內核——入門篇》)。對於我們日常生活中存在的大量設備,如攝像頭,USB充電器,藍牙,Wi-Fi等,這些設備在電氣特性和實現原理均不相同,對Linux系統來說如何抽象和描述他們呢?Linux很早就根據設備共同特徵將其劃分為三大類型:1,字符設備;塊設備;網絡設備。
  • 全面揭秘64位ARM A57內核先進技術細節
    打開APP 全面揭秘64位ARM A57內核先進技術細節 電子大兵 發表於 2012-11-06 14:47:52   電子發燒友網訊【 翻譯/David 】:上周三(10月31日),ARM在ARM Tech Con(ARM技術大會)上首次披露了高端64位Cortex A57核心,旨在移動功率電路中提供最大限度的性能
  • Intel新年首款核顯驅動發布:僅支持Windows 10 64位
    Intel今天放出了2019年的第一版核芯顯卡驅動25.20.100.651,但是僅僅支持Windows 10 64位系統(而且僅限v1709/v1803/v1809),沒有Windows 8.1、Windows 7,也沒有三個系統的32位版本。
  • Windows10 64位版本的最佳頁面文件大小是多少?
    Windows和Windows Server的64位版本比32位版本支持更多的物理內存(內存),但是,配置或增加頁面文件大小的原因沒有改變。它始終是在必要時支持系統故障轉儲,或者在需要時擴展系統提交限制。
  • 一個XP使用者眼中的Windows 7-Windows 7,XP ——快科技(驅動之家...
    (註:默認情況下任務欄在底部,沒有底部dock模擬)一、安裝與初感受昨天花了3小時下載了32位windows 7的鏡像,在硬碟裡拼命擠出30G空間(實際上並不需要這麼多安裝過程大概花了40分鐘,windows 7自帶我電腦所有硬體的驅動,所以安裝完後即可使用。這是windows 7給我的硬體的評分:
  • Windows 10 變身開發者利器:內置 Linux 內核,人人可用,像安裝驅動...
    微軟的開發者博客剛剛公布 [1] ,下一個 Windows10 版本,不僅自帶 Linux 內核,而且還會通過 Windows Update 安裝方式更新,簡單得就像安裝驅動程序一樣。WSL1 是通過轉換層,對系統調用還要做翻譯;而 WSL2 則包含自己的 Linux內核,具有完整的系統調用兼容性,比如像 Linux 版本的 Docker 這樣的開源程序,就可以直接調用。 WSL2 是在 2019 年 6 月的 微軟 Build 大會上宣布的,到這次即將要達到的人人可用的狀態,花了接近一年的時間。
  • 關鍵的Windows內核數據結構一覽(上)
    在我們的「Windows internals and debugging」課程中,學生經常會問我們這樣的一些問題:Windows內核使用哪種數據結構來實現互斥量?本文試圖通過描述Windows內核和設備驅動所使用的一些關鍵數據結構來回答這樣的問題。 本文重點強調了系統中各種數據結構的關係,幫助讀者在內核調試中進行導航。
  • 基於 GDI 對象的 Windows 內核漏洞利⽤
    0x02 內核池內核池的類型內核池可類⽐於⽤戶態下的堆內存,不同之處在於它是在內核態中使⽤的。內核池的分配通過查看 Win32AllocPool() 函數我們可以知道內核是如何分配分⻚池對象的(類型參數為 0x21)。
  • 應急響應中分析64位惡意dll的小故事
    作為一名沉迷於安全技術的小白,近期在對公司一臺Win7客戶主機進行安全應急響應時,捕獲到一個64位dll形式的惡意程序,於是對其展開分析
  • Offset2lib 攻擊繞過 64 位 Linux 內核防護
    安全研究人員Hector Marco發布公布了針對64位Linux內核的ASLR防護的繞過,slide和論文提供下載,這種攻擊被稱為offset2lib,ASLR的實現是在Linux內核裡,而在
  • Linux2.6內核驅動移植參考
    作者:晏渭川 隨著Linux2.6的發布,由於2.6內核做了教的改動,各個設備的驅動程序在不同程度上要 進行改寫。為了方便各位Linux愛好者我把自己整理的這分文檔share出來。該文當列舉 了2.6內核同以前版本的絕大多數變化,可惜的是由於時間和精力有限沒有詳細列出各個 函數的用法。
  • Ubuntu中升級Linux內核
    新內核4.2有哪些改進:  ●重寫英特爾的x86彙編代碼  ●支持新的ARM板和SoC  ●對F2FS的per-file加密  ●AMD GPU內核DRM驅動程序  ●對Radeon DRM驅動的VCE1視頻編碼支持  ●初步支持英特爾Broxton Atom SoC
  • Linux-5.6.6 內核引導
    3. core image的初始化代碼將剩餘的core image(包含GRUB 2的內核代碼和文件系統驅動)加載到內存中,運行grub_main。內核自帶bootloader,但是新版本內核已經棄用。kernel boot protocol規定,bootloader必須具備協議中規定的頭信息。
  • 通過洩漏KVA SHADOW映射破壞Windows KASLR(下)
    Windows中的PML4隨機分配如前所述,PML4表是64位內存模型中的最高分頁級別,在Windows中,僅通過使用最低的0x100條目(256)來映射用戶內存,而使用最高的0x100條目來映射內核內存,此表用於分隔用戶和內核內存
  • 芯旺微電子發布KungFu內核架構32位MCU
    中新網12月23日電 日前,在深圳國際電子展上,芯旺微電子推出首款基於KungFu(功夫)內核架構的32位MCU,將高端晶片國產化關注度推向新的高度。KungFu32基於16位/32位混合指令的高效指令集,採用單周期32X32 MAC單元、單周期16 X 16的雙MAC單元、最多支持8個64位 ACC累加操作、32÷32硬體除法器,支持定點小數MAC操作、32位桶形移位器、DSP運算指令支持音頻/視頻單指令多數據操作、支持DO循環指令,實現自動循環程序,減少指令開銷,提高指令執行效率。
  • 沒有印表機驅動怎麼辦?
    之前朝愚發過一個印表機如何驅動,後來朋友打電話說,你發了印表機共享,不發印表機安裝,我咋共享?今天朝愚在這裡說幾種安裝印表機驅動的方法。一、安裝驅動精靈、驅動人生、360驅動大師等驅動軟體,讓其自動識別進行安裝。二、按照印表機品牌進行安裝。
  • Linux內核學習與問題定位,這個工具一定要掌握
    在Linux作業系統上有一個非常有用的工具,無論是進行深層次的問題定位,還是進行Linux內核代碼的學習,使用該工具都能達到事半功倍的效果。今天我們就介紹一下這個工具及其用法。其實ftrace不僅僅用於進行函數調用的跟蹤,其它很多內核信息都可以通過該工具進行跟蹤。除了上面函數調用跟蹤外,ftrace 還能幫我們分析內核特定的事件,比如調度,中斷等;它還能幫我們去追蹤延遲,比如中斷被屏蔽,搶佔被禁止的時間,以及喚醒一個進程之後多久開始執行的時間等等。