加载中…
个人资料
亡羊补牢愿未晚
亡羊补牢愿未晚
  • 博客等级:
  • 博客积分:0
  • 博客访问:92,417
  • 关注人气:12
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

Unity3d的Android项目代码加密总结

(2015-07-09 21:10:32)
标签:

it

分类: Unity3D
uinty3d加密推荐几篇比较好的博客链接:
加密最主要目的是:1、防止恶意改了游戏的内存数据;2、人破解我们的协议攻击服务器。
参考了很多资料,有的帖子讲的很细,但过程比较凌乱,没有人把整个流程梳理一遍,所以在具体操作的时候弄得自己很晕,经过梳理,我对加密流程的理解是这样滴:
1、因为unity3d源码不开放,无法修改它进行加密,但unity3d是基于mono的,而mono是开源的,所以可以下载mono,对其源码进行修改来达到我们的目的。当然mono版本要和使用的unity3d版本对应。
2、修改mono源码,加入和加密对应的解密算法,并编译mono,生成我们最需要的libmono.so文件,并用它替换uinty3d安装文件中的libmono.so。
3、打包Android的apk包,如果此时在手机上安装该apk包,是无法运行成功的,因为apk包中注入了解密算法,所以在安装前,需要取出apk包中的Assembly-CSharp.dll文件,对其进行加密。
4、直接安装该包会出现安装失败的状况,因为修改了apk包中的文件,签名通不过导致的,所以需要对apk包进行重新签名。
5、重新签名后,再安装到手机中,不出意外,因为就ok了!

详细步骤如下
1、下载mono

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

找到对应的版本,譬如我使用的unity3d是4.3.6版本的,需要下载mono-unity-4.3的版本。

2、编译mono

该步骤是最麻烦也最容易出错的一步骤。

首先需要linux环境,我用的是Win7,所以需要安装cygwin或者linux虚拟机。最开始使用cygwin32,下载安装cygwin32过程极其缓慢,下载安装包就用了一天,然后各种配置环境,最终编译时各种出错,感觉极其不便,可能和我没用过gygwin,linux以前也没接触过有关。然后觉得使用虚拟机可能会方便点,如是安装了个ubuntu12.0版本的虚拟机,之后有种麻雀变凤凰的感觉,各种方便。

安装Android SDK并配置环境变量,网上资料一收一大把,安装NDK,这个首先要看看安装版本问题,解压mono并打开文件,查看build_runtime_android.sh文件,在第13行查看该mono需要NDK的版本,mono-unity-4.3需要的是NDK-r8。

sdk和ndk安装ok之后,就可以进行mono编译大业了,在运行mono之前,需要要对build_runtime_android.sh文件进行修改。

修改mono 下的build_runtime_android.sh:

       #=$NDK_ROOT/platforms/$ANDROID_PLATFORM/arch-arm
       #TOOLCHAIN=$NDK_ROOT/toolchains/$GCC_PREFIX$GCC_VERSION/prebuilt/$HOST_ENV
       PLATFORM_ROOT=/tmp/my-android-toolchain/sysroot
       TOOLCHAIN=/tmp/my-android-toolchain


#clean_build "$CCFLAGS_ARMv5_CPU" "$LDFLAGS_ARMv5" "$OUTDIR/armv5"
#clean_build "$CCFLAGS_ARMv6_VFP" "$LDFLAGS_ARMv5" "$OUTDIR/armv6_vfp"
clean_build "$CCFLAGS_ARMv7_VFP" "$LDFLAGS_ARMv7" "$OUTDIR/armv7a"
下载下来的脚本直接运行打的是debug版本,效果就是打出来的.so比unity自带的大很多。我们要改成release版本:
把CFLAGS里的-g改成-O2 ,然后在LDFLAGS里加上-Wl,–gc-sections \ 就行了(http://www.xuanyusong.com/archives/3553)。截图走起
Unity3d的Android项目代码加密总结
这样修改出来之后,我这边编译出来的libmono.so文件大概在3M左右,比安装的untiy3d自带的还小那么一丢丢。不知会不会有啥不良影响,暂时不知。
然后该进行核心事业,解密,在mono/metadata/image.c中修改 mono_image_open_from_data_with_name函数,在其中添加对应自己加密算法的解密算法。
接下来编译mono,首先在命令窗口运行$NDK/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-dir=/tmp/my-android-toolchain。运行NDK里面的一个东西,安装到指定目录,具体作用不知,跑一下就是了,否则接下来会没法进行。
然后运行build_runtime_android.sh,运行过程中会出现中断,因为一些编译环境没有安装(如g++,bsion等)而导致的,按照给出的提示,安装要求你安装的东西,然后重新运行build_runtime_android.sh,然我们安装什么就安装什么就是了,大概5到10分钟的样子,等到爆出成功,并给出编译出的libmono.so文件目录,就ok了!在./builds/embedruntimes/android/armv7a中。将libmono.so文件拷贝替换unity3d中的libmono.so(我是直接替换,这样搞的话,以后所有项目都需要加一下密,才能在手机上正常运行,因为打包的apk注入了解密程序,不进行加密操作,解密出来的东西就乱了。。。。)
3、加密&签名
打包apk,取出包中的Assembly-CSharp.dll,使用自己写好的加密程序进行加密,然后将加密过的Assembly-CSharp.dll重新拷贝到apk包中。
然后,很多Android开发小白估计会和我一样,以为革命成功,可以庆功了!兴致冲冲的在手机中安装该apk包,看着安装进度条心跳加速,可不幸的是会弹出一个让人崩溃(至少我是)提示“安装失败!”,失败了!那一刻我满脑子的过电影,仔细的搜寻自己做的每一步,希望,迫切的希望是自己哪一步做错了,可是没有找到,心情遗落千丈,怀疑自己是把整个流程弄错了,这可就麻烦了!又用了一天多的时间重新把自己看过的资料捋一遍,坚定自己过程是没有错的,可是为什么达不到预期效果呢,最后有人告诉我,动了apk包文件,有可能导致签名失败,“签名”?什么是签名,连apk签名都不知道是什么的我,当然不会想到这个问题,网上又找了一些解决该问题的方法http://www.miui.com/thread-874216-1-1.html,终于成功在apk上运行。
也有人使用untiy3d发布Android项目,然后使用ant一件打包,加密的代码在这里面实现,这样应该不会出现签名的问题(不直接懂apk包)。自己也尝试了下,感觉研究这玩意又得话时间,暂时算了。。。。

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
前一篇:概念类
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    < 前一篇概念类
      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有