2012-09-25 22 views
5

Ho un programma funzionante che carica i plugin con LoadLibrary.Intervallo di indirizzi di una libreria caricata dinamicamente in Windows

Nuovo requisito: ad un certo punto nel codice, mi viene fornito un puntatore e ho bisogno di verificare se questo puntatore punta al codice o ai dati statici di un plugin.

Equivalentemente, ho bisogno di recuperare il plugin in cui punta un puntatore, se presente. Devo anche sapere se il puntatore punta al codice del programma principale o ai dati statici (e idealmente, distinguere tra aree di sola lettura e di lettura-scrittura).

HMODULE plugin_containing_pointer(void *p); 

equivalente, ho bisogno di essere in grado di recuperare l'estensione (indirizzo e dimensione) a cui viene mappato un plugin. Ho anche bisogno di queste informazioni per il programma principale.

Come è possibile implementare is_pointer_into_plugin o plugin_containing_pointer o qualcosa di equivalente?

Posso cambiare la chiamata a LoadLibrary se necessario. La ricerca dovrebbe essere ragionevolmente veloce possibile, il codice di caricamento non deve essere veloce. L'esecuzione dei plug-in in processi separati e la comunicazione attraverso la memoria condivisa non è un'opzione. Il programma deve essere eseguito su Windows XP e versioni successive (e Linux, ma è another question).

Le informazioni di cui ho bisogno sono più o meno quali sono i rapporti dell'utilità Sysinternals listdlls, quindi ho cercato di scoprire come è implementato. Ho visto un suggestion di utilizzare NtQueryInformationProcess per recuperare una struttura PEB che collega a LDR_DATA_TABLE_ENTRY. Sembra essere molto promettente, ma:

  • posso vedere un DllBase che sembra che potrebbe essere l'indirizzo di partenza di ogni DLL (è?), Ma nessun formato.
  • La documentazione di NtQueryInformationProcess lo segnala come non importabile, ma non suggerisce un'alternativa per quello che sto cercando di fare.
  • Sul mio sistema, gli unici campi in PEB sono BeingDebugged e SessionId, più alcuni array di byte ReservedN - non un buon segno.

Come è possibile enumerare l'intervallo di indirizzi dei plug-in o verificare se un puntatore si trova all'interno di un plug-in o determinare a quale plug-in punta un puntatore?

risposta

4

GetModuleHandleEx con il flag GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS indica quale modulo punta verso il puntatore. Da ciò puoi studiare le intestazioni dei moduli per capire quale sezione. Ma l'intero esercizio ha un odore strano. Perché ti interessa a quale plugin punta un puntatore?