2012-09-06 14 views
2

這是一個內置於Windows的DLL,odbc32.dll。該功能被稱爲LoadTraceDll()如果我有它的符號,如何找到參數簽名並在DLL中調用未導出的方法?

在Visual Studio 2008將StackFrame是:

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  

回答

1

如何確定的參數類型和返回類型(方法簽名)?

你不行。 (你可以達到一定程度的自信,但它需要很好的逆向工程技能,你必須拆開庫,找出函數是如何定義和調用的,以及從典型的操作順序和參數/變量的大小,你可以推斷出的參數的類型和返回值什麼都可以

我該如何稱呼呢?我可以避免調用它的相對地址嗎?

你可以dlopen() ......呃...... LoadLibrary()的DLL,然後使用GetProcAddres()得到它的地址,將其存儲在一個函數指針,然後調用它:

HMODULE hndl = LoadLibrary("My.DLL"); 
void (*func)() = GetProcAddress(hndl, "MyFunction"); 
func(); 
+0

這就是我所害怕的。 –

+0

@JustinDearing如果你想有方法簽名,切換到Objective-C和類轉儲庫被反向工程:P – 2012-09-06 21:33:15

+0

(無論如何,iOS開發比Windows更酷...) – 2012-09-06 21:33:34

1

如果你有符號(PDB文件),您可以檢索未導出的符號及其簽名(如果這些符號是公開的)(按照PDB公開與私有的說法)。使用DIA,您可以將符號與關聯的圖像文件進行匹配。有關PDB符號與圖像之間的映射如何工作的示例,請參閱here

+1

這看起來很有前途,讓我們看看如何這個兔子洞很深。 –

相關問題