Найти загруженную библиотеку 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);
Другие вопросы по тегам