2012-01-10 11 views
1

あなたがいる関数のアドレスを取得する方法を知っている人がいたら、私はMessageBoxA()をフックしています。 MessageBoxA()が呼び出されると、私はhookMes​​sageboxA()という擬似関数を呼び出します。 hookMes​​sageBoxA()内から、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

はあなたが後にしている正確に何を与える必要があり、OSに依存する方法でいえ - のみ方法。記事は便利ですが、それは友好的な機能ではありません:)。

+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

ありがとうございます。私はちょうど私のフックをbpingして戻ってトレース。アプリケーションは、序列を隠していました。しかし、私はこの次回を使用します。 – user954753