本项目为使用Unity-Obfuscator插件进行混淆的演示项目,游戏项目为Unity AssetStore上的官方资源2D Rouguelike。
此项目使用的Unity版本为2017.4.34f1。
WhiteList-NameObfuscate-NamespaceNameOnly.txt
Completed
WhiteList-NameObfuscate-ClassNameOnly.txt
Completed|BoardManager
Completed|Enemy
Completed|GameManager
Completed|Loader
Completed|MovingObject
Completed|Player
Completed|SoundManager
Completed|Wall
WhiteList-NameObfuscate-Method.txt
Completed|GameManager|HideLevelImage
Completed|GameManager|CallbackInitialization
Completed|Player|Restart
WhiteList-CodeInject-Class
Completed|Wall
因项目较小,可以逐一排除不能混淆的部分,设置上选择白名单模式,实际项目若部分区域的代码难以全部排除出不能混淆的代码,建议用黑白名单混用模式。
项目所有脚本都继承自MonoBehavior,并直接挂在Prefab上,故所有脚本类名都不能做混淆,且所有类的处于Completed命名空间内,Completed命名空间本身名字也不能做混淆处理。
Invoke("HideLevelImage", levelStartDelay);//GameManager line:93
Invoke调用不能混淆,故GameManager类中HideLevelImage方法需要放到白名单
Invoke ("Restart", restartLevelDelay);//Player line:182
Invoke调用不能混淆,故Player类中Restart方法需要放到白名单
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
static public void CallbackInitialization()//GameManager line:60
{
//register the callback to be called everytime the scene is loaded
SceneManager.sceneLoaded += OnSceneLoaded;
}
特性基于反射调用,故GameManager类中的CallbackInitialization方法需要放到白名单
黑白名单规则请参考Unity-Obfuscator的README中的黑白名单配置-配置规则
可见配置了白名单的Completed命名空间名以及各个类名都没变,但除白名单内的3个方法以及Unity生命周期方法外,其他所有类成员名字都发生了变化,名字混淆成功
可见GameManager中插入了大量内部调用Console.Write()的方法,这些是从垃圾代码库中注入的垃圾方法,垃圾代码注入成功。
上面在黑白名单配置中,WhiteList-CodeInject-Class文件配置了Completed|Wall,即Completed命名空间下的Wall类将不会注入对垃圾代码的调用,上图可见无垃圾代码调用,代码注入的黑白名单生效。
游戏正常运行,混淆成功。