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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top