0

我正在尝试获取 .dll 中函数的句柄。我正在创建一个 CreateToolHelp32Snapshot,然后枚举模块,直到找到我想要的那个,从那个 .dll 中我想找到一个特定的函数。如何正确调用 GetProcAddress() 以便在“那个”.dll 中获取函数,而不是在另一个可能正在运行的实例中获取函数?

上述问题的延续将是,好的,所以我有一个函数的句柄,我该如何调用它?

编辑:正如已经指出的那样。我已经在第 3 方应用程序地址空间中。如果 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);
   }
}
4

2 回答 2

1

不可能,GetProcAddress() 需要模块句柄。HMODULE 仅在获得它的进程内有效。您必须执行与 GetProcAddress() 相同的操作,迭代 IAT 以找到入口点。并应用基地址偏移量。这对于另一个进程来说是非常痛苦的,因为您不能直接访问内存来读取 IAT。ReadProcessMemory 是必需的。

在目标进程中注入代码是唯一合理的方法。这也是我认为你接下来想做的事情所必需的,调用函数。codeproject.com 很好地介绍了代码注入技术

于 2011-01-06T19:40:10.580 回答
0

如果你在进行中,你就快到了。

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);
于 2011-01-06T20:29:04.770 回答