2014-12-30 82 views
0

中的Pandex的分析文章中,我已經閱讀了以下內容:IRP_MJ_DEVICE_CONTROL隱藏進程?

"The driver export its device object to user mode through symbolic link 
    path \\.\Runtime. 
    It implements functionality to hide a process through its IRP_MJ_DEVICE_CONTROL 
    dispatch routine when a user-mode program calls the DeviceIoControl API with 
    process id as the input parameter" 

(注:所提到的驅動程序執行隱形rootkit的活動)

由於「隱形的rootkit活動」和我對司機knwoledge不最好的,我 開始閱讀有關Windows中使用的整個驅動程序概念的文件。

因此,我收集以下內容(我嘗試用我的話來解釋整體,然後我會問這個問題): 例如,如果應用程序需要來自設備的數據,則它會聯繫os,os聯繫驅動程序,驅動程序知道如何與設備進行通信,因此驅動程序將所需的數據傳遞給將其傳遞給應用程序的os。 因此,驅動程序堆棧處理IRP請求。設備對象代表設備。一個或多個設備對象與設備相關聯。它們是設備上所有操作的目標。

所以現在,如果他們說它「將設備對象導出到用戶模式」,那麼我必須問: a)他們是如何完全做到的? b)將設備對象導出到用戶模式也意味着我現在可以從用戶模式應用程序訪問它,對吧? (通常不可能)

關於第二部分,特別是關於IRP_MJ_DEVICE_CONTROL,我知道是由I/O管理器發送的。但究竟是什麼呢?以及他們如何使用它來隱藏進程? 我還讀了這個IRP_MJ_DEVICE_CONTROL是代表已調用DeviceIoControl函數的用戶模式應用程序 發送的。 關於DeviceIoControl我讀過它允許應用程序直接與設備通信。因此,它會發送代表要執行的操作的控制代碼。 他們說,它通過將進程ID添加到DeviceIoControl來隱藏進程。

但是,他們又如何隱藏進程......?

PS:我會說,他們所說的「功能」(在分析中沒有解釋)需要隱藏的一部分,但我不知道他們爲什麼把整個IRP_MJ_DEVICE_CONTROL等

所以,我會高興,如果有人告訴我,整個事情是如何工作的,使得司機的概念使得在這種情況下,感...

最好的問候,

+0

驅動程序如何隱藏進程不在該報價中討論。 – eryksun

+0

符號鏈接用於打開設備的句柄。 (例如,對象命名空間中的C:驅動器的符號鏈接「\ Global ?? \ C:'指向實際設備,例如'\ Device \ HarddiskVolume1'。)Win32'DeviceIoControl'用於發送目標進程ID。這將調用系統函數'NtDeviceIoControlFile',如果驅動程序實現它,則可以使用快速I/O,否則將'IRP_MJ_DEVICE_CONTROL'數據包排隊並分發給驅動程序。 – eryksun

回答

0

爲了讓後面的用戶,土地的想法,並內核土地,我建議你閱讀下面的文章https://msdn.microsoft.com/en-us/library/windows/hardware/ff554836(v=vs.85).aspx,我建議也讀這篇文章https://msdn.microsoft.com/en-us/library/windows/hardware/hh439638(v=vs.85).aspx以瞭解有關I/O的一般信息。

現在要回答你的第二個問題,隱藏一個過程可以通過幾種方法完成。最常用的是:

  • DKOM(直接覈對象操作):要正確理解它是如何工作的,你需要了解如何在Windows進程列表中的一般工作。這取決於在MSDN中未記錄的EPROCESS結構。 EPROCESS結構是一個不透明的結構,用作進程的進程對象。每個EPROCESS位於每個進程的內核內存中。這樣的結構應該看起來像這樣enter image description here 因此,此處感興趣的結構成員將是ActiveProcessLink,其類型爲LIST_ENTRY。從這裏我們可以看到它們是如何相互連接的。此結構的Flink成員指向雙向鏈表中的下一個條目(進程)。 Blink成員指向前一個條目(進程)。要再次正確地演示它,請考慮下圖:enter image description here 現在回到算法101,此時隱藏進程所需的全部內容是將其從雙向鏈表中斷開。我們所需要做的就是將我們要隱藏的進程之前的進程的Flink設置爲我們隱藏進程的Flink。與下一個進程的Blink一樣,該進程被設置爲隱藏進程的Blink

如果您按照前面的2個鏈接並儘可能清晰地閱讀所有內容,您將會明確地瞭解如何使用前面提到的技術實現進程隱藏。但是,我認爲,現在這應該足夠你了。

注意:我不能聲稱這些數字是我的,我只是根據所討論的主題對它們進行查看,以便爲那些沒有足夠想象力的人提供視覺幫助。