当尝试重写jmp时,访问冲突异常
Access voilation exception when trying to rewrite jmp
我有一个游戏,我拆解了它,找到了一个我想重写的跳跃,
但是每当我尝试写地址时,我得到一个访问异常,即使我使用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;
}
}
uqbyte
是unsigned long
。
调用getlasterror时,代码似乎返回十进制错误87 (INVALID_PARAMETERS)。
内存保护常量的文档说:
以下是内存保护选项;在内存中分配或保护页时,必须指定以下值之一。
然后列出一些值,包括您组合在一起的三个值。当文档中说"指定以下值之一"时,它指的就是一个值。你不能把它们结合起来。
您需要单独使用PAGE_EXECUTE_READWRITE
。
我建议您在所有API调用周围添加错误检查。我还认为你可以避免对地址进行硬编码。
您需要使用调试器或为调试器模式启用进程令牌特权的程序(如培训器)。我想这不会被用于在线作弊(离线应该没关系)。
传递PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE
错误,只需要将PAGE_EXECUTE_READWRITE
传递给Virtual Protect。
相关文章:
- 写入访问冲突异常
- 在C++中删除双向链表的头节点后出现访问冲突异常
- Visual Studio图形调试器引发读取访问冲突异常
- 尝试将 std::cerr 重定向到文件时出现访问冲突异常
- 媒体基础:读取示例 - 访问冲突异常
- 链表的访问冲突异常
- 进入函数之前的访问冲突异常
- 删除函数 c++ 的读取访问冲突异常
- 无法使用 C++ catch(..) 捕获访问冲突异常
- 在Visual Studio Community中使用glfw3 glew和opengl获取访问冲突异常
- 访问动态 2D 字符数组时引发访问冲突异常
- 从静态库使用 Boost Asio 时访问冲突异常
- 为什么访问冲突异常不能被 捕获.NET4.0.
- glGenBuffers 访问冲突异常
- unsigned char*导致访问冲突异常
- 注入DLL的函数中出现访问冲突异常(5)
- 删除二叉搜索树中的节点中的 Visual Studio 中的访问冲突异常
- 提升 Asio tcp::接受者访问冲突异常
- 在 .Net 应用程序中调用 C++ DLL 时出现系统访问冲突异常
- 为什么此代码会引发访问冲突异常