2015-09-23 17:55:14 Kaitiren 阅读数 4738

Unity3D-重新编译Mono加密DLL。安卓应用总是让人头疼,游戏遭到破解与反编译是研发的人最不愿意看到的。自己的辛苦劳动成果被人随意窃取与利用,对这些咬牙切齿的痛恨。所以我们需要加强自身的反破解技术力量。不过这世上没有破解不了的东西,道高一尺魔高一丈,我们做的只是让破解更加困难而已。让那些破解的人付出点代价才能得到他们想要的,如果他们觉得代价太高,看不清前面的道路,他们就有可能放弃,然后我们的目的达到了。

游戏本身加密方式有很多,对apk加壳,防止apk二次打包等。对这些android的加密与破解技术看过比较好的文章参考:《Android安全及病毒分析》 ,其中《Android APK加壳技术方案【2】》最为经典。而本篇文章我们主要来说说针对Unity3D的加密。

闲扯就到这里,我们开始说正事:

Unity3D所有客户端的代码都会以dll文件形式存下来,当游戏应用被开启时c#vm(也就是mono的虚拟机)会去加载所有dll,从而开始运行真正的程序画面了。而破解的很大一部分都是通过解压apk后拿到主逻辑dll,对dll进行反编译,然后修改后重新编译,再放入apk重新签名打包。所以我们需要针对dll进行加密,以防止他们反编译dll。

加密一个dll文件非常容易,无论你用什么算法都行,但是在哪解密呢?答案是libmono.so。libmono.so是mono的核心程序,它承载了加载解析dll和虚拟机运行的功能。所以说libmono.so是关键,我们需要修改mono内核程序并重新编译它。

下面将开始mono的编译过程,别看步骤写得简单明了,其实我花了起码一个多星期的思考,尝试,失败,再思考,再尝试,再失败…..总结其中原因一方面也是自己的愚钝的资质,另一方面是unity mono和mono并不一样,unity mono缺少编译文档并且还混合着原mono的编译文档,导致误判了很多:

1.首先不要认为unity mono 与 原生态mono一样。可以编译mono就可以同样步骤编译unity mono。我在这里尝试了很久,使用configure进行编译,尝试使用不同的编译参数,进行编译,最后发现unity mono使用的是ndk-9下的linux-4.8编译器,所有参数都是根据这个编译器所设定的。

2.unity mono 地址:https://github.com/Unity-Technologies/mono 你需要从这里下载unity mono。

3.mono需要autoconf automake libtool pkg-config这些工具。你最好还是去下载安装了。你可以用brew安装。brew install autoconf automake libtool pkg-config。

4.我一开始使用mac x86_64进行编译,折腾了很久然后建了个linux-x86_64虚拟机来编译,然后又折腾了很久,又建了个linux-i386来重新编译mono,因为我一直认为交叉编译需要加些不同的编译参数和变量。在linux-i386首次编译成功后又开始转化到mac上,进行交叉编译也一样成功,最后发现其实是我没找对路子。这路子就是unity 的mono-build-tool:https://github.com/Unity-Technologies/monobuildtools 它已经在unity mono的项目里了,在mono的external/buildscripts下。

5.buildscripts下的build_runtime_android.sh是编译安卓平台的关键。它是unity制作的一个自动编译 mono 流程的脚本。你需要将这个脚本copy到mono根目录下再执行。

6.脚本里写些内容,如果你懒得看,我帮你稍微解释下。它会去检查你当前的ANDROID_NDK_ROOT环境变量是否是指向ndk-9,所以你需要去下ndk-9版本,放到机子上,然后编辑环境变量ANDROID_NDK_ROOT指向它,如果你没有它会通过perl模块lwp-download去下载ndk-9,但是你必须要要有这个perl模块才行,我劝你还是老老实实自己去下吧。ndk版本下载地址参考这里:《android-sdk-ndk-studio-下载列表和构建说明》。如果是linux下编译环境变量设定参考这里:《linux环境变量简介》 。然后呢,它会用git去clone一个编译时用到的库,这个也是unity自己改编过的一个库,地址为:https://github.com/Unity-Technologies/krait-signal-handler ,这个库有个坑说下:perl脚本build.pl头部有个命令是#!/usr/bin/env perl -w,这个在部分机子上并不兼容,如果你有错误停在这里这个文件上,你可以将env去除再尝试手动perl build.pl 运行构建一遍没问题再重新编译,原因参考:http://abloz.com/2011/01/13/why-use-usr-bin-env.html 。最后就先make clean && make distclean 清除前面编译的内容,然后进行预编译configure,参数都在脚本里设置好了,你不需要关心了。预编译后就开始make编译了。

7.执行build_runtime_android.sh后terminal基本都是刷屏的节奏。刷刷刷的编译输出,你根本来不及看清到底做到哪了做了些什么内容。而config.log这个文件记录所有的编译输出,包括哪行错误了,哪行通过了。调试基本也考这个log文件,如果关键部位错误它会停止,然后你就可以针对性的查了。这里提醒一点,编译时它很多地方都是在检测编译器是否正常,因为它要确认编译器对错误的编译内容是否能够检测到,所以很多错误内容只是测试内容-你需要省略掉。

8.如果编译成功,那就恭喜你了。windows下我没有测试过,有可能会增加不少坑,我建议还是用linux或者mac编译吧,因为我搜集资料的时候不少人对windows下编译mono都抱怨不少。那么我们开始迈入下一个坑吧:)

下面介绍加解密DLL部分:

加密算法自己选我不多说了,但我这里要引用一篇同样介绍mono的dll加密的文章,我觉得也写得满不错的,但是文章描述不够详尽。我这篇文章弥补了他的不足,将细节补充得更加细致。你大可以两篇文章加起来参考。http://www.unitymanual.com/home.php?mod=space&uid=7672&do=blog&id=1440 不知道地址是不是原作者的,如果不是我再更换吧。

1.首先找到dll解密入口。mono下/mono/metadata/image.c里mono_image_open_from_data_with_name是关键方法,参数中的data是dll传入的数据。你要做的就是将它解密后传给datac,这个方法程序你必须看下,因为你要了解下解密程序放在哪才合适。

2.大部分dll都会通过mono_image_open_from_data_with_name这个方法进行加载,但不是所有dll,例如mscorlib.dll和System.Core.dll就不会,可能还有其他dll,我并不确定还有哪些。所以你还是得辨别下哪些dll会通过这个方法,这样你才能确定哪个dll可以加密。如何判断data属于哪个dll呢,参数name就是data的路径名,name打印出来后就像:/data/app/com.xx.xx.apk/assets/bin/Data/Managed/xxx.dll 这样。

3.打印调试。你可以使用g_message例如:g_warning(“dll name: %s \n”, name); 其他的打印调试你可以查看源码中的它写的代码。很容易找到,查关键字LOG吧。

4.改完后重新编译mono,找到libmono.so(find . -name libmono.so),完成编译后libmono.so的平台有好几个,你可以根据自己的平台来选。有人拷贝这些mono重新编译过的文件去覆盖了unity编辑器的原来mono文件,这样也可行。但我选择在打包android时再从外部复制libmono.so,这样就可以绕过编译器重新编译后无法读取无加密dll的麻烦,可以少做一层无意义的编辑器状态下的加解密工作。

5.mono解密部分就到这里了。其他部分的关键就是你的加解密程序了,是否能够加密和解密都是ok的并且都是不改变size。你需要的参数有data和data_len,mono_image_open_from_data_with_name方法里面都有。

6.为了安全起见我使用c来编写加密程序,因为我认为c#和c的编译器对于变量内存的存储机制不一样,怕引起不必要的麻烦。

这里要非常感谢一个人,全程都在提供帮助:炽乐@宗树 

转载请注明出处:http://www.luzexi.com

2018-10-29 18:25:27 Teddy_k 阅读数 1605

Unity - 游戏加密方案-DLL加密方法记录

DLL加密

Unity中的自定义脚本都会打包到Assembly-CSharp.dll这个DLL中,所以目前常见的游戏加密方案就是,用对称加密算法加密Assembly-CSharp.dll,然后修改mono源码在读取Assembly-CSharp.dll时解密,然后重新编译mono.dll。这种方案网上有很多帖子,在此只记录自己动手实现时的一些细节(Windows平台 + Unity2017.2)。

mono.dll重编译的一些细节

  • 用VS2010版本,并且打上Sp1补丁,基本就可以一次成功
  • 设置libmono为启动项,配置选Release_glib,32位62位各打一个
    在这里插入图片描述
  • 解密代码在image.c的mono_image_open_from_data_with_name函数中插入
	if (!data || !data_len) {
		if (status)
			*status = MONO_IMAGE_IMAGE_INVALID;
		return NULL;
	}
	// 插入
	if (name != NULL && strstr(name, "Assembly-CSharp.dll") != NULL)
	{
		char* key = "Encrypt-String";
		size_t len;
		// xxtea解密算法
		char* decryptData = (char *)xxtea_decrypt(data, data_len, key, &len);
		int i = 0;
		for (i = 0; i < len; ++i)
		{
			data[i] = decryptData[i];
		}
		g_free(decryptData);

		data_len = len;
	}
	// 原有的代码
	datac = data;
  • 重编译生成mono.dll的路径:根目录/builds/embedruntimes
    在这里插入图片描述
  • Unity mono.dll的路径:根目录/Mono/EmbedRuntime

Assembly-CSharp.dll加密

很多对称加密算法都可以做,这一步可以放到Unity Editor中做,一键打包+加密DLL+替换mono.dll。成功的话游戏运行是没问题的,用Reflector查看Assembly-CSharp.dll也显示错误。

另一种加密方案-混淆

另一种加密思路是混淆,将原有代码转换成完全不能识别的代码,但是在Unity中使用有些限制,参看参考链接。

最后

这些加密只是很简单的加密方案,只能防止80%的小白程序员破解游戏,但老鸟来破解还是易如反掌难道一劫:

无论是加密还是混淆,只要是这样的保护,都可以把它看成一个壳,只要是壳,在内存中就必然会有脱下去,显示它本来面目的那一刻。

网上也有很多教程教如何脱壳,比如:
https://www.52pojie.cn/thread-401702-1-1.html
https://blog.csdn.net/huutu/article/details/51902940
对于游戏开发者,特别是独立单机游戏开发者,防破解还是任重道远啊。


参考链接:
DLL加密:https://blog.csdn.net/swj524152416/article/details/69946259
混淆: https://blog.csdn.net/kun1234567/article/details/7917847

2016-09-08 15:41:43 dingkun520wy 阅读数 5502
这里假设我们在Unity3D里面写的代码抽象成这样一个Test类,里面包含了公开和私有的变量,有自带的Start方法、Update方法和OnGUI方法,还有public、private和protected方法。虽然说用抽象类代表了项目里面实际的类,但为了可以看得到代码效果,所以在方法里面大概写了一些简单的打印的命令。
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 
把这个Test类放到上次的类库项目里面,然后生成dll,放到Unity3D项目里面:
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 
其实要看到dll里面的内容,很多软件都可以,我们这里就拿Unity3D自带的MonoDevelop来看。找到引用里面的dll文件,这里是AzhaoDll.dll。
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 
可以直接浏览到dll里面的内容,看看刚才那个Test类,是不是每一个变量、每一个方法都一字不缺的显示出来了?
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 还有上次写的Math3D方法,也能直接看得到。
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 
dll就是这么不保险的一个东西,所以我们要引入这一篇文章的内容:对Dll进行混淆。
.Net的代码混淆器有好几种,比如VS自带的DotFuscator、小巧的Reactor,或者相对比较专业的xeoncode。
这里我使用了xeoncode 2010版本。
界面如下:
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 
来到Application,可以添加dll文件:
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 
选择需要混淆的dll:
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵

然后在Project可以看到dll里面的类、变量和方法。看到某些变量和方法前面打了勾,这是需要混淆的意思,这个可以自己调整,后面再说:
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
  
在Output里面选择一个输出的路径:
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 
然后点击右下角的Build Application,就可以发布混淆好的dll。
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 
把混淆好的dll放回Unity3D项目,就可以看到,这次的dll里面出现了很多随机数字和字母组成的变量名称和方法名称:
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵
 仔细的看,可以看出,刚才打钩了的方法和变量都变成乱码名称,然后在方法调用里面也会发生一些变化,除了名称改变以后,代码本身也会发生一些变化,没有之前那么直接的显示出调用的情况,如果是复杂的调用,将会出现goto来代替了。
这样一来,就算是写代码的人自己也很难看得明白这些代码了。当然如果真的非常有心的逐个变量方法名称去对应,逐个goto调用去查找,也还是可以还原的,但估计很少人会话这个功夫去做这种事情。到这里,混淆的目的就达到了。

不过现在拿这个dll去实际运行,会发现出现很多问题的,比如Unity3D自带的方法Start、Update之类的是不会执行的。这是因为混淆的时候把一些不应该混的东西给混淆了。

那么接下来就说一下注意的事项:
1、public和protected的变量和方法,默认是不会混淆的,你也可以手动的把勾打上,让它混淆,不过由于这些是被外部调用的变量和方法,你混淆了它的名称,那么外部调用的时候是必然出错的。
2、像Unity3D的Start、Update、OnGUI等MonoBehaviour自带的方法,都是具有特定含义的,虽然是私有方法,但也不应该混淆,不然到了该执行的时候就不会执行了。
3、某些有特定含义的名称,或者有用到使用字符串来识别变量或者方法名称时,这些方法和字符串都不应该混淆,不然也会出现调用不到的情况。
 
Unity3D项目程序加密2——对dll进行混淆 - 阿赵 - 穷到掉渣的超级奶爸阿赵

以上是简单的使用方法,具体的情况可能要到真正用的时候才会出现,所以就随机应变了。

原文地址: http://liweizhaolili.blog.163.com/blog/static/1623074420145110502776/

2019-04-24 10:14:04 qq_44952746 阅读数 23
               



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.csdn.net/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.csdn.net/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中记录的版本号,然后和编译脚本中填写的版本号做匹配的,如果不匹配就会去Google下载)


设置环境变量 ANDROID_NDK_ROOT

sudo gedit /etc/bashrc

添加一行

export ANDROID_NDK_ROOT=/home/captain/Downloads/android-ndk-r10e;


让环境变量立即生效
source /etc/bashrc


测试是否添加成功
echo $ANDROID_NDK_ROOT


3、编译 Development 版本的 libmono.so

从 Github 下载 unity-mono,我这里下载的4.6版本,到branch里面搜4.6

https://github.com/Unity-Technologies/mono/tree/unity-4.6

解压,然后拷贝 mono-unity-4.6/external/buildscript/build_runtime_android.sh 到   mono-unity-4.6/   根目录中。

切换到mono-unity-4.6/ 目录中,使用 root 运行 build_runtime_android.sh ,

./build_runtime_android.sh
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

会提示没有安装git

然后安装git:

sudo apt-get install git

修改 build_runtime_android.sh Line 113 ,改为:

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

然后修改 mono-unity-4.6/external/android_krait_signal_handler/build.pl

(这是脚本调用git clone过来的 https://github.com/Unity-Technologies/krait-signal-handler/)

删掉第一行

#!/usr/bin/env perl -w


继续运行出错,提示 ANDROID_NDK 版本不对,又要下载,下载又失败,修改成我们自己的版本。

用命令  找到build.pl

Find / -name "build.pl"

修改BuildAndroid 函数里面的 r9 为 自己下载的版本  r10e

然后找到

external/android_krait_signal_handler/jni/Application.mk 


修改里面的

 TOOLCHAIN_VERSION := clang3.3


 TOOLCHAIN_VERSION :=4.8

因为r10e里面已经没有3.3了,只有4.8。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

然后继续编译

提示没有 autoreconf

使用下面命令安装autoreconf:

sudo apt-get updatesudo apt-get install autoconf


同样的方法,顺便把下面的包都安装一下

* autoconf* automake* bison* gcc* gettext* glib >= 2.0* libtool* make* perl



都安装之后,继续执行脚本,开始编译滚代码了

过了十多分钟,编译好啦,用 find / -name "libmono.so" 找到编译出来的 so 文件。


这次编译出来的是 Development 版本的,现在就可以 把这个 编译出来的 libmono.so 拷贝到 自己电脑上,在导出 Android 项目之后,替换掉 libs目录里面的 libmono.so 。

然后运行到 手机上测试是否OK,我这里是测试 OK的。


至于怎么样从 Ubuntu 电脑上把 libmono.so 拷贝到 Windows 电脑上,直接用 U 盘就可以。然而我没有 U盘,所以我在 Ubuntu 上开启了 SSH 服务,然后在 Windows 上面连接到了 Ubuntu ,然后下载到 Windows 电脑上,比较麻烦。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

在Ubuntu上开启ssh-server ,安装完毕之后自动会启动

apt-get install openssh-server

手动启动服务
service ssh start/etc/init.d/ssh start

查看是否启动成功
ps -s | grep ssh


在windows上安装 FileZilla 官网 https://filezilla-project.org/
http://jaist.dl.sourceforge.net/project/filezilla/FileZilla_Client/3.16.0/FileZilla_3.16.0_win64-setup_bundled.exe

输入Ubuntu的 ip 帐号 密码 端口22 进行SFTP连接 。


4、编译 Release 版本的 libmono.so

修改所有的 build_runtime_android.sh 和 build_runtime_android_x86.sh

找到 -fpic -g 去掉 -g

再次执行 build_runtime_android.sh

开始编译滚代码了,

编译成功,用 find / -name "libmono.so" 找到编译出来的 so 文件。然后同样 拷贝到 Windows 电脑上,导出一个 Release 版本的 Android 工程出来,运行到手机上测试。

我这边测试OK。


5、修改 libmono.so ,增加 解密 函数

找到 /metadata/image.c 这个文件

找到

mono_image_open_from_data_with_name

这个函数,这个函数就是用来读取 dll 的。修改这个函数,添加解密代码。

mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name){    MonoCLIImageInfo *iinfo;    MonoImage *image;    char *datac;        /* 加入 Decrypt */    if(name != NULL)    {        if(strstr(name,"Assembly-CSharp.dll")){            data[0]-=1; //这里注意对应自己的加密方式进行修改。这里是对第一个字节 -1 ,对应加密算法是 +1;        }    }  ……………… ………………}

这里注意对应自己的加密方式进行修改。这里是对第一个字节 -1 ,对应加密算法是 +1;
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
再次执行 build_runtime_android.sh

开始编译滚代码了,

编译成功,用 find / -name "libmono.so" 找到编译出来的 so 文件。拷贝到Windows 电脑上。

再次导出一个 Release 版本的 工程,然后运行到 手机上发现,场景正常,但是代码都不执行了!!

这是因为 我们修改了 libmono.so ,增加了解密函数,但是当前的 Assembly-CSharp.dll 是没有加密的!!!,所以 libmono.so 这里是读取 Assembly-CSharp.dll 失败了,所以我们写的代码都没有执行。


现在已经知道了怎么增加解密方法,以及编译 Development 和 Release 版本。

所以现在分别编译 Development 、 Release 的加密了的 libmono.so 。

每次编译 都会自动生成  armv7a 、 x86  这两个 CPU 的 libmono.so 。


我们把 这几个 libmono.so 拷贝到 Unity 项目中,存放到 Editor 文件夹,可以下载我的例子查看。


6、加密 Assembly-CSharp.dll

在 Unity3d 中导出 Android 工程之后,对 Assembly-CSharp.dll 进行加密,然后替换掉 导出的 Android 工程中的 libmono.so 文件。

Unity3d 提供了 Android 工程导出完毕的回调,我们在这个回调中 替换掉 导出的 Android 工程中的 libmono.so 文件, 如下:

BuildPostprocessor.cs :

/** * 文件名:BuildPostprocessor.cs * Des:在导出Eclipse工程之后对assets/bin/Data/Managed/Assembly-CSharp.dll进行加密 * Author:Captain * **/using UnityEngine;using UnityEditor;using UnityEditor.Callbacks;using System.IO;public class BuildPostprocessor{    [PostProcessBuildAttribute(1)]    public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject)    {        if (target == BuildTarget.Android && (!pathToBuiltProject.EndsWith(".apk")))        {            Debug.Log("target: " + target.ToString());            Debug.Log("pathToBuiltProject: " + pathToBuiltProject);            Debug.Log("productName: " + PlayerSettings.productName);            string dllPath = pathToBuiltProject + "/" + PlayerSettings.productName + "/" + "assets/bin/Data/Managed/Assembly-CSharp.dll";            if (File.Exists(dllPath))            {                //加密 Assembly-CSharp.dll;                Debug.Log("Encrypt assets/bin/Data/Managed/Assembly-CSharp.dll Start");                byte[] bytes = File.ReadAllBytes(dllPath);                bytes[0] += 1;                File.WriteAllBytes(dllPath, bytes);                Debug.Log("Encrypt assets/bin/Data/Managed/Assembly-CSharp.dll Success");                Debug.Log("Encrypt libmono.so Start !!");                Debug.Log("Current is : " + EditorUserBuildSettings.development.ToString());                //替换 libmono.so;                if (EditorUserBuildSettings.development)                {                    string armv7a_so_path = pathToBuiltProject + "/" + PlayerSettings.productName + "/" + "libs/armeabi-v7a/libmono.so";                    File.Copy(Application.dataPath + "/MonoEncrypt/Editor/libs/development/armeabi-v7a/libmono.so", armv7a_so_path, true);                    string x86_so_path = pathToBuiltProject + "/" + PlayerSettings.productName + "/" + "libs/x86/libmono.so";                    File.Copy(Application.dataPath + "/MonoEncrypt/Editor/libs/development/x86/libmono.so", x86_so_path, true);                }                else                {                    string armv7a_so_path = pathToBuiltProject + "/" + PlayerSettings.productName + "/" + "libs/armeabi-v7a/libmono.so";                    File.Copy(Application.dataPath + "/MonoEncrypt/Editor/libs/release/armeabi-v7a/libmono.so", armv7a_so_path, true);                    string x86_so_path = pathToBuiltProject + "/" + PlayerSettings.productName + "/" + "libs/x86/libmono.so";                    File.Copy(Application.dataPath + "/MonoEncrypt/Editor/libs/release/x86/libmono.so", x86_so_path, true);                }                Debug.Log("Encrypt libmono.so Success !!");            }            else            {                Debug.LogError(dllPath+ "  Not Found!!");            }        }    }}

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

好了,以上就是所有的 步骤。

再次导出 Android 工程,然后运行到手机上,测试是否OK,我这边是测试 OK的。

然后找到 导出的项目中的 dll 文件,在下面的路径:

assets/bin/Data/Managed/Assembly-CSharp.dll

用 .NetReflector 查看、或者拖入到 MonoDeveloper 中,发现都无法正常打开。

这说明我们加密成功了!!






可以下载我的测试项目来查看和测试:

http://pan.baidu.com/s/1nuloVcH

我也把它打包成了 Package:

http://pan.baidu.com/s/1o6ZH02u

注意这里只是简单加密,线上项目不要搞的这么简单…………


参考了网上各种教程:

http://csftech.logdown.com/posts/452269-android-unity-encryption

https://github.com/Unity-Technologies/mono

http://www.luzexi.com/unity3d/%E6%B8%B8%E6%88%8F%E6%9E%B6%E6%9E%84/%E5%89%8D%E7%AB%AF%E6%8A%80%E6%9C%AF/2015/04/11/Unity3D-%E9%87%8D%E6%96%B0%E7%BC%96%E8%AF%91Mono%E5%8A%A0%E5%AF%86DLL.html

http://www.xuanyusong.com/archives/3553



           
没有更多推荐了,返回首页