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

基於 API Hook 的簡易安全防護軟件原理與實現

     編輯:關於C語言

專案概覽

演示一款極簡的主動防禦軟件(HIPS),通過鉤子攔截進程創建、註冊表寫入/刪除等敏感操作,實現基礎的行為阻攔與日誌記錄。核心技術:用戶態 Inline Hook + DLL 注入 + 進程間通訊 (WM_COPYDATA)。

效果展示

防護軟件界面截圖

架構設計

  1. Hook DLL:注入目標進程,Inline Hook 目標 API,攔截時彈窗詢問用戶放行/攔截。
  2. 主程序:加載 DLL、設置/卸載鉤子、接收攔截消息、維護日誌列表、提供用戶交互界面。
  3. 共享內存:用於 DLL 與主程序傳遞攔截信息(進程 ID、操作類型、參數等)。

核心代碼片段

1. 共享數據結構與鉤子入口

// 共享段,實現跨進程數據交換
#pragma data_seg(".shared")
HIPS_INFO g_HipsInfo = {0};
HWND g_hMainWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,RWS")

// 攔截類型
#define HIPS_CREATEPROCESS   0x00000001L
#define HIPS_REGSETVALUE     0x00000002L
#define HIPS_REGDELETEVALUE  0x00000003L

// 通用攔截處理流程
void NotifyMainAndWait(HIPS_INFO *info) {
    COPYDATASTRUCT cds = {0};
    cds.dwData = info->type;
    cds.cbData = sizeof(HIPS_INFO);
    cds.lpData = info;
    // 發送給主程序界面線程
    SendMessage(g_hMainWnd, WM_COPYDATA, GetCurrentProcessId(), (LPARAM)&cds);
    // 等待用戶決定(簡化:此處阻塞,實際應用異步處理)
    while (info->action == ACTION_UNDECIDED) Sleep(10);
}

2. CreateProcessW 鉤子示例

BOOL WINAPI HookedCreateProcessW(
    LPCWSTR lpApplicationName,
    LPWSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCWSTR lpCurrentDirectory,
    LPSTARTUPINFOW lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
) {
    HIPS_INFO info = {0};
    info.type = HIPS_CREATEPROCESS;
    wcscpy_s(info.szPath, lpApplicationName ? lpApplicationName : lpCommandLine);
    NotifyMainAndWait(&info);

    if (info.action == ACTION_ALLOW) {
        return TrueCreateProcessW(...); // 調用原始 API
    }
    SetLastError(ERROR_ACCESS_DENIED);
    return FALSE;
}

3. Inline Hook 類封裝

class CInlineHook {
    BYTE m_oldBytes[5];  // 原始指令備份
    BYTE m_newBytes[5];  // JMP 指令
    PVOID m_pfnOrig;     // 原始函數地址

public:
    CInlineHook(PVOID pfnOrig, PVOID pfnHook) : m_pfnOrig(pfnOrig) {
        // 構建 JMP rel32 指令:E9 xx xx xx xx
        m_newBytes[0] = 0xE9;
        *(DWORD*)(m_newBytes + 1) = (DWORD)pfnHook - (DWORD)pfnOrig - 5;
        memcpy(m_oldBytes, pfnOrig, 5);
    }

    void Hook() {
        WriteProcessMemory(GetCurrentProcess(), m_pfnOrig, m_newBytes, 5, NULL);
    }

    void Unhook() {
        WriteProcessMemory(GetCurrentProcess(), m_pfnOrig, m_oldBytes, 5, NULL);
    }
};

4. 主程序消息處理

LRESULT CMainDlg::OnCopyData(UINT, WPARAM wParam, LPARAM lParam) {
    COPYDATASTRUCT *cds = (COPYDATASTRUCT*)lParam;
    HIPS_INFO *info = (HIPS_INFO*)cds->lpData;

    // 彈窗詢問用戶
    CString msg;
    msg.Format(_T("進程 %u 嘗試 %s\n路徑: %s\n允許?"), 
        wParam, GetTypeDesc(info->type), info->szPath);
    int ret = MessageBox(msg, _T("HIPS 攔截"), MB_YESNO | MB_ICONWARNING);
    info->action = (ret == IDYES) ? ACTION_ALLOW : ACTION_BLOCK;
    return TRUE;
}

擴展方向

  • 增加文件系統操作攔截(CreateFile、DeleteFile、MoveFile)。
  • 實現規則引擎(白名單/黑名單、路徑通配符、數字簽名驗證)。
  • 內核驅動層防護(PsSetCreateProcessNotifyRoutine、CmRegisterCallback、FltRegisterFilter),繞過用戶態繞過技術。
  • 行為序列關聯分析(如:寫入啟動項 + 修改註冊表 + 網絡連接 = 木馬特徵)。

下載地址

完整源碼:百度網盤(提取碼見原文)。

法律與道德提示

本代碼僅供安全研究與教學使用。未經授權向他人電腦注入 DLL、修改系統行為可能違反《計算機信息系統安全保護條例》等法規。實際部署請遵循最小權限原則、簽名驗證、審計日誌完整保存。

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