gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:02:14 28 4
gpt4 key购买 nike

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

但每当我尝试写入该地址时,我都会遇到访问中断异常,即使我使用 VirtualProtect 并设置了 READWRITE 权限也是如此。

0x0042BD5F 上的指令是这样的:

0x0046AACF E9 FF FF 89 FC |在这里跳转一些地址

现在,当我尝试写入 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;
}
}

uqbyte 是一个unsigned long

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

最佳答案

documentation对于内存保护常量说:

The following are the memory-protection options; you must specify one of the following values when allocating or protecting a page in memory.

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

您需要单独使用 PAGE_EXECUTE_READWRITE

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

关于c++ - 尝试重写 jmp 时出现访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22271535/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com