• 最简单的安全防护软件


    别的先不说,上图来看看效果。

    一、说明

    本软件通过对CreateProcessW、RegSetValueExW、RegDeleteValueW等和创建进程、修改和删除注册表键值的行为进行拦截,从而达到一种安全防护的目的。这里拦截的内容比较少,大家可以根据自己的需要进行拓展。

    二、主要代码

    1、动态链接库部分代码

    #include "InlineHook.h"
    
    #define HIPS_CREATEPROCESS    0x00000001L
    #define HIPS_REGSETVALUE    0x00000002L
    #define HIPS_REGDELETEVALUE 0x00000003L
    
    CInlineHook RegSetValueExWHook;
    CInlineHook CreateProcessWHook;
    CInlineHook RegDeleteValueWHook;
    HINSTANCE g_hInst = NULL;
    
    typedef struct _HIPS_INFO
    {
        WCHAR wProcessName[0x200];
        DWORD dwHipsClass;
    }HIPS_INFO, *PHIPS_INFO;
    
    #pragma data_seg(".shared")
    HHOOK g_hHook = NULL;
    HWND g_ExeHwnd = NULL;
    #pragma data_seg()
    
    #pragma comment(linker, "/.shared,RWS")
    
    extern "C" __declspec(dllexport) VOID SetHookOn(HWND hWnd);
    extern "C" __declspec(dllexport) VOID SetHookOff();
    
    BOOL WINAPI MyCreateProcessW
    (
     LPCWSTR lpApplicationName,
     LPWSTR lpCommandLine,
     LPSECURITY_ATTRIBUTES lpProcessAttributes,
     LPSECURITY_ATTRIBUTES lpThreadAttributes,
     BOOL bInheritHandles,
     DWORD dwCreationFlags,
     LPVOID lpEnvironment,
     LPCWSTR lpCurrentDirectory,
     LPSTARTUPINFOW lpStartupInfo,
     LPPROCESS_INFORMATION lpProcessInformatin
    )
    {
        HIPS_INFO sz = {0};
        if (wcslen(lpCommandLine) != 0)
        {
            wcscpy_s(sz.wProcessName, lpCommandLine);
        }
        else
        {
            wcscpy_s(sz.wProcessName, lpApplicationName);
        }
    
        sz.dwHipsClass = HIPS_CREATEPROCESS;
    
        COPYDATASTRUCT cds = {NULL, sizeof(HIPS_INFO), (void*)&sz};
        BOOL bRet = FALSE;
        if (SendMessage(FindWindow(NULL, L"Easy Hips For R3"), WM_COPYDATA, GetCurrentProcessId(), (LPARAM)&cds) != -1)
        {
            CreateProcessWHook.UnHook();
            bRet = CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes,
                 bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformatin);
            CreateProcessWHook.ReHook();
        }
    
        return bRet;
    }
    
    
    LSTATUS APIENTRY MyRegSetValueExW
    (
     HKEY hKey,
     LPCWSTR lpValueName,
     DWORD Reserved,
     DWORD dwType,
     CONST BYTE* lpData,
     DWORD cbData
    )
    {
        HIPS_INFO sz = {0};
        wcscpy_s(sz.wProcessName, (LPCWSTR)lpData);
        sz.dwHipsClass = HIPS_REGSETVALUE;
    
        COPYDATASTRUCT cds = {NULL, sizeof(HIPS_INFO), (void*)&sz};
        BOOL bRet = FALSE;
        if (SendMessage(FindWindow(NULL, L"Easy Hips For R3"), WM_COPYDATA, GetCurrentProcessId(), (LPARAM)&cds) != -1)
        {
            RegSetValueExWHook.UnHook();
            bRet = RegSetValueExW(hKey, lpValueName, Reserved, dwType, lpData, cbData);
            RegSetValueExWHook.ReHook();
        }
    
        return bRet;
    }
    
    
    LSTATUS APIENTRY MyRegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
    {
        HIPS_INFO sz = {0};
        wcscpy_s(sz.wProcessName, lpValueName);
        sz.dwHipsClass = HIPS_REGDELETEVALUE;
    
        COPYDATASTRUCT cds = {NULL, sizeof(HIPS_INFO), (void*)&sz};
        BOOL bRet = FALSE;
        if (SendMessage(FindWindow(NULL, L"Easy Hips For R3"), WM_COPYDATA, GetCurrentProcessId(), (LPARAM)&cds) != -1)
        {
            RegDeleteValueWHook.UnHook();
            bRet = RegDeleteValueW(hKey, lpValueName);
            RegDeleteValueWHook.ReHook();
        }
    
        return bRet;
    }
    
    
    LRESULT CALLBACK GetMsgProc(int iCode, WPARAM wParam, LPARAM lParam)
    {
        return CallNextHookEx(g_hHook, iCode, wParam, lParam);
    }
    
    
    VOID SetHookOn(HWND hWnd)
    {
        g_ExeHwnd = hWnd;
        SetWindowsHookEx(WH_GETMESSAGE, &GetMsgProc, g_hInst, 0);
    }
    
    
    VOID SetHookOff()
    {
        UnhookWindowsHookEx(g_hHook);
        g_hHook = NULL;
    }
    
    
    BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
            g_hInst = (HINSTANCE)hModule;
            RegSetValueExWHook.Hook(L"advapi32.dll", "RegSetValueExW", (PROC)MyRegSetValueExW);
            RegDeleteValueWHook.Hook(L"advapi32.dll", "RegDeleteValueW", (PROC)MyRegDeleteValueW);
            CreateProcessWHook.Hook(L"kernel32.dll", "CreateProcessW", (PROC)MyCreateProcessW);
            break;
        case DLL_PROCESS_DETACH:
            RegSetValueExWHook.UnHook();
            RegDeleteValueWHook.UnHook();
            CreateProcessWHook.UnHook();
            if (g_hHook != NULL)
            {
                SetHookOff();
            }
            break;
        }
    
        return TRUE;
    }
    #include "InlineHook.h"
    
    CInlineHook::CInlineHook(void)
    {
        m_pfnOrig = NULL;
        ZeroMemory(m_bNewBytes, 5);
        ZeroMemory(m_bOldBytes, 5);
    }
    
    CInlineHook::~CInlineHook(void)
    {
        UnHook();
    }
    
    //////////////////////////////////////////////////////////////////////////////////
    //函数功能:对指定模块中的函数进行挂钩
    //参数说明:
    //        pszModuleName:模块名称
    //        pszFuncName:函数名称
    //        pfnHookFunc:钩子函数
    /////////////////////////////////////////////////////////////////////////////////
    BOOL CInlineHook::Hook(LPTSTR pszModuleName, LPSTR pszFuncName, PROC pfnHookFunc)
    {
        BOOL bRet = FALSE;
    
        //获取指定模块中函数地址
        m_pfnOrig = (PROC)GetProcAddress(GetModuleHandle(pszModuleName), pszFuncName);
        if (NULL != m_pfnOrig)
        {
            //保存该地址处5个字节的内容
            DWORD dwNum = 0;
            ReadProcessMemory(GetCurrentProcess(), m_pfnOrig, m_bOldBytes, 5, &dwNum);
    
            //构造JMP指令
            m_bNewBytes[0] = TEXT('xe9');
            //pfnHookFunc是Hook后的目标地址
            //m_pfnOrig是原来的地址
            //5是指令长度
            *(DWORD*)(m_bNewBytes + 1) = (DWORD)pfnHookFunc - (DWORD)m_pfnOrig - 5;
            //将构造好的地址写入该地址处
            WriteProcessMemory(GetCurrentProcess(), m_pfnOrig, m_bNewBytes, 5, &dwNum);
    
            bRet = TRUE;
        }
    
        return bRet;
    }
    
    /////////////////////////////////////
    //函数功能:取消函数的挂钩
    /////////////////////////////////////
    VOID CInlineHook::UnHook(void)
    {
        if (0 != m_pfnOrig)
        {
            DWORD dwNum = 0;
            WriteProcessMemory(GetCurrentProcess(), m_pfnOrig, m_bOldBytes, 5, &dwNum);
        }
    }
    
    //////////////////////////////////////////////////////
    //函数功能:重新对函数进行挂钩
    //////////////////////////////////////////////////////
    BOOL CInlineHook::ReHook(void)
    {
        BOOL bRet = FALSE;
    
        if (0 != m_pfnOrig)
        {
            DWORD dwNum = 0;
            WriteProcessMemory(GetCurrentProcess(), m_pfnOrig, m_bNewBytes, 5, &dwNum);
    
            bRet = TRUE;
        }
    
        return bRet;
    }
    #pragma once
    #include <Windows.h>
    
    class CInlineHook
    {
    public:
        CInlineHook(void);    //构造
        ~CInlineHook(void);    //析构
    
        //Hook函数
        BOOL Hook(LPTSTR pszModuleName, LPSTR pszFuncName, PROC pfnHookFunc);
        //取消Hook函数
        VOID UnHook(void);
        //重新进行Hook函数
        BOOL ReHook(void);
    private:
        PROC m_pfnOrig;            //函数地址
        BYTE m_bOldBytes[5];    //函数入口代码
        BYTE m_bNewBytes[5];    //Inline代码
    };

    2、调用部分代码

    #define HIPS_CREATEPROCESS    0x00000001L
    #define HIPS_REGSETVALUE    0x00000002L
    #define HIPS_REGDELETEVALUE 0x00000003L
    
    typedef struct _HIPS_INFO
    {
        WCHAR wProcessName[0x200];
        DWORD dwHipsClass;
    }HIPS_INFO, *PHIPS_INFO;
    
    typedef VOID (*SETHOOKON)(HWND);
    typedef VOID (*SETHOOKOFF)();
    
    
    void CHipsCallDlg::InitLogList(void)
    {
        m_ctrlLogList.SetExtendedStyle(m_ctrlLogList.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
        m_ctrlLogList.InsertColumn(0, L"序号");
        m_ctrlLogList.InsertColumn(1, L"时间");
        m_ctrlLogList.InsertColumn(2, L"信息");
        m_ctrlLogList.InsertColumn(3, L"类型");
        m_ctrlLogList.InsertColumn(4, L"事件");
        CRect Rect;
        m_ctrlLogList.GetClientRect(&Rect);
        m_ctrlLogList.SetColumnWidth(0, Rect.Width() / 10);
        m_ctrlLogList.SetColumnWidth(1, 2 * Rect.Width() / 10);
        m_ctrlLogList.SetColumnWidth(2, 4 * Rect.Width() / 10);
        m_ctrlLogList.SetColumnWidth(3, 2 * Rect.Width() / 10);
        m_ctrlLogList.SetColumnWidth(4, Rect.Width() / 10);
    }
    
    void CHipsCallDlg::OnBnClickedButtonCleanuplog()
    {
        // TODO: 在此添加控件通知处理程序代码
        m_ctrlLogList.DeleteAllItems();
    }
    
    void CHipsCallDlg::OnBnClickedButtonStart()
    {
        // TODO: 在此添加控件通知处理程序代码
        m_hInst = LoadLibrary(TEXT("HipsDll.dll"));
        SETHOOKON SetHookOn = (SETHOOKON)GetProcAddress(m_hInst, "SetHookOn");
    
        SetHookOn(GetSafeHwnd());
        FreeLibrary(m_hInst);
        m_BtnOn.EnableWindow(FALSE);
        m_BtnOff.EnableWindow(TRUE);
    }
    
    void CHipsCallDlg::OnBnClickedButtonStop()
    {
        // TODO: 在此添加控件通知处理程序代码
        m_hInst = GetModuleHandle(TEXT("HipsDll.dd"));
        SETHOOKOFF SetHookOff = (SETHOOKOFF)GetProcAddress(m_hInst, "SetHookOff");
        SetHookOff();
        CloseHandle(m_hInst);
        FreeLibrary(m_hInst);
        m_BtnOn.EnableWindow(TRUE);
        m_BtnOff.EnableWindow(FALSE);
    }
    
    BOOL CHipsCallDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        CString strNum;
        CString strTime;
        CString strInfo;
        CString strType;
        CString strResult;
        CString strTemp;
        SYSTEMTIME stTime;
        BOOL bRet = FALSE;
    
        int nNum = m_ctrlLogList.GetItemCount();
        strNum.Format(_T("%d"), nNum);
        GetLocalTime(&stTime);
        strTime.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), stTime.wYear, stTime.wMonth, stTime.wDay, 
            stTime.wMonth, stTime.wMinute, stTime.wSecond);
        strInfo = ((PHIPS_INFO)(pCopyDataStruct->lpData))->wProcessName;
    
        strTemp = _T("是否启动该进程:");
        strTemp += strInfo;
        if (IDYES == AfxMessageBox(strTemp, MB_YESNO))
        {
            strResult = _T("放行");
            bRet = TRUE;
        }
        else
        {
            strResult = _T("拦截");
            bRet = FALSE;
        }
    
        switch (((PHIPS_INFO)(pCopyDataStruct->lpData))->dwHipsClass)
        {
        case HIPS_CREATEPROCESS:
            strType = _T("进程创建");
            break;
        case HIPS_REGSETVALUE:
            strType = _T("修改注册表项");
            break;
        case HIPS_REGDELETEVALUE:
            strType = _T("删除注册表项");
            break;
        }
    
        m_ctrlLogList.InsertItem(nNum, strNum);
        m_ctrlLogList.SetItemText(nNum, 1, strTime);
        m_ctrlLogList.SetItemText(nNum, 2, strInfo);
        m_ctrlLogList.SetItemText(nNum, 3, strType);
        m_ctrlLogList.SetItemText(nNum, 4, strResult);
    
        return bRet;
    }

    三、下载

    下载地址:http://pan.baidu.com/s/1ntwjz77

  • 相关阅读:
    hdu 1392 fzu 1333 Surround the Trees 简单凸包
    STL的应用 multiset bitset next_permutation
    hdu 3711 Binary Number 位运算(^ 与&)的应用
    鸽舍原理
    hdu 4002 Find the maximum 2011 大连网络赛 1002 Find the maximum
    组合数学
    Delphi程序破解技术概要
    NET的URL怎么静态化?
    David I谈Delphi的现状及未来发展方向
    使用Dede破解Delphi软件实战
  • 原文地址:https://www.cnblogs.com/qiyueliuguang/p/3632008.html
Copyright © 2020-2023  润新知