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

// 共享段,實現跨進程數據交換
#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);
}
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;
}
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);
}
};
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)。完整源碼:百度網盤(提取碼見原文)。
本代碼僅供安全研究與教學使用。未經授權向他人電腦注入 DLL、修改系統行為可能違反《計算機信息系統安全保護條例》等法規。實際部署請遵循最小權限原則、簽名驗證、審計日誌完整保存。