2011-09-15 17 views
7

Voglio offuscare i miei file assembly (* .dll, * .exe) per Dotfuscator. la mia domanda è se faccio questo, posso ancora usare classi e tipi che sono in quegli assembly con il loro nome originale (intendo i nomi prima dell'offuscamento) e usando i metodi System.Reflection per lavorare con loro?Obfuscate Assembly and Reflection

Se avete bisogno di maggiori dettagli, si prega di dirmi

risposta

8

L'offuscamento è Reflection può causare qualche problema. Anche se si suggerisce di utilizzare l'opzione per non offuscare il metodo pubblico, parte del codice riflesso può chiamare metodo privato. Il problema è che l'offuscamento cambierà il nome di un codice che potrebbe essere necessario per rimanere lo stesso.

Se si conosce o possibile individuare la regione che è suscettibile di essere utilizzato con la riflessione è possibile utilizzare

[global::System.Reflection.Obfuscation(Exclude=true, Feature="renaming")] 

Questo dirà l'obfuscator di mantenere il nome.

Esecuzione di offuscamento con la riflessione richiede ulteriori test questo è sicuro, ma ancora possibile ...

1

È possibile utilizzare System.Reflection su un assieme offuscato, ma dal momento che alcuni dei punti di offuscamento è rinominare tutto in assemblea in cose a caso e senza senso, è non è possibile fare riflessioni sugli stessi nomi e identificatori di quelli che si avrebbero in un'assemblea non offuscata. Se si desidera eseguire la riflessione su un assieme offuscato, è necessario eseguirlo in un modo che non dipenda dai tipi e dai membri nominati.

+1

membri Normalmente pubbliche non sono offuscati (o almeno c'è un'opzione per non offuscare i membri pubblici) – xanatos

+0

@asbjornu - Esiste un metodo per riflettere ed evitare di usare il nome dei membri? – amirhosseinab

+0

Una soluzione (o non) sarebbe creare una classe statica, che ha un dizionario System.Type e quindi quando è necessario utilizzare reflection, ottenere il tipo da questo dizionario. Quindi non importa quale nome il metodo/classe sia diventato dopo l'obsfucator, hai ancora un riferimento per questo. Naturalmente, se si dispone di tipi non numerabili nell'assieme, si finirà con un gigante, senza alcuna classe statica del modello di progettazione, che potrebbe causare problemi di esecuzione nell'applicazione e anche eccezioni non gestite. –

0

È possibile creare la propria mappa privato per ottenere nuovi nomi di quelli vecchi. Mapper deve scrivere tavolo di una sorta di disco/db con struttura seguente: Module (eseguibile), N, OriginalType, ObfuscatedType

Creare applicazione console "Mapper" che opera su due modi basati su un argomento: L'applicazione riceverà come argomento percorso eseguibile

  1. Assembly Load
  2. GetTypes da loadedAssembly
  3. PreObfuscation elimina tutte le voci e scrive nuovamente gli indici ei valori OriginalType. aggiornamenti PostObfuscation ObfuscatedType in base all'indice. Gli eventi post di compilazione devono essere le seguenti:
    1. Mapper.exe "target.exe" "Pre"
    2. [Oscurazione]
    3. Mapper.exe "target.exe" "Post"

Ora è necessario una funzione per getObfuscatedName da OriginalName e il gioco è fatto.

noti che questa soluzione non funzionerà con potatura come il numero di tipi cambierà e indici non corrispondono più tra

OriginalAssembly.GetTypes() 

e

ObfuscatedAssembly.GetTypes()