Неверный адрес функции - PullRequest
       26

Неверный адрес функции

0 голосов
/ 04 декабря 2018

Вот код:

__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

Как получить адреса реальных функций без подчеркивания?

Обновление: на тот случай, если вам интересно, почему я написал такой код, это был не я, это сторонний , и он прекрасно работал при сборке с VC ++ 6.0.

1 Ответ

0 голосов
/ 04 декабря 2018

Вот как получить реальный адрес.

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;
}
...