Неверный адрес функции
Вот код:
__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 ответ
Решение
Вот как получить реальный адрес.
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;
}