2012-06-10 6 views
5

Ho disassemblato una DLL e vedo alcune funzioni. Ho trovato la funzione di cui ho bisogno e il suo indirizzo è 0x10001340.è possibile modificare l'indirizzo della funzione nella DLL se è caricato sull'applicazione?

Questo indirizzo rimane lo stesso, se carico questa DLL nella mia applicazione? Quindi sarebbe possibile chiamare questa funzione tramite il suo indirizzo dalla mia applicazione?

Mi chiedo perché non sono sicuro: cosa succede se quando questa DLL è stata caricata, alcune funzioni nell'applicazione principale hanno già lo stesso indirizzo? Quindi forse le funzioni all'interno di una DLL possono cambiare gli indirizzi durante il caricamento o ecc.

+0

Hai capito bene ... –

+0

giusto su quale opzione? : L'indirizzo D può cambiare quando caricato? – Kosmos

risposta

8

Su Windows le DLL hanno un indirizzo di caricamento preferenziale, ma il caricatore è in grado di modificare tutti quei riferimenti se nota che tale porzione dello spazio di indirizzamento virtuale è già usato. Questo processo è chiamato "rebasing".

L'indirizzo di base "predefinito" è specificato al momento del collegamento (/BASE con il linker Microsoft) e può essere utile impostarlo su un valore diverso da quello predefinito se si prevede di utilizzare la dll insieme a un'altra con il stesso indirizzo di base; questo accelera il processo di caricamento, dal momento che il caricatore non deve rebase una delle dll ad ogni carico. (IIRC ci sono anche strumenti che sono in grado di rifare una dll esistente e salvare il risultato su disco)

È bene tenere a mente che, da Windows Vista in poi, le DLL compilate con un flag specificato vengono caricate sempre a caso indirizzo di base per evitare qualche tipo di exploit.

3

È estremamente improbabile che si finirà con lo stesso indirizzo. L'argomento predefinito/BASE per il linker per le DLL è 0x10000000, ecco come il tuo punto di accesso è finito a quell'indirizzo. Ma ci sono molte DLL collegate usando l'impostazione predefinita, solo una può effettivamente essere caricata a quell'indirizzo. Tutti gli altri che vengono caricati in seguito devono essere ri-basati.

È possibile ottenere un valore migliore per/BASE, tuttavia non è mai una garanzia che si ottenga l'indirizzo di carico richiesto.

2

Come ha detto Matteo, una DLL ha un indirizzo di caricamento preferito (specificato nel campo ImageBase della struttura IMAGE_OPTIONAL_HEADER). Quando il sistema tenta di caricare una DLL, la caricherà a questo indirizzo, se possibile (a meno che la randomizzazione dello spazio indirizzo non sia abilitata) e non sia richiesto alcun "patching". Se non è possibile caricare all'indirizzo preferito, la DLL viene riposizionata, il che richiederà la presenza di riferimenti assoluti nella DLL da correggere per compensare il riposizionamento.

Quindi, per rispondere alla tua domanda: Non c'è alcuna garanzia che una DLL verrà caricata al suo indirizzo preferito. Una volta caricati, i carichi successivi non caricheranno più copie della DLL, quindi gli indirizzi non cambieranno. Tuttavia una volta scaricato (le DLL sono conteggiate con riferimento) non è garantito che verrà caricato lo stesso indirizzo la prossima volta.

Problemi correlati