# [工具下载](https://clienttool.dun.163.com/api/v1/client/jarTool/download)

## 功能介绍

### 引擎so保护

易盾unity加固方案默认保护引擎so（libil2cpp.so/libmono.so），使用 IDA 可以看到导出**函数消失**

### **global-metadata.dat保护方案**

易盾unity加固方案默认加密global-metadata.dat，防止Il2cppDumper等破解工具。

#### 防动态内存dump global-metadata.dat文件

易盾提供对于防止动态内存dump global-metadata.dat的保护，防止riru-il2cppdumper之类的工具。

### **dll加密保护**

#### mono-dll保护

提供对于mono引擎dll整体加密、dll函数加密保护和dll自定义格式加密保护，大大提高攻击者破解分析门槛和成本。

#### il2cpp-dll保护

提供对于unity-il2cpp中热更dll文件的加密保护，包括dll的整体加密和dll的函数加密保护，支持il2cpp中的主流热更框架：比如**ILRuntime、hybridclr等。**

### **Ab资源加密**

ab资源作为unity引擎中的核心资源，将所有的资源形式打包成了UnityFS的格式，部分资源的暴露可能带来资源被窃取，被修改，以及游戏内存在剧透的风险。为了防止对于资源的分析以及拷贝，易盾提供了ab资源的加密，并且边运行边解密。

### **lua文件保护**

unity引擎中会使用lua文件进行热更，以xlua、tolua为代表的lua热更框架，易盾支持对于热更lua文件的加密保护。

### **dex保护**

使用 dex2jar 工具去反编译 dex 文件发现之前手游 dex 文件类和方法消失


## **使用说明**

该加固工具为jar包文件，适用于Windows、Linux以及Mac系统，以下均以Windows环境下描述，其他系统环境使用方法类似。下载地址[点击下载](https://clienttool.dun.163.com/api/v1/client/jarTool/download)。

### **使用方式**

命令行模式（注意，第一次使用需要配置config.ini文件）

1. 命令行模式参数
``````

java -jar NHPProtect.jar -yunconfig -zipalign -apksign -input E:\yiduntest\test.apk
``````
1. 参数说明如下：

| 参数  | 说明  |
| --- | --- |
| \-yunconfig | 必填项，表示自动从易盾后台获取加固参数,加固配置已经在后台部署，可以根据实际情况调整 。 |
| \-apksign | 对加固后的 APK 包签名，需要配置config文件内的签名文件配置\[apksign\]字段。 |
| \-zipalign | 对加固后的 APK 包对齐，未对齐的包体可能存在安装失败的情况，建议对加固后的包都需要进行对齐。 |
| \-dex | 对包体进行dex加密，使用dex加密后如果您的应用需要上架Google play市场，请确保Google play自动完整性保护选项是关闭的（默认是关闭的），避免与APP加固的功能冲突。具体操作如下：在自动完整性保护页面（版本 > 设置 > 应用完整性 > 自动完整性保护）中关闭保护功能。 |
| \-antirepack | 搭配dex保护使用，会对加固时候输入的原包签名和加固后运行的包体签名进行校验，运行时候的包签名和加固时输入的原包签名不一致，则会退出应用处理。建议原包签名带上v1+v2。 |
| \-input | 必填项，参数后面跟待加固的APK/AAB文件绝对路径 |
| \-output | 默认加固后的文件输出在原文件同路径，-output参数可以指定加固后文件的输出路径和文件名，示例：java -jar NHPProtect.jar -yunconfig -zipalign -apksign -output E:\\enc\\test_enc.apk -input E:\\yiduntest\\test.apk |

### **config.ini文件配置说明**

默认config.ini必须要跟NHPProtect.jar在同一目录下，如果需要指定config文件，可以执行-config 命令参数来处理：
``````
java -jar NHPProtect.jar -yunconfig -config E:\Desktop\test\config.ini -apksign -zipalign -input E:\yiduntest\test.apk
``````
config的功能主要有以下三点：

### **设置appkey**

用户需要将appkey填写在该配置文件中，格式如下所示。appkey请在官网登录账号后加固服务-服务管理获取。

```\[appkey\]

key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```


### **配置签名相关信息**

若需要进行自动签名操作，除了在命令行中加入”-apksign”参数外，还需要在config.ini文件中设置签名相关信息，格式和含义如下所示。

```\[apksign\]

keystore=D:\\xxx\\xx.keystore

alias=xxx

pswd=xxx

aliaspswd=xxx

signver=v1+v2

keystore: 存储签名信息的文件，使用绝对路径表示

alias: 签名别名

pswd: 对应签名信息的密码

aliaspswd: 对应签名别名的密码

signver:指定签名的版本，用+相连
```

（**ps：若只使用v2签名，仅支持Android 7.0 以上系统，请谨慎使用**）

**AAB包签名请加上-aabUseApksig参数**
``````
java -jar NHPProtect.jar -yunconfig -zipalign -apksign -aabUseApksig -input xxx.aab
``````
### **AB资源加密**

#### 配置方法

若需要ab加密，则在加固时候需要加上以下配置
加固命令加上-u3dastenc功能参数或在后台开启 ab 加密功能
``````
java -jar NHPProtect.jar -yunconfig -zipalign -apksign -u3dastenc -input xxx.apk
``````
1. ab加密时需要在加固工具config.ini配置如下字段参数，包体加固和资源单独加密都需要
``````
[u3dabmode]

mode=5
``````
1. ab资源加密需要配置对应的unity符号表（libunity.sym.so）路径，参考[unity 符号表配置。](https://support.dun.163.com/documents/15588074449563648?docId=1015060133960065024)

对应config参数字段增加如下字段参数
``````
[SymbolPath]

path=E:\TEST\Symbols
``````
1. 符号表配置注意事项：
2. 符号表文件路径最后应该是一个文件夹，切勿配置压缩包的路径
3. 符号表文件夹内需要包含各个架构下unity对应的符号表文件libunity.sym.so
4. 符号表路径不限制固定路径格式，只要有符号条件的文件即可。可以是unity工程安装目录也可以拷贝到本地文件夹。
5. 请保证配置的unity符号表和待加固的包体是匹配的，可以关注版本上release和debug的配置、unity版本等情况是否匹配，若符号表配置和apk不匹配会加固失败。

### 单独ab资源加密（热更ab包）

1. ab加密时需要在加固工具config.ini文件配置如下字段参数
``````
[u3dabmode]

mode=5
``````
1. 单独加固命令参数

对一个zip包/文件夹内的所有 assetbundle 文件进行加密
``````

Java -jar NHPProtect.jar  -SingleAstEnc -input E:\\NHPtest\\raw.zip
``````

1. 单独加密过的资源需要在有ab加密功能配置的加固包体上才可以解密加载，且需要config的mode参数配置一致，没有ab加密功能的加固包或者未加固包无法加载已加密过的ab资源文件。未加密的资源文件读取没有限制。

#### 整包加密指定apk包内需要加密的ab文件路径（可选）

如果不指定ab资源，则默认对包内符合加密条件的所有标准ab资源加密

如果指定ab资源则仅对指定的ab资源文件加密

config.ini配置字段，path可以具体到某个文件，也可以指定文件夹，删除该\[u3dabPath\]字段表示不指定文件，对包内所有符合加密条件的标准ab资源加密。该字段仅在apk整包加固时候生效。
``````
[u3dabPath]

path1=assets/balling.ab //指定加密balling.ab文件

path2=assets/GameAbs //指定加密assets下GameAbs文件夹

path3=
``````
#### 指定文件不处理（可选）

加固apk或者热更资源包，apk里的某个ab文件要求不处理，在config.ini新增以下参数

指定对应文件，示例：
``````
[excludeList]

file1=assets/game/Isekai //对apk内assets/game下的Isekai文件不处理

file2=cc.ab //对单独加密的文件夹内的cc.ab文件不处理，如果文件夹内有目录，需要具体到目录
``````
### **unity il2cpp-hybridclr 热更加密方案**

游戏厂商由于业务热更需要，unity-il2cpp 开发过程中会使用hybridclr 框架热更 dll 文件，由于 dll 文件易反编译性以及易篡改等特性，需要对热更的 dll 文件进行保护；易盾提供两种加密方法：il2cpp-dll 整体加密方法和 il2cpp-dll 方法加密两种加密方式。有需要请联系对应客户经理获取方案。

## 注意事项

1. 加固会强校验包名，如有新包名需要加固，请提前向易盾运营报备。
2. 加固后的包，需要进行对齐和重签才可以正常安装，注意加固后的签名和对齐状态。
3. 母包加固后分包或者先分包后加固渠道包都可以，若母包加固后渠道包需要反编译包体，则母包加固时候不建议加上-dex，会导致分包反编译失败。

unity2019以及以上版本，原包覆盖安装加固包时候，需要注意2个包体assets\\bin\\Data\\boot.config内的buildDate需要不一样，否则由于unity的缓存机制，libunity.so中会读取boot.config文件中的buildData来判断是否释放Managed相关的符号文件，buildDate一致的话就无法完全覆盖安装，会导致一些运行问题。

4. 在使用防动态内存dump global-metadata.dat的加固选项的时候，热更机制支持对于libunity.so文件的热更，由于每次加固libil2cpp.so和libunity.so文件都会变动，所以确保libil2cpp.so和libunity.so均支持热更。
5. 加固后请做好业务功能完整流程测试，特别是热更新/覆盖安装/游戏功能等场景。

## 安全和使用体验

建议对线上历史未加固包体的代码和资源进行修改后再加固，以防历史包体被用于分析业务逻辑。

**更新和支持**

Jar工具会定期进行新版本检测，客户端网络正常的情况下触发更新时会自动升级到最新版本。也可手动通过更新命令进行升级。示例:
``````
Java -jar NHPProtect.jar -update
``````
也可以通过config 内的增加如下配置来设置加固工具是否更新，以及更新检测频率。
``````
[update]

u=1 // u=1 更新 u=0 不触发自动更新

t=1 //更新检测频率，单位 day，表示每 1天执行时候都会进行最新版本更新检测
``````
加固脚本由易盾在服务器部署，为保证线上包体方案的稳定性，非功能优化和问题修复不会改变后台的加固版本。建议有大版本更新迭代时候可以考虑升级到易盾新版本，并根据版本排期提前测试。