【发布时间】:2015-12-20 23:26:49
【问题描述】:
我正在尝试使用我注入的 dll 来挂钩应用程序。目前该 dll 包含一个钩子、一个函数 trampoline 和一个空函数。但是,当调用挂钩函数时,目标应用程序会崩溃。我看了看哪里出了问题,似乎被替换的跳转指令跳转到了一个我没有指定的未知位置。经过仔细检查,我意识到这个未知地址看起来与正确的地址非常相似。似乎未知地址是向右移动的正确地址,前面有 4 个垃圾位。所以我的问题是这是怎么发生的,我可以纠正这个吗?
#define FUNC_JMP 0x00433504
#define FUNC_ADDR (FUNC_JMP+1)
// Trampoline
__declspec(naked) void setup (void) { ... }
void hook (void)
{
DWORD protect, buf;
DWORD adr = (DWORD) ((BYTE*) &setup - (FUNC_ADDR + 4));
VirtualProtect ((void*) FUNC_ADDR, 4, PAGE_EXECUTE_READWRITE, &protect);
memcpy ((void*) FUNC_ADDR, &adr, 4);
VirtualProtect ((void*) FUNC_ADDR, 4, protect, &buf);
}
0x00433504 之前:jmp dword ptr ds:[0x1F8BAC4]
0x00433504 之后:jmp fword ptr ds:[0x10B51DC]
adr的实际值:0x0B51DC2D
TLDR;为什么我 memcpy 的值不完整并向右移动了 4 位。
【问题讨论】:
-
这看起来不像 C++ 代码。不要添加不相关的标签。
-
@Olaf 您可能知道它可以是 C++ 或 C。不要添加不相关的 cmets。
-
答案可能取决于您可能知道的实际语言。如果没有,您显然不了解 C++。但是,您正在调用未定义的行为,因此没有必要进行进一步调查。
标签: c++ c windows hook reverse-engineering