Нахождение адреса функции в C ++ - PullRequest
1 голос
/ 10 января 2012

Мне было интересно, знает ли кто-нибудь, как получить адрес функции, в которой вы находитесь. Допустим, я перехватываю MessageBoxA ().Когда вызывается MessageBoxA (), я называю меня псевдо-функцией hookMessageboxA ().Изнутри hookMessageBoxA () я хочу показать, откуда была вызвана MessageBoxA ().Имеет ли это смысл?Использование ассемблера, вероятно, необходимо, но я не уверен, как это можно сделать.

Приведенный ниже код неверен, я думаю, что это нужно сделать.Любая помощь о том, как сделать это в ассемблере и C ++, с благодарностью !!!!!

DWORD address = 0x00;
_asm {
    mov address, ebp
}
DWORD keyPointerAddr = (DWORD)hInstance + 0x1000 - address + 0x00401000;
char str[255];
    sprintf(str,"That call is coming from [%d]\n", keyPointerAddr);

Ответы [ 4 ]

4 голосов
/ 10 января 2012

Вам не нужно использовать какие-либо API. MSVC предоставляет собственный , чтобы получить только обратный адрес:

#include <stdio.h>
#include <intrin.h>

#pragma intrinsic(_ReturnAddress)

__declspec(noinline)
void noinline_func(void)
{
   printf("Return address from %s: %p\n", __FUNCTION__, _ReturnAddress());
}
3 голосов
/ 10 января 2012

Интересующая вас функция (если вы используете Windows) - StackWalk64 . Я бы посоветовал прочитать следующую статью, чтобы узнать, как использовать эту функцию:

Прогулка по стеку

Анализ кода должен дать вам именно то, что вы ищете, хотя и в зависимости от ОС - единственный путь. Статья должна оказаться удобной, но это не самая дружелюбная функция:).

0 голосов
/ 10 января 2012

Невозможно в стандартном C ++ ... Но возможно при знании того, как конкретный компилятор выполняет компиляцию и выполнение кода, а также с помощью диагностических хуков.Например, в Mac OS X вы можете использовать функции backtrace () или backtrace_symbols ().Обратитесь к документации по вашей платформе для получения дополнительной информации.

Могут быть аналогичные процедуры для других платформ.

0 голосов
/ 10 января 2012

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

В противном случае выпридется идти текущим стеком.Взгляните на StackWalk64 и связанные функции, или DIA SDK (очевидно, я никогда не смотрел на это, хотя).Конечно, это специфично для MS.У других платформ есть другие методы (как сказал другой человек, которого я только что забыл).В противном случае вы можете вручную пройтись по стеку (если вы знаете ABI и можете получить доступ к указателю стека вашей платформы).

...