【发布时间】:2014-03-08 15:54:54
【问题描述】:
我有一个游戏,我将它分解并找到了一个我想重写的跳转,
但每当我尝试写入该地址时,我都会遇到访问冲突异常,即使我使用 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)。
【问题讨论】:
-
你可以编写一个程序来复制地址之前的所有二进制数据,更改地址并复制之后的所有内容。这会给你一个新的二进制文件:如果没有校验和,否则它会将你的二进制文件标记为无效。
-
你试过什么?显示您的代码。请记住,每次运行程序时,现代版本的 Windows 都会将程序代码加载到不同的地址。
-
不用担心,函数的地址始终保持不变。至少在这个二进制文件中。
-
你永远不会检查 VirtualProtect 是否成功。
-
hm 失败但 GetLastError 返回 0
标签: c++ windows exception assembly hook