Как найти сигнатуру аргумента для и вызвать неискаженный метод в DLL, если у меня есть символ для него?

Это DLL, встроенная в Windows, 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

2

Решение

Как определить типы параметров и тип возвращаемого значения (сигнатура метода)?

Ты не можешь

(Ну, вы можете, с определенным уровнем уверенности, но это требует больших навыков обратного инжиниринга. Вы должны разобрать библиотеку, выяснить, как определяется и вызывается функция, и из типичных последовательностей операций и размеров параметров / переменных вы можно сделать вывод, что тип аргументов и возвращаемое значение может быть)

Как я это называю? Могу ли я не называть его относительный адрес?

Вы можете dlopen()… э-э … LoadLibrary() DLL, а затем получить ее адрес с помощью GetProcAddres(), сохраните его в указателе функции, затем вызовите его:

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

Другие решения

Если у вас есть символы (файл PDB) изображения, вы можете получить неэкспортированные символы и их подписи, если они являются общедоступными (на языке PDB: общедоступный или частный). С помощью DIA Вы можете сопоставить символы с соответствующим файлом изображения. Увидеть Вот для примера того, как работает отображение между символами PDB и изображением.

1

По вопросам рекламы [email protected]