2011-09-15 21 views
7

Chcę zaciemnić moje pliki zespołu (* .dll, * .exe) przez Dotfuscator. moje pytanie brzmi: jeśli to zrobię, czy nadal mogę używać klas i typów, które są w tych złożeniach przez ich oryginalne imiona (mam na myśli imiona przed zaciemnianiem) i używając metod System.Reflection do pracy z nimi?Obfuscate Montaż i odbicie

Jeśli potrzebujesz więcej szczegółów, proszę mi powiedzieć

Odpowiedz

8

Obfuskacja to odbicie może spowodować pewien problem. Nawet jeśli skorzystasz z sugestii użycia opcji, aby nie zaciemnić metody publicznej, niektóre z odbitych kodów mogą wywoływać metodę prywatną. Problem polega na tym, że zaciemnianie zmieni nazwę jakiegoś kodu, który może być potrzebny, aby pozostać bez zmian.

Jeśli wiesz, czy można zlokalizować region, który jest podatny do stosowania z refleksji można użyć

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

Będzie to powiedzieć obfuscator zachować nazwę.

Running zaciemniania z refleksji wymaga więcej testów, który jest na pewno, ale nadal możliwe ...

1

Można użyć System.Reflection na ukrywane montażu, ale ponieważ niektóre z punktu zaciemniania jest, aby zmienić nazwę wszystkiego w zespole do przypadkowych i bezsensownych rzeczy, nie potrafimy zastanowić się nad tymi samymi nazwami i identyfikatorami, co w niezszlamionym zespole. Jeśli chcesz zrobić refleksję nad zaciemnionym zbiorem, musisz zrobić to w sposób, który nie jest zależny od typów i członków.

+1

członkowie Normalnie publiczne nie są ukrywane (lub przynajmniej istnieje opcja, aby nie zaciemniać członków publicznych) – xanatos

+0

@asbjornu - Czy istnieje jakaś metoda refleksji i uniknięcia używania nazwy członków? – amirhosseinab

+0

Rozwiązaniem (lub nie) byłoby utworzenie klasy statycznej, która posiada słownik System.Type, a następnie, gdy trzeba użyć refleksji, pobierz typ z tego słownika. Więc nie ważne, która nazwa metody/klasy stała się po obsfucator, nadal masz odniesienia do tego. Oczywiście, jeśli masz niepoliczalne typy w swoim zespole, skończysz z gigantem, bez jakiejkolwiek konstrukcji statycznej klasy statycznej, która mogłaby spowodować problemy z wydajnością w twojej aplikacji, a także nieobsługiwane wyjątki. –

0

Możesz stworzyć swoją własną mapę, aby uzyskać nowe nazwy od starych. Mapper musi napisać stół z jakimś na dysku/db z następującą strukturą: Module (wykonywalny), indeks, OriginalType, ObfuscatedType

Tworzenie „Mapper” aplikację konsoli, który działa w dwóch trybach w oparciu o argument: aplikację otrzyma jako argument wykonywalnego ścieżce

  1. zespół obciążenia
  2. GetTypes z loadedAssembly
  3. PreObfuscation usuwa wszystkie wpisy i pisze na nowo indeksy i wartości OriginalType. Aktualizacja PostObfuscation ObfuscatedType według indeksu. Zdarzenia po kompilacji musi być następująca:
    1. Mapper.exe "target.exe" "Pre"
    2. [zaciemniać]
    3. Mapper.exe "target.exe" "post"

Teraz potrzebujesz funkcji, aby uzyskaćObfuscatedName z OriginalName i gotowe.

Zauważ, że to rozwiązanie nie będzie działać z przycinanie jako liczbę typów zmieni i indeksy nie będą już meczem

OriginalAssembly.GetTypes() 

i

ObfuscatedAssembly.GetTypes()