功能地址错误

时间:2018-12-04 07:08:38

标签: c windows visual-c++ inline-assembly function-address

这是代码:

__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构建时效果很好。

1 个答案:

答案 0 :(得分: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;
}