Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Программирование / Programming (https://forum.zone-game.info/forumdisplay.php?f=98)
-   -   [C++] Получение адреса функции (https://forum.zone-game.info/showthread.php?t=41314)

Sojang 25.08.2016 20:08

[C++] Получение адреса функции
 
Вопрос в том как получить адрес начала инструкции функции?
Так как делаю я меня не устраивает ибо по получаемому мною адресу лежит команда jmp на начало инструкции,а не сама инструкция.

Altha1oda 25.08.2016 20:42

Re: [C++] Получение адреса функции
 
Привет, Возможно поможет снеговик ( snowman )
http://image.prntscr.com/image/20612...fa8f524ffc.png

Нажмешь как поставишь его в иду F3 и получишь то что на скриншоте
с началом адреса инструкции , и куда ( если есть ) идет переход , прыжок в данном примере jmp.

ps возможно пригодиться, если правильно понимаю вопрос.

flopix 25.08.2016 20:59

Re: [C++] Получение адреса функции
 
Если нужно вычислить адрес куда ведет этот переход то я считаю так:

PHP код:

unsigned int calcRealAddr(unsigned char *addr)
{
    if (*
addr == 0xE9)//код оператора JMP
    
{
        
//jmp operand found, calc jump addr
        
unsigned int jmpAddr = (unsigned int)addr + (*(int*)((unsigned int)addr 1)) + 5;
        return 
calcRealAddr((unsigned char*)jmpAddr);
    }
    return (
unsigned int)addr;


Причем функция рекурсивная. Если по адресу перехода будет опять jmp будет считать дальше.

Akumu 25.08.2016 21:04

Re: [C++] Получение адреса функции
 
Чем собственно джамп не устраивает?

Подозреваю у вас проблема с установкой хука на джамп, так как инструкции JMP имеют относительную адресацию, а вы не пересчитываете смещение после переноса кода (либо делаете это не верно).

Ну есть прям совсем не получается то можно вот:

Код:

#define JMP_VALUE(addr) (*(DWORD*)((addr) + 1))
#define FOLLOW_JMP(addr) (JMP_VALUE(addr) + (DWORD)(addr) + 5)
#define FOLLOW_JUMPS(a) while (IS_JMP(a)) \
{ \
        a = FOLLOW_JMP(a); \
}



Текущее время: 09:40. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot