Jump to content

監視系統調用(syscall) 和分析系統行為可以幫助您調試產品並提高其性能、安全性和合規性。然而,由於缺乏內置工具以及需要逆向工程和應用程序行為分析的專業知識,監視Windows 中的系統調用面臨著挑戰。

在本文中,我們討論在Windows 中監視系統調用的一些核心方法。

監控Windows 中的系統調用:查看內容以及原因係統調用是一種使程序能夠從操作系統內核請求各種類型的服務和任務的機制。系統調用為用戶級程序訪問系統資源提供了一種安全且受控的方式,而不會影響操作系統(OS) 的穩定性或安全性。當執行請求的操作時,系統調用在用戶模式和內核模式之間轉移控制。

系統調用是ring-0/ring-3隔離的標準部分。讓我們仔細看看。

在操作系統中,有兩種代碼環境:以完全權限運行的內核代碼(環0)

以有限權限運行的用戶代碼(環3)

在這些環境之間,有一個系統調用接口。

環0 和環3 之間的劃分(內核級別和用戶級別)是觀察應用程序行為和原始操作的最佳點。當代碼達到系統調用級別時,應用程序無法混淆其操作。例如,如果用戶級代碼秘密調用CreateFile()函數,您仍然可以通過監視系統調用來檢測到這一點,因為您將看到NtCreateFile 系統調用的執行。

對於大多數流行的體系結構,包括x86、AMD64、ARM64 和PowerPC,處理系統調用的方法是相同的:在用戶級別,一組系統API 充當系統調用的包裝器。

在內核級別,內核API 實現系統調用的處理程序並由內核驅動程序使用。

在某些體系結構中,系統調用稱為系統服務。

Windows 中系統調用的常見示例包括:文件輸入/輸出(I/O) 操作,例如讀取或寫入文件

流程管理,例如創建新流程或終止現有流程

內存管理,例如分配內存

進程間通信,例如在進程之間發送或接收消息

設備驅動程序操作,例如向硬件設備發送命令

為什麼您的開發人員需要監視系統調用?

Windows 系統調用監控對於研究多層軟件和分析具有混淆代碼的應用程序的行為至關重要。使用這種方法,您可以確定特定應用程序的行為方式,而無需分析應用程序每個級別的代碼。

監控系統調用的常見原因包括:調試—— 跟踪應用程序中的問題,確定其根本原因,并快速修復錯誤。

性能優化——識別瓶頸並優化有問題的代碼部分以提高整體性能。

安全——檢測可疑的、潛在的惡意行為,並採取措施阻止其發生。

合規性——通過分析應用程序訪問和使用特定類型數據的方式,確保應用程序符合相關要求。

image.png

然而,在實踐中應用這種方法面臨著多重挑戰。它需要深入了解操作系統的細節以及逆向工程和應用程序行為分析的利基知識。在下一節中,我們將根據Apriorit 專家的經驗,討論開發人員在嘗試監視Windows 中的系統調用時可能面臨的關鍵問題。

Windows 中的系統調用監控挑戰與Linux 具有用於監視任何進程中的系統調用的strace工具相比,Windows 由於安全原因沒有用於此任務的內置工具。然而,在Windows XP 之前,任何需要監視或控制用戶級代碼的軟件(例如防病毒軟件)都可以在兩個表中設置掛鉤:

系統服務描述符表(SSDT)

影子系統服務描述符表(影子SSDT)

這些表包含指向處理特定係統調用的內核函數的指針。

在SSDT 和Shadow SSDT 中設置掛鉤會導致大量衝突和不穩定,導致Windows 聲譽受損,並使其看起來像一個不可靠的操作系統。除此之外,rootkit 和病毒還能夠在SSDT 和Shadow SSDT 中設置掛鉤。這就是為什麼微軟被迫阻止對這些表的訪問,並且從Windows XP開始,實施了PatchGuard,也稱為內核補丁保護。從那時起,系統監控工具只能為一小部分內核事件設置回調,這使得系統調用的監控變得非常具有挑戰性。

下面,我們討論如何監視Windows 中的系統調用,並解釋一種安全有效的方法來分析Windows 中的程序行為。

使用XPerf 監控Windows 系統調用在Windows XP 中,Microsoft 引入了Windows 事件跟踪(ETW)機制,用於XPerf工具使用的詳細事件日誌記錄。後者現在是Windows Performance Toolkit的一部分。

一般來說,微軟將ETW 回調放置在整個Windows 子系統中,以便能夠跟踪低級事件。使用ETW,您可以獲取系統事件,因此XPerf 對於監視系統調用也可能很有用。

讓我們看看如何使用XPerf 來監視Windows 中的系統調用。

首先,我們查詢ETW 提供者,看看是否有與系統調用相關的內容:

logman.exequeryproviders在我們從XPerf 收到的信息中,沒有任何看起來像系統調用的內容。轉到TraceView 並監視名稱如Microsoft-Windows-Kernel-* 的內核提供程序事件,也為我們帶來了各種類型的內核事件,但沒有有關係統調用的結果。

下一個可能性是使用SystemTraceProvider一個跟踪內核事件的內核提供程序。將這個提供程序的GUID 添加到TraceView 後,我們仍然沒有結果。

為了尋找設置掛鉤的可能替代方案,我們嘗試了不同的方法來監視Windows 中的系統調用,包括通過虛擬機管理程序掛鉤SSDT 函數以及使用Windows 事件跟踪的未記錄部分。

使用Syscall Monitor 和InfinityHook 監控Windows 系統調用為了尋找替代解決方案,我們決定研究一下記錄較少的監控系統調用的方法。

免責聲明:以下操作僅用於研究目的。

在研究了幾種可能性之後,我們在GitHub 上發現了兩個有前途的項目:系統調用監視器

無限鉤

讓我們從測試Syscall Monitor 工具開始。該項目使用虛擬機擴展通過虛擬機管理程序掛鉤SSDT 功能。該方法本身有效,使得監視Windows 中的系統調用成為可能。不幸的是,作者決定實現該工具作為ProcessMonitor的替代品。因此,Syscall Monitor 的能力有限,只能監控一小部分系統調用:

image.png屏幕截圖1. 使用Syscall Monitor 的結果

總而言之,Syscall Monitor 是一個很好的工具,可以幫助您開始研究SSDT 掛鉤,但如果您想監視圖形設備接口(GDI) 系統調用等內容,則該工具就沒用了。

現在,讓我們繼續測試InfinityHook 工具的使用。根據該工具的描述,在使用它之前,您需要了解ETW的基礎知識。

為了監視Windows 中的系統調用,InfinityHook 在系統調用處理程序的內核代碼中使用ETW 跟踪的未記錄部分。值得注意的是,該項目無法輕鬆地開箱即用,我們必須在設法運行代碼之前實現一些細微的更改。然而,結果我們得到了BSOD:

image.png屏幕截圖2. 使用InfinityHook 工具的結果

從上面的屏幕截圖中可以看到,我們收到一條錯誤消息,內容為“停止代碼:KERNEL_SECURITY_CHECK_FAILURE”。此消息意味著內核補丁保護已被觸發。顯然,最新版本的Windows 保護內核ETW 提供程序回調免受修改,因此為了監視Windows 系統調用,我們需要禁用PatchGuard。

在Windows 10 中禁用PatchGuard 的一種方法是使用EfiGuard項目。按照GitHub 的說明,我們使用軟盤映像啟動Windows 10 的VMWare 實例,用於此類研究和實驗:

image.png

屏幕截圖3. 使用EfiGuard 工具的結果

我們嘗試了幾種不同的驅動程序簽名強制繞過方法,但結果仍然相同- 我們仍然遇到由內核補丁保護觸發的BSOD。經過進一步調查,我們確定EfiGuard 在不同的Windows 版本上成功運行- 具體來說,Windows 10 版本1511。

然後,我們創建了一個新的VMWare 映像,並在其上安裝了Windows 10 build 1511,並嘗試使用EfiGuard 再次禁用PatchGuard。這一次,我們的嘗試成功了,我們終於成功運行了InfinityHook項目。 InfinityHook 使用DbgPrint()

函數打印有關來自驅動程序的系統調用的信息。因此,我們需要使用DebugView工具來查看其日誌。

image.png屏幕截圖4. InfinityHook 中的系統調用監控結果

從上面的截圖可以看出,InfinityHook提供了以下數據:系統調用索引

EPROCESS值

系統調用的堆棧指針

索引超過4000 的系統調用是GDI 調用。為了正確地將索引映射到系統調用的名稱,您需要知道與您的計算機運行的內核版本相關的系統調用索引。您還可以嘗試使用互聯網上提供的系統調用表之一進行進一步研究。

然而,由於這種方法需要額外的努力,我們嘗試尋找一種更方便、更安全的方法來監視Windows 中的系統調用。在下一節中,我們將詳細討論如何使用DTrace 來監視Windows 系統調用。

使用DTrace 監控Windows 系統調用DTrace是一個動態跟踪框架,允許開發人員在用戶模式和內核模式下實時分析系統行為。該框架最初由Sun Microsystems 為Solaris 操作系統開發,後來移植到其他類Unix 操作系統,例如macOS和Linux。

目前,微軟還支持DTrace,使開發人員和軟件研究人員能夠監控從Windows 10 Build 1903開始的64位平台上的系統調用。但是,該工具只能捕獲64位進程的痕跡。

GitHub 上的DTraceon Windows頁麵包含有關如何安裝它的易於遵循的說明,因此我們將在概述中省略這部分。

默認情況下,系統將DTrace 放置在C:\Program Files\DTrace文件夾中。要使用它,您需要以管理員身份運行以下命令:

dtrace-lnsyscall:運行此命令後,DTrace 應打印系統中可用於監視的系統調用列表。

注意:每個系統調用都會打印兩次,因為您可以監視系統調用參數及其返回值。

接下來,運行以下用D語言編寫的腳本繼續進行系統調用監控:

syscall:/pid==9140/{printf('%scalled\n',execname);}這個特定的腳本打印PID=9140 的進程的所有系統調用。通過更改PID,您可以監視您感興趣的任何其他進程的系統調用。

將腳本保存為test.d 文件,然後您可以使用簡單的命令運行它:

Dtrace-stest.d要了解其工作原理,讓我們運行記事本腳本。我們收到以下結果:

image.png

屏幕截圖5. 使用DTrace 監控記事本系統調用

您可以隨時按Ctrl+C停止使用DTrace 監視Windows 系統調用。

要了解有關使用DTrace 腳本和可能的系統監控方法的更多信息,您可以探索Microsoft 在DTrace GitHub 頁面上提供的示例。

結論監視系統調用可以提供有關應用程序行為和性能的寶貴見解,從而幫助開發人員創建更可靠、更高效、更安全的應用程序。要監視Windows 中的系統調用,可以使用Microsoft 官方支持的DTrace 實現。

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...