一、功能
1)、基础版:加密unity下build的assembly-csharp.dll文件,避免或者减缓app源码被破解;
2)、加强版: 对mono源码中的解密算法所处的程序段进行加密,加强破解难度。
二、流程
1)、对导出的Assembly-CSharp.dll加密;
2)、从github下载unity的mono源码;
3)、修改mono源码中的文件image.c,找到函数mono_image_open_from_data_with_name,其中参数data代表了assembly-csharp.dll的内存地址,在进行data的空判断之后,加入解密算法,如:
if (strstr(name, “Assembly-CSharp.dll”) != NULL)
{
解密算法
......
}
4)、重新编译mono,得到libmono.so文件;
5)、将1)和4)得到的文件覆盖到1)中的导出包中;
6)、打包生成最后的apk文件。
以上是基础版的流程,加强版的流程如下:
1)、2)、3)同基础版1)、2)、3);
4)、encrypt libmono.so,对libmono.so里面的密钥获取函数进行section加密;
5)、修改image.c,增加密钥获取函数getKey,增加该函数的section属性;
6)、在进入main函数之前,解密步骤4)所述section;
7)、在image.c的解密算法中getKey,并使用该key来解密dll;
剩余步骤与基础版4)、5)、6)一致。
具体参考:http://www.xuanyusong.com/archives/3571 (雨松沫沫博客)
三、备注
1)、对mono源码的操作都是在Linux环境下进行;
2)、加密算法的时间复杂度不要太高,否则会影响app的加载速度;
3)、加密之后需要使用.net破解工具和C破解工具测试是否能够反编译得到assembly-csharp.dll及libmono.so(IDA PRO)的源码;
4)、最好将加密和解密做成自动化;
5)、如果Unity支持IL2CPP,那么不需要人工进行加密处理了。