HookFunction

DIY Your Ani patch

////////////////////////////////
// HookFunction
////////////////////////////////
BOOL HookFunction(
    PBYTE            pbCode,
    void            *pfnHook)
{
    LPVOID            lpvbounce;
    DWORD            cb;
    DWORD            dwprotect;

    //---------------- skip hot-patch JMP SHORT if present
    if ( pbCode[0] == 0x8B && pbCode[1] >= 0xC0 &&        // 8Bh/11abcabc: MOV reg, self
         (((pbCode[1] >> 3) ^ pbCode[1]) & 0x07) == 0 )
    {
        pbCode += 2;
    }

    //---------------- prepare dynamic portion of hook
    cb = DisassembleProlog(pbCode, 0x05);

    if (cb < 0x05)
        return FALSE;

    lpvbounce = VirtualAlloc(NULL, 0x05 + cb + 0x05, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);

    if (lpvbounce == NULL)
        return FALSE;

    *         ((LPBYTE)lpvbounce + 0x00)      = 0xE8;    // E8h/xxxxxxxx: CALL pfnHook
    *(LPDWORD)((LPBYTE)lpvbounce + 0x01)      = (DWORD)pfnHook - (DWORD)lpvbounce - 0x05;
    memcpy((LPBYTE)lpvbounce + 0x05, pbCode, cb);

    *         ((LPBYTE)lpvbounce + 0x05 + cb) = 0xE9;    // E9h/xxxxxxxx: JMP (pbCode + cb)
    *(LPDWORD)((LPBYTE)lpvbounce + 0x06 + cb) = (DWORD)pbCode - (DWORD)lpvbounce - 0x05 - 0x05;

    VirtualProtect(lpvbounce, 0x05 + cb + 0x05, PAGE_EXECUTE_READ, &dwprotect);

    //---------------- hook code entry point ("prolog")
    if (!VirtualProtect(pbCode, cb, PAGE_EXECUTE_READWRITE, &dwprotect))
    {
        VirtualFree(lpvbounce, 0, MEM_RELEASE);
        return FALSE;
    }

        *        (pbCode + 0x00) = 0xE9;            // E9h/xxxxxxxx: JMP lpvbounce
    *(DWORD*)(pbCode + 0x01) = (DWORD)lpvbounce - (DWORD)pbCode - 0x05;

    VirtualProtect(pbCode, cb, dwprotect, &dwprotect);

    return TRUE;
} //HookFunction()


////////////////////////////////
// HookExports
////////////////////////////////

const struct { const char *szexport; void *pfn; } USER32_HOOKS[] =
{
    { "LoadImageA", MyLoadImageA },
    { "LoadImageW", MyLoadImageW }
} ;

////////////////////////////////
BOOL HookExports()
{
    HMODULE            hm;
    PBYTE            pb;
    size_t            c;

    //---------------- hook USER32.DLL exports
    hm = GetModuleHandle("user32.dll");

    if (hm == NULL)
        return FALSE;

    for (c = 0; c < (sizeof(USER32_HOOKS) / sizeof(USER32_HOOKS[0])); c++)
    {
        pb = (PBYTE)GetProcAddress(hm, USER32_HOOKS[c].szexport);

        if (pb == NULL)
            continue;

        HookFunction(pb, USER32_HOOKS[c].pfn);
    } //for(c)

    return TRUE;
} //HookExports()
[+] [DriverEntry] 驱动加载开始 [+] [DriverEntry] 驱动加载成功 [+] [ProcessNotifyCallback] 目标进程 oxygen.exe 创建 (PID: 1604) [+] [ProcessNotifyCallback] 工作线程已创建 [+] Worker thread started for hook installation on PID: 1604 [+] [InstallHook] 找到目标函数地址: FFFFF8057B2EFB60 [PTE_HOOK] 开始隔离页面: PID=1604, 地址=0xFFFFF8057B2EFB60 [PTE_HOOK] 正在拆分大页: 输入PDE=0xa00000002a001a1, 输出PDE=0xFFFFBD0464F75D80 [PTE_HOOK] 大页拆分完成: 新PTE表物理地址=0x23fec2000 [PTE_HOOK] G-Bit Info: Align Address: 0xFFFFF8057B2EF000 IsLargePage: 1 PDE: 0xa00000002a000a1 (Address: 0xFFFFE2713E015EC8) [PTE_HOOK] 清除大页G位: PDE=0xa00000002a000a1 [+] Direct write to isolated page: VA=FFFFF8057B2EFB60 -> Hook=FFFFF805802F1550 [+] [InstallHook] Hook 成功安装. 跳板地址: FFFFF8057B2EFB60 [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe [!] [HookFunction] 进入 Hook 函数! 当前进程: MsMpEng.exe现在一直进这个hook函数无限卡死。关键是又是全局hook,不是进程特定hook
最新发布
06-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值