譯者:知道創宇404實驗室翻譯組
原文鏈接:??nh d?ng c? s? d? li?u c?a Windows Defender
Windows Defender (WD) 是一款集成于 Windows 10 和 11 中的惡意軟件防護產品。隨著時間的推移,WD在與Windows在發展過程中展現出了其在檢測和阻止個人計算機不同類型的惡意軟件的有效性。在本文中,我們將探討WD使用的數據庫結構(CSDL),以提取其中的數據以更深入了解該CSDL的格式以及其中的一些識別標志類型。
1.Windows Defender數據庫文件結構
通常,個人計算機上的WD版本將有4個擴展名為.VDM的CSDL文件和一個負責加載和使用這些CSDL的dll文件。這些文件將存儲在%ProgramData%\Microsoft\Windows Defender\Definition Updates[GUID]路徑下。主要是:
- mpasbase.vdm:AntiSpyware 模塊的數據庫
- mpasdlta.vdm:更新到 AntiSpyware 數據庫
- mpavbase.vdm:防病毒模塊的數據庫
- mpavdlta.vdm:更新防病毒數據庫

VDM 文件本質上是包含資源(一種特殊類型的 DLL)的 DLL 文件,Microsoft 通過它在不同程序之間來共享數據源。這些DLL不包含任何可執行代碼,只包含PE文件的頭部和資源中的數據部分。WD 使用的數據庫的主要內容位于名為 RT_RCDATA 的資源中。

這個資源是有結構的數據段,其中一部分頭部數據包含以下字段:
typedef struct _RMDX_HEADER {
ULONG Signature; //0
ULONG Timestamp; //4
ULONG Unknown1; //8
ULONG Options; //12 (0C)
ULONG Unknown2; //16
ULONG Unknown3; //20
ULONG DataOffset; //24 (18)
ULONG DataSize; //28 (1C)
//incomplete, irrelevant
} RMDX_HEADER, *PRMDX_HEADER;
已知的一些字段在結構中包括:
- Signature:4字節的‘RMDX’;
- Options:包含CSDL的屬性,目前提取CSDL僅支持帶有壓縮屬性的vdm文件;
- DataOffset:指向使用zlib壓縮的數據部分的偏移量;
- DataSize:壓縮數據段的大小。
DataOffset指向的數據包含壓縮數據大小及壓縮數據的信息的結構。根據這兩條信息,我們可以解壓VDM中的CSDL,來研究其內部內容。
typedef struct _CDATA_HEADER {
ULONG Length; //0
ULONG Unknown1; //4
union { //8
BYTE Data[1];
ULONG Unknown2;
} u1;
} CDATA_HEADER, *PCDATA_HEADER;

解壓后的數據可以作為包含結構化簽名元素的數據數組來集成進行讀取:
struct {
uint8_t sig_type;
uint8_t size_low;
uint16_t size_high;
uint8_t value[size_low | size_high << 8];
} sig_entry;
sig_type是這個簽名元素的數據類型,結合size_low和size_high,可以得到包含簽名的數據段的大小,也就是該元素中剩余的數據大小。可以看出,每個簽名的大小并不是固定的,需要依靠當前元素的大小來確定下一個元素。新解壓的 VDM 數據示例:

第一個簽名:
- 簽名類型:0x5c
- 大小:0x1e
- 簽名數據:大小為 0x1e 的數組(45060000…..24000400)
接下來是第二個簽名:
- 簽名類型:0x40
- 大小:0x45
- 簽名數據:大小為 0x45 的數組(04000103…..fe00000000)
……
簽名類型是根據 mpengine.dll 中的函數確定的。該函數接收 sig_type 值進行輸入,然后返回與接收到的 sig_type 對應的字符串。

sig_type 字段的數據類型為 uint8,因此值從 0 到 0xff。然而并不是每個值都對應一個簽名類型,有些值會被分配“SIGNATURE_TYPE_UNKNOWN”類型。有效的簽名類型大約有158種,但大多數數據庫并不包含所有這些簽名類型,只包含50到100種簽名類型。

2.VDM數據庫中的一些簽名類型
在本節中,我們將探討某些類型的 sig 如何存儲在 VDM 文件中。在讀取VDM文件之前,mpengine會通過AutoInitModules::AutoInitModules函數初始化模塊。

module_list 變量是一個模塊結構數組,包括描述、初始化函數、清理函數和包含標志 0 或 1的 QWORD。

當前版本中,有399個不同的模塊,其中159個模塊的flag為1,其余模塊的flag為0,每個模塊的構造函數都可以設置回調進行處理,每種類型的簽名都對應。

2.1 SIGNATURE TYPE THREAT BEGIN
Signature類型SIGNATURE_TYPE_THREAT_BEGIN將由threatmgr模塊處理。


每個SIGNATURE_TYPE_THREAT_BEGIN元素都包含有關特定威脅的描述。該元素的數據結構如下所示:
struct THREAT_BEGIN
{
char unknow_metadata[0xa];
unsigned __int16 nameSize;
char name[name_size];
// unknow data
}
每個SIGNATURE_TYPE_THREAT_BEGIN之后的簽名元素將是此威脅的多個其他類型的簽名。當遇到一個具有SIGNATURE_TYPE_THREAT_END形式的簽名元素時,其范圍將被確定。
如:可以理解VDM文件中的以下數據描述了一個名為MonitoringTool:Win32/ActiveKeylogger 的行為,其中包括2個類型為PEHSTR_EXT的簽名。

2.2 SIGNATURE TYPE PEHSTR
Signature類型 PEHSTR 和其他一些類型由 cksig 模塊處理。

cksig_init_module 函數將調用 pattsearch_init,然后注冊回調(hstr_push、hstr_pushend_common),以在這些簽名開始加載后調用此類型簽名的函數。

可以將每個PEHSTR元素暫時視為以下結構化數據:
struct string_data
{
WORD reversed0;
char string_size;
char str[1];
} string_data;
typedef struct PEHSTR
{
WORD count_1;
WORD count_2;
WORD count_3;
char reversed_0;
string_data s_data[1];
} PEHSTR, *PPEHSTR;
每個 PEHSTR sig 可以粗略地理解由多個不同的字符串組成,如下所示:

對于只使用PEHSTR模式來識別惡意代碼的威脅,我們可以知道windefender的惡意代碼的檢測標志,將其用于增強檢測規則或尋找方法來隱藏這些字符串,來避免在靜態簽名掃描中被Windows Defender檢測到。

還有很多結構比較復雜的標志需要進一步研究,以下是一個從vdm文件(mpengine版本1.1.20200.4,db版本1.387.0.0,然后用WDExtract解壓)中提取數據為data.csv格式的腳本,供大家參考參考。
3. 參考鏈接
- https://github.com/commial/experiments/tree/master/windows-defender/VDM
- https://github.com/hfiref0x/WDExtract
- https://github.com/taviso/loadlibrary
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/3045/
暫無評論