我有一个游戏,我对它进行了分解并找到了我想重写的跳转,
但每当我尝试写入地址时,即使我使用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;
}
}
uqbyte
是unsigned long
。
当调用getlasterror时,代码似乎返回十进制错误87(INVALID_PARAMETERS)。
答案 0 :(得分:1)
内存保护常量的documentation表示:
以下是内存保护选项;在内存中分配或保护页面时,必须指定以下值之一。
然后列出了许多值,包括您组合在一起的三个值。当文档说“指定以下值之一”时,它就意味着一个。你不能把它们组合起来。
您需要自己使用PAGE_EXECUTE_READWRITE
。
我建议您在所有API调用周围添加错误检查。我还认为你可以避免对地址进行硬编码。
答案 1 :(得分:0)
您需要使用调试器或程序为调试器模式启用进程令牌权限(如培训师)。我认为这不是用于在线作弊(离线无关紧要)。
答案 2 :(得分:0)
传递PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE
错误,您只需将PAGE_EXECUTE_READWRITE
传递给Virtual Protect。现在它有效。