跳到主要内容
版本:v3.x

执行栈混淆

注意

自v3.0.0版本起,执行栈混淆pass已被禁用,即使在ObfuscationPasses中开启EvalStackObfus也不会生效。 原因是该pass的性价比过低。如果后续无法优化,该功能可能会被移除。

对虚拟机运行过程中的执行栈进行随机混淆,提高逆向难度。

实现原理​

检查所有对执行栈进行压栈操作的IL指令,如果压入的是int、long、float、double类型的数据,则随机插入混淆代码。插入的混淆代码与表达式混淆有相似之处。

设置​

ObfuzSettings.EvalStackObfusSettings中包含常量加密相关设置,详细见文档设置。

规则文件​

默认情况下Obfuz会加密所有函数调用,但也支持规则文件精细地控制常量加密的范围和效果。EvalStackObfusSettings.RuleFiles选项中可以配置0-N个规则文件。 规则文件的相对路径为项目目录,有效的规则文件路径类似这样:Assets/XXX/YYY.xml。

配置示例如下:

<?xml version="1.0" encoding="UTF-8"?>

<obfuz>

<global obfuscationLevel="Basic" obfuscationPercentage="0.05">

</global>

<assembly name="Obfus2">
<type name="*.TestNotObfusAnyMethods" obfuscationLevel="None"/>
<type name="*.TestObfusAll" obfuscationLevel="Advanced"/>
<type name="*.TestObfusSomeMethods" >
<method name="Foo" obfuscationLevel="MostAdvanced"/>
</type>
</assembly>
</obfuz>
  • 顶层tag必须是obfuz
  • 次级tag可以是global及assembly

global​

global中定义了全局默认加密参数,。

属性可空默认值描述
obfuscationLevel是None混淆级别,可以取None、Basic、Advanced、MostAdvanced这几个值
obfuscationPercentage是0.05混淆概率。取值[0 - 1]之间。由于Eval Stack Obfuscation会巨幅增加最终dll大小,建议本参数的值不要超过0.1

assembly​

属性可空默认值描述
name否程序集名,必须在混淆程序集列表中
其他是继承global中同名选项global中所有选项都可以使用,如果未定义,就继承global中同名选项的值

assembly的子元素只能为type。

type​

属性可空默认值描述
name否类型名的通配字符串,如果为空表示匹配所有类型
其他是继承assembly中同名选项global中所有选项都可以使用,如果未定义,就继承assembly中同名选项的值

由于函数调用只能出现在函数代码中,因此type的子元素只能为method。

method​

属性可空默认值描述
name否类型名的通配字符串,如果为空表示匹配所有类型
其他是继承assembly中同名选项global中所有选项都可以使用,如果未定义,就继承assembly中同名选项的值