2011-07-18 9 views
7

私は仮想マシンのネイティブ呼び出しバインディングを作成しています。この機能の1つは、標準のlibc関数を実行時に名前で検索することです。私がmsvcrtモジュールへのハンドルを取得する必要があるので、ウィンドウにこれは少し面倒になります。現在、プロセスにロードされています。通常これはmsvcrt.dllですが、別の亜種(msvcr100.dllなど)であっても、異なる名前のバリアントが使用された場合はGetModuleHandle( "msvcrt")の呼び出しが失敗する可能性があります。Win32でfunc ptrからモジュールHANDLEを取得するには?

私ができることを望むのは逆参照で、libc(豊富にある)から関数ポインタを取り出し、それを提供するモジュールへのハンドルを取得します。基本的には、このような何か:

HANDLE hlibc = ReverseGetModuleHandle(fprintf); // Any func from libc should do the trick 
void *vfunc = GetProcAddress(hlibc); 

は、プロセスハンドルとシンボルテーブルを手動で散歩に下降せずに、Win32 APIのであり、そのようなものですか?逆に、私が問題を過剰に考えているなら、win32上でlibc関数を名前で検索する方が簡単ですか?

答えて

8
MEMORY_BASIC_INFORMATION mbi; 
HMODULE mod; 
if (VirtualQuery(vfunc, &mbi, sizeof(mbi))) 
{ 
    mod = (HMODULE)mbi.AllocationBase; 
} 
+0

これはどのように正確に役立ちますか? –

+0

私は何が欠けていますか? –

+0

これは、コードアドレスからモジュールハンドルを見つけるためのよく知られたショートカットです。モジュールはWindowsの16ビット版からの日付を返します.32ビット版と64ビット版のWindowsでは、モジュールハンドルは単純にメモリ割り当てのベースアドレスです。私はこれが失敗したのを見たことがなく、私のコードで同じトリックを使用しています。 –

0

残念ながら、あなたが恐れているようにモジュールを歩かなければなりません。しかしそれほど悪くはない。

MODULEENTRY32 me = {0}; 
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0); 

me.dwSize = sizeof me; 
Module32First(hSnapshot, &me); 
    if(me.modBaseAddr <= funcPtr && 
     (me.modBaseAddr + me.modBaseSize) > funcPtr) { 
    ... 
    break; 
    } 
do { 
} while(Module32Next(hSnapshot, &me)); 

CloseHandle(hSnapshot); 
14

実際に使用して:: GetModuleHandleEx()APIをして、モジュールのロードアドレスを取得する文書方法が存在する:ここでのアイデア、メモ帳に書かれたいくつかのコードです。この機能で唯一可能性がある欠点は、Win2Kではサポートされていないことです。これは現在のところ障害ではないかもしれません。ここ はサンプルです:参考

HMODULE hmodule = NULL; 

::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast<LPCTSTR>(address), &hmodule); 
// hmodule should now refer to the module containing the target address. 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683200(v=vs.85).aspx

UPD:あなたがまた見つかったモジュールのロックセマンティクスを避けるためにGET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNTフラグを指定することもできます。

+1

また、GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNTを指定すると、参照カウントは増加せず、関数はGetModuleHandle()のように動作します。 – pHiL

関連する問題