rechercher une dll chargée à l’aide de CreateToolHelp32Snapshot, rechercher une fonction dans la dll puis l’appeler, GetProcAddress

J’essaie d’obtenir une poignée pour une fonction dans un fichier .dll. Je crée un CreateToolHelp32Snapshot et énumère ensuite les modules jusqu’à ce que je trouve celui que je veux, à partir de ce fichier .dll, je veux trouver une fonction particulière. Comment appeler correctement GetProcAddress () afin d’obtenir la fonction dans ‘that’ .dll plutôt que dans une autre instance en cours d’exécution?

La suite de la question ci-dessus serait alors, ok, donc j’ai un descriptif de la fonction, comment puis-je l’appeler?

EDIT: Comme cela a déjà été souligné. Je suis déjà dans l’espace adresse de l’application tierce. Si getprocaddress ne fonctionne pas, comment puis-je obtenir le point d’entrée de la fonction à l’aide de readprocessmemory et du décalage nécessaire?

Merci.

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 ); // Resortingeve 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 ); 

Greg, je serais intéressé de savoir pourquoi c’est faux? Cela ne génère aucune erreur, mais cela ne fonctionne pas non plus!

prototype de fonction:

 QWidget * QWidget::find ( WId id ) [static]; 

Ma tentative pour l’appeler:

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

Impossible, GetProcAddress () nécessite un descripteur de module. Un HMODULE n’est valide que dans le processus dans lequel il a été obtenu. Vous devrez faire le même genre de chose que GetProcAddress (), en effectuant une itération de l’IAT pour trouver le point d’entrée. Et appliquez le décalage d’adresse de base. Cela est plus pénible à faire pour un autre processus puisque vous ne pouvez pas accéder directement à la mémoire pour lire l’IAT. ReadProcessMemory est requirejs.

L’injection de code dans le processus cible est la seule approche raisonnable. Ce qui est également nécessaire pour faire ce que je suppose que vous voudriez faire ensuite, appelez la fonction. Les techniques d’injection de code sont bien couvertes sur codeproject.com

Si vous êtes en cours, vous y êtes presque.

GetModuleHandle obtiendra un descripteur de module actuellement chargé, comparé à LoadLibrary qui chargera un module (et augmentera le nombre de références). Juste besoin du bon prototype pour la fonction.

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