gpt4 book ai didi

c - 函数地址错误

转载 作者:行者123 更新时间:2023-11-30 16:24:35 25 4
gpt4 key购买 nike

代码如下:

__declspec ( naked ) void nseel_asm_assign(void)
{
__asm
{
fld qword ptr [eax]
fstp qword ptr [ebx]
}
}
__declspec ( naked ) void nseel_asm_assign_end(void) {}

使用它们的代码崩溃了。调试器显示地址正常,例如

&nseel_asm_assign   0x0f45e4a0 {vis_avs.dll!nseel_asm_assign(void)} void(*)()
&nseel_asm_assign_end 0x0f45e4b0 {vis_avs.dll!nseel_asm_assign_end(void)} void(*)()

但是,当这些函数的地址由实际 C 代码而不是调试器获取时,它就不再正确,并且使用的代码会崩溃,因为大小为负数:

    fn  0x0f455056 {vis_avs.dll!_nseel_asm_assign}  void(*)()
fn_e 0x0f45295f {vis_avs.dll!_nseel_asm_assign_end} void(*)()

带下划线的函数仅包含一条指令,例如jmp nseel_asm_assign

如何获取不带下划线的实际函数的地址?

更新:如果你想知道为什么我写这样的代码,那不是我,it’s third party ,并且在使用 VC++ 6.0 构建时工作得很好。

最佳答案

以下是获取真实地址的方法。

static void* unwrapJumpAddress( void *f )
{
const uint8_t* pb = (const uint8_t*)f;
if( *pb == 0xE9 ) // JMP: http://felixcloutier.com/x86/JMP.html
{
const int offset = *(const int*)( pb + 1 );
// The jump offset is relative to the start of the next instruction.
// This JMP takes 5 bytes.
return (void*)( pb + 5 + offset );
}
return f;
}

关于c - 函数地址错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53607472/

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