尝试重写jmp时出现访问冲突异常

时间:2014-03-08 15:54:55

标签: c++ windows exception assembly hook

我有一个游戏,我对它进行了分解并找到了我想重写的跳转,

但每当我尝试写入地址时,即使我使用VirtualProtect并设置了READWRITE权限,我也会收到访问声音异常。

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)。

3 个答案:

答案 0 :(得分:1)

内存保护常量的documentation表示:

  

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

然后列出了许多值,包括您组合在一起的三个值。当文档说“指定以下值之一”时,它就意味着一个。你不能把它们组合起来。

您需要自己使用PAGE_EXECUTE_READWRITE

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

答案 1 :(得分:0)

您需要使用调试器或程序为调试器模式启用进程令牌权限(如培训师)。我认为这不是用于在线作弊(离线无关紧要)。

答案 2 :(得分:0)

传递PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE错误,您只需将PAGE_EXECUTE_READWRITE传递给Virtual Protect。现在它有效。

相关问题