2012-01-10 2 views
1

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

Приведенный ниже код неправильный, его просто то, что я думаю, возможно, придется сделать. Любая помощь о том, как это сделать в сборке и 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); 

ответ

3

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

Walking the Callstack

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

+0

Спасибо. Я надеялся, что мне не придется больше узнать об этом: D. – user954753

+0

@ user954753 Без проблем, надеюсь, статья сэкономит вам много часов горя :). –

0

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

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

+0

Спасибо за ваш быстрый ответ. :) – user954753

0

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

Возможны аналогичные процедуры для других платформ.

+0

Спасибо за информацию. Я буду смотреть в него. – user954753

4

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

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

#pragma intrinsic(_ReturnAddress) 

__declspec(noinline) 
void noinline_func(void) 
{ 
    printf("Return address from %s: %p\n", __FUNCTION__, _ReturnAddress()); 
} 
+0

Спасибо. Я закончил тем, что просто взял мой крючок и отследил назад. Приложение скрывало ординалы. Однако я буду использовать это в следующий раз. – user954753

Смежные вопросы