Unity3DAndroid加密DLL与Unity热更新

unity代码加密for Android,mono编译


最原始的介绍博文:http://www.luzexi.com/unity3d/index.html
老大丢给我的博文:http://www.cnblogs.com/xijianchui/p/5242527.html 在mac上编译

参考博文:
1.http://www.cnblogs.com/July7th/p/4736502.html  根据这个完成的编译,感谢大神

2.http://blog.csdn.net/qq_27772057/article/details/51945700 这篇帮我填了几个坑

3.http://blog.csdn.net/u011643833/article/details/47261015 这个大神也不错,看懂了编译流程

4.http://www.xuanyusong.com/archives/3553 雨松大神补坑、

不说废话了,


开始编译过程吧

准备工作

一个巨坑

  • 没有什么信心的话,请不要使用Windows+ Cygwin 来编译libmono。我最开始的一段时间之内都在烦恼Cygwin的用法(也是我太渣渣的过),后面安装了Ubuntu的虚拟机,上手没什么难度而且 真 的 很 好 用

解密工具

  • Untiy中C#的代码最后编译成Assembly-CSharp.dll,解密可以用de4dot(net脱壳工具)。
  • 读取上面dll的是libmono.so,我们的代码解密工作就要在这里完成,而so文件解密可以使用IDA(反编译工具)。 
    这两个工具才可以帮助我们真正的查看我们的加密工作是否真的完成了。

准备内容


友情提示:装ububtu时虚拟硬盘大小设置大一点,不然后面下载东西都不够,编译会出错
NDK下载地址:(要*吧) https://developer.android.google.cn/ndk/downloads/index.html

-----------------------------------
这个时候你应该安装好了VM虚拟机中的ubuntu,然后ubuntu中下好了mono和相应的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;
     }
}

完成添加后得到如下图所示:

Unity3DAndroid加密DLL与Unity热更新

 


.重点---修改 build_runtime_android.sh Line 113 ,改为:(这里之前没改拖了我好久,我觉得是这里解决了我才编译通过的)

1
(cd "$KRAIT_PATCH_PATH" && perl ./build.pl) 

坑3.记得下载哈,虽然我不知道为啥,但我都下载了,在ubuntu里面终端 sudo adt-get 这个命令来下载


对了,还有一个perl插件的问题,这个东西是什么我也不知道,反正编译要用到。

Unity3DAndroid加密DLL与Unity热更新


没安装自己度娘去,反正楼主没有安装unbuntu自带了。


下载相应库。linux有个好处可以自动下载库。sudo apt-get install (库的名字)

如果出现如下提示表示程序被占用需要先关闭:

Unity3DAndroid加密DLL与Unity热更新

关闭命令为:

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或者百度去


Unity3DAndroid加密DLL与Unity热更新


接下来百分比过后就是刷刷刷一大堆,看不懂


成功之后是这样的


Unity3DAndroid加密DLL与Unity热更新


可以看到 打包成功,lib在builds/embedruntions/android.



总结:

反正流程大概就是这样,流程没错,因为每个人的编译环境不一样,照成很多坑,楼主也是按照以上博客一个个加,加各种库,修改build_runtime_android.sh文件。


这个就是加密了,这个我是要用到热更新的,但是后面以后研究,老大说告一段落了