найти загруженную библиотеку DLL с помощью CreateToolHelp32Snapshot, найти функцию в библиотеке DLL и затем вызвать ее, GetProcAddress - PullRequest
0 голосов
/ 06 января 2011

Я пытаюсь получить дескриптор функции в .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 ]

1 голос
/ 06 января 2011

Не возможно, GetProcAddress () требует дескриптор модуля.HMODULE действителен только внутри процесса, в котором он был получен.Вы должны будете сделать то же, что и GetProcAddress (), итерируя IAT, чтобы найти точку входа.И применить смещение базового адреса.Это непросто сделать для другого процесса, поскольку вы не можете напрямую получить доступ к памяти для чтения IAT.Требуется ReadProcessMemory.

Внедрение кода в целевой процесс является единственным разумным подходом.Что также требуется, чтобы сделать то, что, как я полагаю, вы захотите сделать дальше, вызовите функцию.Методы внедрения кода подробно описаны на codeproject.com

0 голосов
/ 06 января 2011

Если вы находитесь в процессе, вы почти на месте.

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);
...