Найти загруженную библиотеку DLL с помощью CreateToolHelp32Snapshot, найти функцию в библиотеке DLL и затем вызвать ее, GetProcAddress
Я пытаюсь получить ручку для функции в.dll. Я создаю CreateToolHelp32Snapshot, а затем перечисляю модули, пока не найду тот, который мне нужен, из этой.dll, которую я хочу найти определенную функцию. Как правильно вызвать GetProcAddress(), чтобы я получал функцию в этом ".dll", а не другой экземпляр, который может работать?
Тогда я продолжу вопрос, описанный выше, так что у меня есть дескриптор функции, как я могу ее вызвать?
РЕДАКТИРОВАТЬ: Как уже было указано. Я уже в адресном пространстве стороннего приложения. Если getprocaddress не будет работать, как мне получить точку входа для функции, используя readprocessmemory и необходимое смещение?
Благодарю.
HANDLE h_th_32snap = CreateToolhelp32Snapshot(0x8u, pid);
if( h_th_32snap == INVALID_HANDLE_VALUE )
{
printError( TEXT("CreateToolhelp32Snapshot (of modules)") );
return( FALSE );
}
// Set the size of the structure before using it.
me32.dwSize = sizeof( MODULEENTRY32 );
// Retrieve information about the first module,
// and exit if unsuccessful
if( !Module32First( h_th_32snap, &me32 ) )
{
printError( TEXT("Module32First") ); // show cause of failure
CloseHandle( h_th_32snap ); // clean the snapshot object
return( FALSE );
}
// Now walk the module list of the process,
// and display information about each module
BYTE *d_pointer_qtgui4_dll = 0x0;
do
{
_tprintf( TEXT("\n\n MODULE NAME: %s"), me32.szModule );
_tprintf( TEXT("\n Executable = %s"), me32.szExePath );
_tprintf( TEXT("\n Process ID = 0x%08X"), me32.th32ProcessID );
_tprintf( TEXT("\n Ref count (g) = 0x%04X"), me32.GlblcntUsage );
_tprintf( TEXT("\n Ref count (p) = 0x%04X"), me32.ProccntUsage );
_tprintf( TEXT("\n Base address = 0x%08X"), (DWORD) me32.modBaseAddr );
_tprintf( TEXT("\n Base size = %d"), me32.modBaseSize );
if(!wcsncmp(me32.szModule, L"QtGui4.dll", 255))
{
FARPROC test = GetProcAddress(GetModuleHandle( L"QtGui4.dll"),"?rowsInserted@QListView@@MAEXABVQModelIndex@@HH@Z");
}
} while( Module32Next( h_th_32snap, &me32 ) );
CloseHandle( h_th_32snap );
Грег, мне было бы интересно узнать, почему это не так? Не выдает никаких ошибок, но и не работает!
прототип функции:
QWidget * QWidget::find ( WId id ) [static];
Моя попытка назвать это:
hDLL = GetModuleHandle( L"QtGui4.dll");
if (hDLL != NULL)
{
func pointer_find = (func)GetProcAddress(hDLL,"?find@QWidget@@SAPAV1@PAUHWND__@@@Z");
if (!pointer_find)
{
// handle the error
FreeLibrary(hDLL);
//return SOME_ERROR_CODE;
}
else
{
// call the function
widget = pointer_find(my_hwnd);
}
}
2 ответа
Невозможно, GetProcAddress() требует дескриптор модуля. HMODULE действителен только внутри процесса, в котором он был получен. Вы должны будете сделать то же, что и GetProcAddress (), итерируя IAT, чтобы найти точку входа. И применить смещение базового адреса. Это непросто сделать для другого процесса, поскольку вы не можете получить прямой доступ к памяти для чтения IAT. Требуется ReadProcessMemory.
Внедрение кода в целевой процесс - единственный разумный подход. Что также требуется для того, чтобы сделать то, что, я полагаю, вы захотите сделать дальше, вызвать функцию. Методы внедрения кода хорошо описаны на codeproject.com
Если вы находитесь в процессе, вы почти там.
GetModuleHandle получит в настоящий момент загруженный дескриптор модуля по сравнению с LoadLibrary, который загрузит модуль (и увеличит количество ссылок). Просто нужен правильный прототип для функции.
typedef void __thiscall (QListView::*rowsInserted)(class QModelIndex const &,int,int);
rowsInserted test = (rowsInserted)GetProcAddress(GetModuleHandle( L"QtGui4.dll"),"?rowsInserted@QListView@@MAEXABVQModelIndex@@HH@Z");
//QListView *object
if( test && object )
(object.*test)(my_QModelIndex, int_x, int_y);