Вызов функции по адресу - PullRequest
2 голосов
/ 13 мая 2011

Я пытаюсь изучить несколько различных методов вызова функций по адресу.

bool gl_draw_text(uint x, uint y, uint color, uint alpha, char *fmt);

Эта функция - то, что я называю. Вот как я сейчас это называю. (И это прекрасно работает.)

static void glDrawText(char* text, int x, int y)
{
DWORD func = 0x10057970;

__asm
{
    push text
    push 255
    push 14
    push y
    push x
    call dword ptr [func]
    }
}

Вот метод, который я хочу использовать.

void Hack()
{
    bool (draw*)(uint, uint, uint, uint, char*);
    draw = 0x10057970;
    (draw)(20, 20, 14, 255, "Text");
}

Но я не знаю, как правильно привести адрес к функции, чтобы она работала \ компилировалась.

Есть также метод, который использует виртуальную функцию, мне интересно, как этот метод работает тоже. (Я также могу использовать MS Detours, чтобы перехватить, а затем вызвать такую ​​функцию, как этот метод работает за сценой, если вы знаете.)

Итак, чтобы быть ясным, я просто спрашиваю о различных методах выполнения этой задачи, но перечислил несколько, которые мне интересны после прочтения о них и т. Д.,

Ответы [ 2 ]

6 голосов
/ 13 мая 2011

Вы всегда можете разыграть:

typedef bool (*funcptr)(uint, uint, uint, uint, char*);

funcptr draw = (funcptr)0x10057970;

или в C ++:

funcptr draw = reinterpret_cast<funcptr>(0x10057970);

Однако это совершенно неопределенное поведение.

Также, в общем, естьничто не мешает компилятору перемещать целевую функцию или даже полностью исключать ее, если он не видит, что она вызывается явно.

2 голосов
/ 13 мая 2011

Этот код компилируется (см. http://ideone.com/celq1):

typedef unsigned int uint ;
int main()
{
    bool (*draw)(uint, uint, uint, uint, const char*);
    draw = reinterpret_cast<bool (*)(uint, uint, uint, uint, const char*)>(0x10057970);
    draw(20, 20, 14, 255, "Text");
}

Но, конечно, это не работает: -)
PS Я изменил char* на const char*, чтобы избавиться от предупреждения компилятора. Похоже, что const char* это то, что вы хотите здесь, но это не является существенным для идеи.

Отредактировано, чтобы добавить: На самом деле, даже этот компилятор, если вы хотите произвести впечатление на своих друзей:

typedef unsigned int uint ;
int main()
{
    reinterpret_cast<bool (*)(uint, uint, uint, uint, const char*)>(0x10057970)
      (20, 20, 14, 255, "Text");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...