gpt4 book ai didi

c++ - __declspec naked 上的 memcpy 返回意外的字节

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:53 25 4
gpt4 key购买 nike

我正在尝试获取 __declspec(naked) 函数的原始字节,但是 memcpy 正在返回我不期望的字节。

我使用了调试器来检查字节/地址。一切看起来都很好,但 memcpy 的结果产生了不同的、看似不变的字节。

void __declspec(naked) widget_click_fix_asm()
{
__asm {
nop
call patched_widget_handler
}
}

void test_patch()
{
char buf[7];

::memcpy(&buf, &widget_click_fix_asm, 7);
}

在 VS 调试器中,在我执行的中间窗口中:

&widget_click_fix_asm
0x778816f0

导航到该内存位置显示以下字节:

778816F0 90
778816F1 FF 15 38 91 88 77

我希望 buf 是以下字节的容器:

[0x90, 0xFF, 0x15, 0x38, 0x91, 0x88, 0x77]

每次我测试时,buf 都包含以下常量字节:

[0xE9, 0xD8, 0x05, 0x00, 0x00, 0xE9, 0x63]

为什么我没有得到预期的字节数?

最佳答案

您所观察到的是由于incremental linking在 MSVC 的 Debug模式下。 widget_click_fix_asm 的地址实际上不是函数本身,而是 JMP Thunk Table 中的 JMP 指令地址。 .该表用于将新版本的函数修补到现有的可执行文件中。这是通过将新函数写入具有足够空间的可执行文件的空闲区域,然后使用新地址更新 JMP thunk 表来完成的。这有助于 Visual Studio 中的编辑和继续调试功能。

在您的示例中,您对 memcpy 的调用最终将部分 JMP Thunk 表复制到 buf 而不是函数本身。您可能希望考虑关闭增量链接功能以获得您正在寻找的所需行为。

关于c++ - __declspec naked 上的 memcpy 返回意外的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57534123/

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