Obfuscate Assembly and Reflection

前端 未结 4 1986
抹茶落季
抹茶落季 2021-02-15 23:55

I want to obfuscate my assembly files (*.dll, *.exe) by Dotfuscator. my question is if I do this, can I still use classes and types that are in those assemblies

相关标签:
4条回答
  • 2021-02-16 00:33

    You can create your own private map to get new names from old ones. Mapper must write table of a sort to disk/db with following structure: Module(executable),Index,OriginalType,ObfuscatedType

    Create "Mapper" console application that operates on two modes based on an argument: The application will receive as argument executable path

    1. Load Assembly
    2. GetTypes from loadedAssembly
    3. PreObfuscation deletes all entries and writes anew the indexes and OriginalType values . PostObfuscation updates ObfuscatedType by index. The post build events must be as follows:
      1. Mapper.exe "target.exe" "Pre"
      2. [Obfuscate]
      3. Mapper.exe "target.exe" "Post"

    Now you need a function to getObfuscatedName from OriginalName and you're done.

    Note that this solution will not work with pruning as the number of types will change and indexes will no longer match between

    OriginalAssembly.GetTypes()
    

    and

    ObfuscatedAssembly.GetTypes()
    
    0 讨论(0)
  • Read for example here http://msdn.microsoft.com/en-us/library/ms227298(v=vs.80).aspx There is a "library mode" to disable obfuscation of public members. Otherwhise you probably won't be able to access the methods. There is an attribute to control obfuscation at type level: http://msdn.microsoft.com/en-us/library/ms227281(v=vs.80).aspx

    0 讨论(0)
  • 2021-02-16 00:43

    Obfuscation are Reflection can cause you some problem. Even if you take the suggestion to use option to not obfuscate public method, some of the reflected code may call private method. The problem is that obfuscation will change name of some code that you may need to stay the same.

    If you know or can locate the region that is susceptible to be used with reflection you can use

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

    This will tell the obfuscator to keep the name.

    Running obfuscation with reflection require more testing that's for sure but still possible...

    0 讨论(0)
  • 2021-02-16 00:46

    You can use System.Reflection on an obfuscated assembly, but since some of the point of obfuscation is to rename everything in the assembly into random and meaningless things, you can't do reflection on the same names and identifiers as you would in a non-obfuscated assembly. If you want to do reflection on an obfuscated assembly, you would need to do it in a way that aren't dependent on what types and members are named.

    0 讨论(0)
提交回复
热议问题