Unity3DAndroid加密DLL与Unity热更新
unity代码加密for Android,mono编译
准备工作
一个巨坑
- 没有什么信心的话,请不要使用Windows+ Cygwin 来编译libmono。我最开始的一段时间之内都在烦恼Cygwin的用法(也是我太渣渣的过),后面安装了Ubuntu的虚拟机,上手没什么难度而且 真 的 很 好 用。
解密工具
- Untiy中C#的代码最后编译成Assembly-CSharp.dll,解密可以用de4dot(net脱壳工具)。
- 读取上面dll的是libmono.so,我们的代码解密工作就要在这里完成,而so文件解密可以使用IDA(反编译工具)。
这两个工具才可以帮助我们真正的查看我们的加密工作是否真的完成了。
准备内容
-
VMWare以及Ubuntu(也可以用Mac编译,从大家的说法来看也比较简单)Ubuntu安装时推荐使用英文环境,否则命令行命令不好敲
[Windows] VMware Workstation 11.0.0正式版/***/***
怎样在VMware虚拟机中使用安装并设置Ubuntu系统
虚拟机 Ubuntu与Windows共享文件夹的方法 -
UnityMono源码
https://github.com/Unity-Technologies/mono/
选取与自己Unity相合的Branch从GitHub下载即可(形如Unity4.6 Unity4.3这样的Branch) -
Android NDK
我所编译的为 Unity4.6 的mono源码,这个版本需要准备的是android-ndk-r9,这里需要说明一下,一定要按照mono对应的NDK去准备,如果需要的r9。那么r9c、 r9d等版本也不可以。【如何查看所需ndk版本】:在你下载的源码工程中查看“/external/buildscripts/build_runtime_android.sh”有下面类似的一句
perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r9 -env=envsetup.sh && source envsetup.sh
其中 -ndk 的内容 就是所就是所需的NDK版本号。去下载即可.
编译Libmono
具体流程参考博文1,我就说说我做了些什么才编译成功的,编译成功之前踩了好多坑,相信你把我接下来说的几点完成了,应该能编译成功。
坑1,一定要在VM虚拟机上用ubuntu编译,关键在build_runtime_android.sh这个文件
坑2,记得修改
修改/mono-unity-4.6/external/buildscripts/build_runtime_android.sh
约73行处:
具体参考雨松大神的博文,这两地方一定要改
把-fpic -g -funwind-tables改成-fpic -O2 -funwind-tables
约152行处:
clean_build "$CCFLAGS_ARMv5_CPU" "$LDFLAGS_ARMv5" "$OUTDIR/armv5"
clean_build "$CCFLAGS_ARMv6_VFP" "$LDFLAGS_ARMv5" "$OUTDIR/armv6_vfp"
改成
#clean_build "$CCFLAGS_ARMv5_CPU" "$LDFLAGS_ARMv5" "$OUTDIR/armv5"
#clean_build "$CCFLAGS_ARMv6_VFP" "$LDFLAGS_ARMv5" "$OUTDIR/armv6_vfp"
添加解密代码:
在/mono-unity-4.6/mono/metadata/image.c中找到mono_image_open_from_data_with_name(约1077行处),在函数头部加入以下代码
1
2
3
4
5
6
7
|
if (name
!= NULL)
{
if ( strstr (name, "Assembly-CSharp.dll" ))
{
data[0]-=1;
}
}
|
完成添加后得到如下图所示:
.重点---修改 build_runtime_android.sh Line 113 ,改为:(这里之前没改拖了我好久,我觉得是这里解决了我才编译通过的)
1
|
(cd "$KRAIT_PATCH_PATH" &&
perl ./build.pl)
|
坑3.记得下载哈,虽然我不知道为啥,但我都下载了,在ubuntu里面终端 sudo adt-get 这个命令来下载
对了,还有一个perl插件的问题,这个东西是什么我也不知道,反正编译要用到。
没安装自己度娘去,反正楼主没有安装unbuntu自带了。
下载相应库。linux有个好处可以自动下载库。sudo apt-get install (库的名字)
如果出现如下提示表示程序被占用需要先关闭:
关闭命令为:
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
注意RM后的空格
先全来一遍
ctrl+alt+T打开linux的终端。第一次打sudo的时候会让你输入密码获取root权限。不过你输的时候密码那里是不会显示*的。你输完了直接按回车就好。当时输完了看下屏幕结果楞了一下,怎么没输进去,又输了一遍还是没有,还以为键盘出问题了。这里也纠结了一小会= =
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
sudo apt-get install git
sudo apt-get install bison
sudo apt-get install libc6-dev-i386(如果是64位的ubuntu需要下载这个和下面那个包)
sudo apt-get install lib32z1
下载完后就可以编译了
把build_runtime_android.sh文件拖到根木录去运行,具体参考博文1
说说为什么吧,
http://www.ithao123.cn/content-8713647.html这个大神博客中提到的有些问题你去看看吧,这些坑我做完以上几点就没有碰到过,感觉这些问题都是因为没改东西还没有配置好NDK才造成的
编译过程终端会显示进度条百分比,要是没有出现先检查你的NDK配置了没有 ndk -build是检查配置好没有,下面是配置好的,不会配置看博客1或者百度去
接下来百分比过后就是刷刷刷一大堆,看不懂
成功之后是这样的
可以看到 打包成功,lib在builds/embedruntions/android.
总结:
反正流程大概就是这样,流程没错,因为每个人的编译环境不一样,照成很多坑,楼主也是按照以上博客一个个加,加各种库,修改build_runtime_android.sh文件。
这个就是加密了,这个我是要用到热更新的,但是后面以后研究,老大说告一段落了