2015-09-03 7 views
15

Ho ragione nel pensare che non è il caso di ridefinire le nostre DLL durante la nostra build se usiamo ASLR dato che le dll verranno rideterminate comunque quando il kernel verrà a caricarle?ASLR significa che le dll di rebasing non sono richieste?

Sono preoccupato che la nostra applicazione venga spesso utilizzata sui computer di Servizi terminal. Quindi, se il rebasing si verifica al momento del caricamento, potremmo ritrovarci con le dll ripubblicate per ogni processo in cui sono caricate (ci sarebbe un processo per sessione). E questo comporterebbe un maggiore utilizzo di memoria e paging rispetto a quello che vogliamo pagare. Devo essere preoccupato?

Ho trovato il seguente post sul blog che dice che il rebasing si verifica solo una volta ed è a livello di sistema: Matt Evans - Enabling ASLR for memory savings?. Non ho visto altri riferimenti su questo, quindi volevo essere sicuro che se io uso ASLR e non rebase durante la nostra build non causerò problemi di memoria su una casella Servizi terminal?

+0

Un altro riferimento per eseguire il backup del bit "una sola volta e per tutto il sistema": Windows Internals, Sixth Edition, Part 2, p.249 lo dice direttamente. –

+0

E hai provato ad associare i debugger a più processi (in diverse sessioni) nella casella Servizi terminal? Questo dovrebbe mostrare qual è l'indirizzo della tua DLL. –

+0

https://blogs.msdn.microsoft.com/oldnewthing/20170118-00/ –

risposta

1

Quindi, in base alla mia lettura, non dovresti avere problemi. ASLR fa sì che la DLL sia caricata in un indirizzo di memoria semi-casuale e non dovrebbe semplicemente iniziare il rebasing per ogni processo. Se vuoi controllare l'uso della memoria di dll c'è uno strumento gratuito chiamato MassiveRebase che ti permette di caricare dinamicamente due dll e visualizzare informazioni sull'utilizzo della loro memoria. È stato progettato per visualizzare le modifiche che potrebbero avere sulla memoria. Lo strumento e di più su esso può essere trovato qui: http://www.tmurgent.com/appv/index.php/en/resources/tools/137-massive-rebase

Spero che questo aiuti.

-3

Il rebasso è ancora utile. Quando viene caricato il sistema operativo, applica un valore casuale fisso alla base DLL.

Il risultato è che il percorso in cui è caricata una DLL, è tipico per un singolo avvio, ma diverso tra macchine e stivali.

Ciò significa che una determinata DLL in molti processi può essere condivisa tra processi, poiché tutti i suoi dati di codice sono condivisi con lo stesso valore.

Quando una DLL viene spostata perché occupa lo spazio degli indirizzi, deve modificare le correzioni e meno la DLL è condivisa, aumentando il carico del sistema.

Se la DLL non è condivisa, non influisce sulle risorse.

Il costo di riparare una DLL era più economico se veniva caricato nella posizione corretta, non è sicuro se ciò fosse vero per ASLR, ma potrebbe comunque risparmiare tempo di caricamento delle risorse.

+0

Quando dici che "rebasing è ancora utile", vuoi dire che è utile rebase manualmente le mie DLL prima di spedirle? Se è così, perché? Oppure, vuoi dire che è ancora utile, ma non ho bisogno di farlo da solo perché ASLR fa sempre il rebasing in fase di runtime indipendentemente da qualsiasi rebasing manuale che faccio o non faccio prima della spedizione? –

+0

L'aslr non sposta la DLL in modo casuale; y. Senza di più, se ottieni scontri, li otterrai con aslr. Questi ritengo che rallenteranno il caricamento e aumenteranno l'utilizzo della memoria di sistema (meno memoria condivisa) – mksteve

+2

https://blogs.msdn.microsoft.com/oldnewthing/20170118-00/?p=95205 –