当尝试重写jmp时,访问冲突异常

Access voilation exception when trying to rewrite jmp

本文关键字:访问冲突 异常 jmp 重写      更新时间:2023-10-16

我有一个游戏,我拆解了它,找到了一个我想重写的跳跃,

但是每当我尝试写地址时,我得到一个访问异常,即使我使用VirtualProtect并设置读写权限。

0x0042BD5F上的指令是这样的:

0x0046AACF E9 FF FF 89 FC | jmp这里有些地址

现在,当我尝试写0x0042BD5F,以改变相对跳转地址时,我得到一个访问中断异常。

如何更改该地址的跳转?

代码被请求了,所以在这里:

#define AddVar(Type,Name,Address) Type& Name = *reinterpret_cast<Type*>(Address)
/*
Hooker
1b 0x0042BD5F == E9 <relative jmp>
4b 0x0042BD60 - relative jump offset (always the value 0xFFFF89FC)
*/
AddVar(uqbyte, jump_hook_bytes, 0x0042BD60);
//the user tick function
void(*tick)(void);
void SetTick(void(*passed)(void))
{
    tick = passed;
}
void Ticker();
void OnDLLLoad(void(*passed)(void) = nullptr)
{
    tick = passed;
    //point the game loop end to Ticker()
    //replace the jump address
    //jmp (DESTINATION_RVA - CURRENT_RVA - 5 [sizeof(E9 xx xx xx xx)])
    DWORD old;
    VirtualProtect(
        (LPVOID)0x0042BD5F,
        0x05,
        PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE,
        &old
        );
    jump_hook_bytes = (((uqbyte)((uqbyte*)&Ticker) - (uqbyte)0x0042BD5F) - (uqbyte)0x0000005);
}
void Ticker()
{
    if (tick != nullptr)
    {
        tick();
    }
    __asm
    { 
        MOV EAX, 0x0042B9EA;//old address
        JMP EAX;
    }
}

uqbyteunsigned long

调用getlasterror时,代码似乎返回十进制错误87 (INVALID_PARAMETERS)。

内存保护常量的文档说:

以下是内存保护选项;在内存中分配或保护页时,必须指定以下值之一。

然后列出一些值,包括您组合在一起的三个值。当文档中说"指定以下值之一"时,它指的就是一个值。你不能把它们结合起来。

您需要单独使用PAGE_EXECUTE_READWRITE

我建议您在所有API调用周围添加错误检查。我还认为你可以避免对地址进行硬编码。

您需要使用调试器或为调试器模式启用进程令牌特权的程序(如培训器)。我想这不会被用于在线作弊(离线应该没关系)。

传递PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE错误,只需要将PAGE_EXECUTE_READWRITE传递给Virtual Protect。