使用Obfuscator对代码进行混淆

前言

游戏上线后,遭到各种各样的破解. 前期还仅仅是尝试改改内存,这个还好 虽然后来也被破解了.但是应对方法比较简单.

后来GG大玩家居然直接Dll Hook挂Mod… 太看得起我了-.-

防御

虽然可以做dll注入防护(原理应该是给自己用到的所有Dll做白名单,其他的一概不允许),不过考虑到接入那么多渠道.再做这部分的防护. 一键打包脚本 应该是个巨大的工作量.所以还是放弃了..

Obfuscator

Obfuscator是AssetStore上很火的一个插件,可以进行代码混淆并且生成伪函数,对于注入来说应该会加大不少难度. 希望GG大玩家Hacker们会喜欢. 期待你们的下次破解~~

测试工程

写一个标准的MVC,界面两个按钮. 一个控制加分数,一个控制减分数

UI层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using UnityEngine;

public class UIMediator : MonoBehaviour
{
public void OnClickAddScoreBtn()
{
ScoreVoManger.instance.GetVo().num += 1;
Debug.Log("On click add score btn");
}

public void OnClickSubScoreBtn()
{
ScoreVoManger.instance.GetVo().num -= 1;
Debug.Log("On click sub score btn");
}
}

VoHandler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class ScoreVoManger
{
private static ScoreVoManger mInstance;

public static ScoreVoManger instance => mInstance ?? (mInstance = new ScoreVoManger());


private readonly ScoreVo mVo;

private ScoreVoManger()
{
mVo = new ScoreVo();
}

public void ChangeScore(int _addValue)
{
mVo.num += _addValue;
}

public ScoreVo GetVo()
{
return mVo;
}
}

Vo

1
2
3
4
5
6
7
8
9
public class ScoreVo
{
public int num;

public ScoreVo()
{
num = 10;
}
}

效果截图

直接使用Obfuscator默认参数. 编译后Dump出代码

WX20180406-203428

Update v1

Obfuscator用到正式的项目中去还是走了不少弯路的. 总结一下遇到的几个问题

Json

1
JsonUtility.FromJson<ClassName>(**Json字符串**);

对于需要从Jaon中直接序列化与反序列化的对象,需要在对应的Class上面标记[Skip]

Plugins目录

Obfuscator不会对Plugins目录下的代码进行混淆,但是有些插件并不是默认放入该目录下,需要对相应插件进行目录迁移

Behavior Designer

所有Behavior Designer用到的Class均要设置为[Skip],他的说明文档里面也有提到.

Enum

这个折腾了好久. 所有枚举变量均要设置[SkipRename],即使对应的Class已经设置了[Skip].也要设置

IL2CPP

IL2CPP模式下,开混淆后不可开调试模式(Development Build).否则会编译报错.

建议

  • 项目尽早集成Obfuscator,且多上真机看效果.后期集成不可预知性太高,早起集成还可以让所有UI中函数加入[Skip]标签,这样可以对MonoObject进行混淆.加大扰码力度
  • 尽量少使用Invoke,如果需要也最好集中处理(CopyEngine.CallLater(_callback,_delayTime)),并且要使用nameof(函数名),否则混淆不一定可用
  • 不使用enum,直接使用const int变量.这样可以做混淆
坚持原创技术分享,您的支持将鼓励我继续创作!