VEH 吊钩加速度

问题描述

我正在尝试加快 VEH 钩子的速度。我从 driver.find_element_by_xpath("//script[@language='javascript']")

找到的 Veh 钩子类
https://github.com/hoangprod/LeoSpecial-VEH-Hook/blob/master/LeoSpecial.h

挂钩工作正常,没有任何问题。但是我注入的过程让我损失了很多 FPS。正如我在谷歌上搜索的那样,大多数答案是说减少钩子中使用的逻辑量。我的钩子方法

#pragma once
#include <Windows.h>
#include <stdio.h>
#include <iostream>

#ifdef _WIN64
#define XIP Rip
#else
#define XIP Eip
#endif



class LeoHook {
public:
    static bool Hook(uintptr_t og_fun,uintptr_t hk_fun);
    static bool Unhook();

private:
    static uintptr_t og_fun;
    static uintptr_t hk_fun;
    static PVOID VEH_Handle;
    static DWORD oldProtection;

    static bool AreInSamePage(const uint8_t* Addr1,const uint8_t* Addr2);
    static LONG WINAPI LeoHandler(EXCEPTION_POINTERS *pExceptionInfo);
};

uintptr_t LeoHook::og_fun = 0;
uintptr_t LeoHook::hk_fun = 0;
PVOID LeoHook::VEH_Handle = nullptr;
DWORD LeoHook::oldProtection = 0;

bool LeoHook::Hook(uintptr_t original_fun,uintptr_t hooked_fun)
{
    LeoHook::og_fun = original_fun;
    LeoHook::hk_fun = hooked_fun;

    //We cannot hook two functions in the same page,because we will cause an infinite callback
    if (AreInSamePage((const uint8_t*)og_fun,(const uint8_t*)hk_fun))
        return false;

    //Register the Custom Exception Handler
    VEH_Handle = AddVectoredExceptionHandler(true,(PVECTORED_EXCEPTION_HANDLER)LeoHandler);

    //Toggle PAGE_GUARD flag on the page
    if(VEH_Handle && VirtualProtect((LPVOID)og_fun,1,PAGE_EXECUTE_READ | PAGE_GUARD,&oldProtection))
        return true;
    
    return false;
}

bool LeoHook::Unhook()
{
    DWORD old;
    if (VEH_Handle && //Make sure we have a valid Handle to the registered VEH
        VirtualProtect((LPVOID)og_fun,oldProtection,&old) && //Restore old Flags
        RemoveVectoredExceptionHandler(VEH_Handle)) //Remove the VEH
        return true;

    return false;
}

LONG WINAPI LeoHook::LeoHandler(EXCEPTION_POINTERS *pExceptionInfo)
{
    if (pExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION) //We will catch PAGE_GUARD Violation
    {
        if (pExceptionInfo->ContextRecord->XIP == (uintptr_t)og_fun) //Make sure we are at the address we want within the page
        {
            pExceptionInfo->ContextRecord->XIP = (uintptr_t)hk_fun; //Modify EIP/RIP to where we want to jump to instead of the original function
        }

        pExceptionInfo->ContextRecord->EFlags |= 0x100; //Will trigger an STATUS_SINGLE_STEP exception right after the next instruction get executed. In short,we come right back into this exception handler 1 instruction later
        return EXCEPTION_CONTINUE_EXECUTION; //Continue to next instruction
    }

    if (pExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP) //We will also catch STATUS_SINGLE_STEP,meaning we just had a PAGE_GUARD violation
    {
        DWORD dwOld;
        VirtualProtect((LPVOID)og_fun,&dwOld); //Reapply the PAGE_GUARD flag because everytime it is triggered,it get removes

        return EXCEPTION_CONTINUE_EXECUTION; //Continue the next instruction
    }

    return EXCEPTION_CONTINUE_SEARCH; //Keep going down the exception handling list to find the right handler IF it is not PAGE_GUARD nor SINGLE_STEP
}

bool LeoHook::AreInSamePage(const uint8_t* Addr1,const uint8_t* Addr2)
{
    MEMORY_BASIC_informatION mbi1;
    if (!VirtualQuery(Addr1,&mbi1,sizeof(mbi1))) //Get Page information for Addr1
        return true;

    MEMORY_BASIC_informatION mbi2;
    if (!VirtualQuery(Addr2,&mbi2,sizeof(mbi2))) //Get Page information for Addr1
        return true;

    if (mbi1.BaseAddress == mbi2.BaseAddress) //See if the two pages start at the same Base Address
        return true; //Both addresses are in the same page,abort hooking!

    return false; 
}

如您所见,函数中包含的逻辑并不多。但它仍然花费了我很多 fps。 第二个研究是说复制所有页面函数然后修改页面函数的ASM。但我不知道如何复制页面功能。所以我需要一些指导如何复制页面函数或其他方法来加速 VEH 钩子。

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...