Trova l'indirizzo di una DLL in memoria
-
06-07-2019 - |
Domanda
Ho appena iniziato a programmare a basso livello (leggere / scrivere in memoria quel genere di cose) e ho riscontrato un problema a cui non riesco a trovare una risposta.
L'informazione da cui voglio leggere ha un indirizzo relativo a una DLL caricata nella memoria e, g, è su mydll.dll + 0x01234567. il problema che ho è che la dll si sposta in memoria ma l'offset rimane lo stesso. C'è comunque per scoprire la posizione di questa dll in memoria.
Attualmente sto provando a farlo preferibilmente in c # ma sarei grato per l'aiuto nella maggior parte delle lingue di alto livello.
Soluzione
Ho provato il metodo suggerito da Rob Walker e non sono riuscito a farlo funzionare (penso che non abbia funzionato perché la dll è stata caricata come parte di un altro eseguibile, quindi non è stata trovata così facilmente).
Ho comunque scoperto una soluzione che ha funzionato per me, quindi eccola qui:
ho creato un oggetto di tipo Processo
String appToHookTo = "applicationthatloadedthedll";
Process[] foundProcesses = Process.GetProcessesByName(appToHookTo)
ProcessModuleCollection modules = foundProcesses[0].Modules;
ProcessModule dllBaseAdressIWant = null;
foreach (ProcessModule i in modules) {
if (i.ModuleName == "nameofdlliwantbaseadressof") {
dllBaseAdressIWant = i;
}
}
ora hai il modulo che puoi semplicemente fare dllbaseAdressIWant.BaseAddress per ottenere il valore.
Spero che questo aiuti
Altri suggerimenti
Dal punto di vista di Win32 è necessario utilizzare GetModuleHandle e GetModuleInformation . Questi ti consentono di cercare il modulo gestito in base al nome e quindi recuperare le informazioni, incluso l'indirizzo di base relativo a tale handle.
Dovrebbe essere semplice avvolgere queste API usando i wrapper P / Invoke standard.