注意这个加密只适合android端加密,DLL热更新和简单加密。
参考教程:https://www.xuanyusong.com/archives/3553
- 安装ndk方法,打开控制台输入:
cd '/home/xujing/DLLFile'
./android-ndk-r10e-linux-x86_64.bin
环境配置:
修改当前登录用户配置文件: sudo gedit ~/.profile
修改系统配置文件: sudo gedit /etc/profile
再打开的文件夹后面加上路径:
export ANDROID_NDK_ROOT=/home/xujing/DLLFile/android-ndk-r10e
export PATH=$ANDROID_NDK_ROOT:$PATH
使配置生效:source /etc/profile
. /etc/profile
查看是否争取:echo $ ANDROID_NDK_ROOT
echo $ PATH
2.安装ndk后生成的android-ndk-r10e文件夹发现上锁了:
解锁方法:sudo chmod -R 777 文件夹路径
3.安装autoconf这些软件:sudo apt-get update
如果安装失败则,则搜索update(软件更新器,输入前几个就可以了),换一个软件源。设置最佳网络,不断测试。
4.发现一直报错:”$ANDROID_NDK_ROOT is pointing to a mismatching NDK; using /home/xujing/DLLFile/android-ndk-r10e instead “。通过一句句加日志发现是
/home/xujing/DLLFile/mono53/external/ buildscripts/ PrepareAndroidSDK.pm 中间463行输出的,然后if($ndk eq $current)判断一直为false,$current 为r10e-rc4,$ndk为r10e。于是修改语句为 if($current =~ /$ndk/) 。
如果再次启动sh,发现还是报这个错。则打开另一个文件pm文件:
/home/xujing/DLLFile/mono53/external/android_krait_signal_handler/ PrepareAndroidSDK.pm
修改422行,详细修改如下:
if($current =~ /$ndk/)
#if ($ndk eq $current)
5.发现ndk还在下载,于是添加日志发现是build_runtime_android.sh文件里面113行”(cd "$KRAIT_PATCH_PATH" && perl ./build.pl)”导致的,找到pl文件。修改第10行:r9-> r10e
PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r10e");
6.报错:进入相应目录发现没有clang3.3于是修改sh文件。
找到mono53/ external/android_krait_signal_handler/jni/Application.mk打开文件:修改clang3.3为3.5。
7.以上问题解决后,运行sh文件,可以正常打出so文件了。So文件目录在:/home/xujing/DLLFile/mono53/builds/embedruntimes/android下。
进入/home/xujing/DLLFile/mono53/mono/metadata目录,打开image.c文件,找到mono_image_open_from_data_with_name 函数(第1077行),添加解密函数。
之后在unity项目里面:添加打DLL的时候,添加加密算法,并且替换so文件。
/// <summary>
/// 加密 Assembly-CSharp.dll;
/// </summary>
private static void EncryptAssemblyDLL(string dllPath){
UnityEngine.Debug.Log("EncryptAssemblyDLL"+ dllPath + "Start");
byte[] bytes = File.ReadAllBytes(dllPath);
bytes[0] += 1;//加密算法自己根据需求来
File.WriteAllBytes(dllPath, bytes);
UnityEngine.Debug.Log("EncryptAssemblyDLL" + dllPath + "Success");
}