跳到主要内容

对程序集大小的影响

由于混淆修改了dll代码,混淆后程序集大小会发生改变。一般来说,除了Symbol Obfus会减少程序集大小外,其余混淆Pass都会增加程序集大小,但每种Pass的影响不一样。

我们在内部的测试程序集Tests上测量了各个Pass对最终dll大小的影响。

测试数据

状态最终大小(单位k)大小增加百分比
原始文件6980%
禁用所有Pass681-2.4%
开启Const Encryption94134.8%
开启 Field Encryption683-2.1%
开启 Symbol Obfus652-6.6%
开启 Call Obfus, Proxy Mode为Dispatch79413.8%
开启 Call Obfus,Proxy Mode为Delegate100143.4%
开启Expr Obfus7527.7%
开启Eval Stack Obfus, obfuscationPercentage=0.0579426.4%
开启Eval Stack Obfus, obfuscationPercentage=1.03672426%
开启 Control Flow Obufs81917.3%
开启除了Eval Stack Obufs以外的所有Pass,Call Obfus Proxy Mode为dispatch93834.4%
开启所有Pass,Call Obfus Proxy Mode为dispatch,Eval Stack Obufs obfuscationPercentage=0.051464109%
开启所有Pass,Call Obfus Proxy Mode为dispatch,Eval Stack Obufs obfuscationPercentage=0.52797300%

有几个注意点:

  • 禁用所有Pass时输出的程序集大小比未混淆时减少了17k。我们猜测是使用dnlib重新导出dll后由于dll布局与原始dll不一样导致的。
  • Field Encryption 对混淆后文件大小几乎没有影响,是因为默认不会对任何字段执行加密,必须显式在规则文件中指定某个字段需要字段加密后才会生效。

结论

  • Eval Stack Obfus、Const Encryption、Call Obfus(Delegate) Pass对最终的文件大小影响比较大,其他影响都比较小
  • Eval Stack Obfus 如果obfuscationPercentage=1.0,会巨幅影响最终的dll大小。因此obfuscationPercentage的全局默认值(即规则文件中global中配置的obfuscationPercentage值)建议不要超过0.1
  • Call Obfus的Proxy Mode选择Dispatch,相比于Delegate,最终生成的dll文件要显著减少30%。
  • Symbol Obfus 大多数情况下可以稍微减少最终的dll大小,因为混淆名一般要比原始名更短。