2

これは、Windows に組み込まれている dll、odbc32.dll です。関数は LoadTraceDll() と呼ばれます

Visual Studio 2008 のスタックフレームは次のとおりです。

odbc32.dll!LoadTraceDll() + 0x42f バイト

PE アナライザーを使用しましたが、odbc32.dll のエクスポート リストに表示されません。

私の質問は次のとおりです。

  • パラメーターの型と戻り値の型 (メソッド シグネチャ) を確認するにはどうすればよいですか?
  • どうやって呼ぶの?相対アドレスの呼び出しを避けることはできますか?

完全なスタック トレースは次のとおりです。

ODBCTracer.dll!TraceVersion()  Line 2259    C++
odbc32.dll!LoadTraceDll()  + 0x42f bytes    
odbc32.dll!FInitTrace()  + 0xf3 bytes   
odbc32.dll!DllMain()  + 0x14692 bytes   
odbc32.dll!_CRT_INIT()  - 0x3e3 bytes   
ntdll.dll!LdrpRunInitializeRoutines()  + 0x1e8 bytes    
ntdll.dll!LdrpLoadDll()  - 0x336 bytes  
ntdll.dll!LdrLoadDll()  + 0x9e bytes    
KernelBase.dll!LoadLibraryExW()  + 0x13f bytes  
odbccp32.dll!LoadDM()  + 0x2a bytes 
odbccp32.dll!TracingPageProc()  + 0xc46 bytes   
user32.dll!UserCallDlgProcCheckWow()  - 0x180d bytes    
user32.dll!DefDlgProcWorker()  + 0xba bytes 
user32.dll!DefDlgProcW()  + 0x36 bytes  
user32.dll!UserCallWinProcCheckWow()  + 0x11d bytes 
user32.dll!InternalCreateDialog()  - 0xc7 bytes 
user32.dll!CreateDialogIndirectParamAorW()  + 0x5b bytes    
user32.dll!CreateDialogIndirectParamW()  + 0x18 bytes   
comctl32.dll!_CreatePageDialog()  + 0xb1 bytes  
comctl32.dll!_CreatePage()  + 0x161 bytes   
comctl32.dll!PageChange()  + 0xca bytes 
comctl32.dll!PropSheetDlgProc()  + 0x36e bytes  
user32.dll!UserCallDlgProcCheckWow()  + 0x11b bytes 
user32.dll!DefDlgProcWorker()  + 0xba bytes 
user32.dll!DefDlgProcW()  + 0x36 bytes  
user32.dll!UserCallWinProcCheckWow()  + 0x11d bytes 
user32.dll!SendMessageWorker()  + 0x158 bytes   
user32.dll!SendMessageW()  + 0x5d bytes 
comctl32.dll!CCSendNotify()  + 0xfbd bytes  
comctl32.dll!SendNotifyEx()  + 0x80 bytes   
comctl32.dll!ChangeSel()  + 0x2dc bytes 
comctl32.dll!Tab_OnLButtonDown()  + 0xfc bytes  
comctl32.dll!Tab_WndProc()  + 0x56d bytes   
user32.dll!UserCallWinProcCheckWow()  + 0x11d bytes 
user32.dll!DispatchMessageWorker()  + 0x12a bytes   
user32.dll!IsDialogMessageW()  + 0x102 bytes    
comctl32.dll!Prop_IsDialogMessage()  + 0x1f0 bytes  
comctl32.dll!_RealPropertySheet()  + 0x31b bytes    
comctl32.dll!_PropertySheet()  + 0x55 bytes 
odbccp32.dll!MainSheet()  + 0x18c bytes 
odbccp32.dll!SQLManageDataSources()  + 0x4b bytes   
odbcad32.exe!WinMain()  + 0x25b bytes   
odbcad32.exe!ODBC___GetSetupProc()  + 0x4ae bytes   
kernel32.dll!BaseThreadInitThunk()  + 0xd bytes 
ntdll.dll!RtlUserThreadStart()  + 0x21 bytes    
4

2 に答える 2

1

パラメーターの型と戻り値の型 (メソッド シグネチャ) を確認するにはどうすればよいですか?

できません。

(ある程度の自信を持って実行できますが、それには優れたリバース エンジニアリングのスキルが必要です。ライブラリを逆アセンブルし、関数がどのように定義されて呼び出されるかを調べ、典型的な操作シーケンスとパラメーター/変数のサイズから、引数の型と戻り値が何であるかを推測できます)

どうやって呼ぶの?相対アドレスの呼び出しを避けることはできますか?

あなたはdlopen()...ええと... LoadLibrary()DLLを使用してそのアドレスを取得しGetProcAddres()、それを関数ポインタに格納してから呼び出すことができます:

HMODULE hndl = LoadLibrary("My.DLL");
void (*func)() = GetProcAddress(hndl, "MyFunction");
func();
于 2012-09-06T21:27:31.903 に答える
1

イメージのシンボル (PDB ファイル) がある場合、エクスポートされていないシンボルとその署名が公開されている場合は、それらを取得できます (PDB の公開と非公開の用語で)。DIAを使用すると、シンボルを関連する画像ファイルと一致させることができます。PDB シンボルと画像の間のマッピングがどのように機能するかの例については、こちらを参照してください。

于 2012-09-07T11:32:48.160 に答える