0、加密的原理
Unity3d 是基于 Mono的,我们平时写的 C# 脚本都被编译到了 Assembly-CSharp.dll ,然后 再由 Mono 来加载、解析、然后执行。
Mono 加载 Assembly-CSharp.dll 的时候就是读取文件到内存中,和平时读取一个 游戏资源 文件没什么区别。
为了防止别人破解,我们会对游戏资源加密,简单点的 比如修改文件的一个字节 或者 位移一下 。只要简单的修改一下,破坏原来的文件数据结构,别人就不能用通用的读取工具来读取了。
Mono 读取 Assembly-CSharp.dll 也是如此,我们只要简单的 修改 Assembly-CSharp.dll 的一个字节,就能破坏掉 Assembly-CSharp.dll 的数据结构,然后 Assembly-CSharp.dll 就不再是一个 dll 了,就变成了一个普通的文件,一个系统都不认识的未知类型的文件。
转自http://blog.youkuaiyun.com/huutu http://www.thisisgame.com.cn
在 Android 中,由 libmono.so 来加载 Assembly-CSharp.dll 。
libmono.so 这就是 Mono 了 。
既然 Assembly-CSharp.dll 被我们加密了,那 libmono.so 这个通用的读取工具就不能再 读取已经加密的 Assembly-CSharp.dll 了,所以我们也要修改 重新编译 libmono.so ,给它加上解密函数才行。
Unity3d 是基于 Mono2.0 的,而 Mono2.0是免费开源的。所以基于各种开源协议 ,Unity 官方也将自己修改过的 Mono 开源出来,我们下载过来然后修改 重新编译出自己的 libmono.so 。
项目托管在 Github 上,项目地址:
https://github.com/Unity-Technologies/mono
了解到一些原理背景后就可以开始进行操作了。
1、安装ubuntu系统
在 Windows 上面进行编译比较麻烦……在 Linux 或 Mac 上会比较简单,网上多数教程都是基于 Mac的,我这里选择了最新的 Ubuntu 系统。
Ubuntu 官方提供了 ISO 刻录工具:
http://www.pendrivelinux.com/downloads/Universal-USB-Installer/Universal-USB-Installer-1.9.6.3.exe
Ubuntu 系统下载:
http://www.ubuntu.org.cn/download/desktop
http://old-releases.ubuntu.com/releases/14.04.1/ubuntu-14.04.1-desktop-i386.iso?_ga=1.187436840.1241524278.1457318071
转自http://blog.youkuaiyun.com/huutu http://www.thisisgame.com.cn
使用上面那个工具安装到U 盘然后安装到 电脑中。
2、下载ANDROID_NDK
安装完 Ubuntu 后,在 Ubuntu 中 ,注意32 和64位区别
64 位下载 :
http://pan.baidu.com/s/1dDAqnK1
32位下载 :
http://pan.baidu.com/s/1sjoneRr
sudo su 切换到root安装
./android-ndk-r10e-linux-x86.bin
安装后在安装目录里面找到 RELEASE.txt ,里面记录着NDK 完整版本号,修改为 r10e
(Mono的编译脚本是读取这个RELEASE.txt中记录的版本号,然后和编译脚本中填写的版本号做匹配的