Unity防破解 —— 重新编译mono
Unity4.x版本导出android包时,只能选择mono,无法使用il2cpp,这就造成了我们的程序集很容易被修改……很多朋友在发布项目时觉得即使代码暴露出去也没什么关系,只有项目火了才有必要等,然而一旦游戏被破解,很容易对游戏生态造成无法想象的灾难,这里写两篇博文记录一下最近加密Dll的过程。
一.加密Dll需要做那些事
1. 想要加密Dll的前提条件是我们必须修改mono,因为Unity并没有在mono中为开发者提供加密的接口或者功能,所以我们必须手动编译mono,从而替换掉Unity中原本的mono。
2.需要一种加密Dll的可逆算法,常见的DES,TEA,XXTEA等,当然需要是C语言的实现
3.mono中对key的保护,因为即使.so文件,也是可以被反编译的,如神器IDA等
4.一些打包工具或者脚本,因为一旦自己加密了Dll就无法完全依赖Unity打包了,整个打包流程会变得相对繁琐,这事需要反复打包的话最好还是优化对应的工具。
这两篇博文都是基于Untiy4.7版本的,对应的mono是4.6,当然我想如果是其他版本的mono应该也是可以的。
二.编译mono
编译mono的过程其实还是很繁琐的,一开始我尝试在linux下编译mono,然而各种失败,我想Unity可能并不想开发者自己编译mono,所以给的文档中各种坑,然后参考了雨凇编译mono的文章,结果发现也是各种失败,汗……后来意外发现在 “ulua&cstolua技术交流群①(341746602)”“不说害怕”大神写过一篇编译mono的教程,于是拿过来试了一下,踩了几个小坑后就顺利编译成功了,下面就直接这篇简单修改一下贴出来啦:
1.获得Unity-mono
我们需要编译的是 针对unity-4.6 mono的安卓SO,所以首先需要clone Unity-mono ,然后切到分支unity-4.6,(注意:已经测试编译过unity-5.2,所以对于最新的版本应该也可以的)
2. 准备编译环境
下载ulua编译的那个MinGW(msys) 【注意:里面包含x86和x64我用的x86版本,但同时支持编译出各个版本的结果】放到D:\MinGW\ 【注意MinGW一定要放在某个磁盘的根目录,否则会造成MinGW环境变量错误,导致编译失败】
参考:
https://github.com/jarjin/ulua_runtime_project
http://pan.baidu.com/s/1gd1Wyx9#path=%252Fulua_src
3. 下载
首先需要下载NDK : android-ndk-r10e
==========================
注意至于是不是下载这个NDK版本,到\mono\external\build_runtime_android.sh这个文件
第14行确认:
例如这样: perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r10e -env=envsetup.sh && source envsetup.sh
>>>>>>>>>>>>>>>>>>>>>>>>>
上面下载的文件是一个.exe的文件,运行一下它就会在当前目录解压,解压完成把目录名改成 android-ndk_auto-r10e
放到
D:\MinGW\x86\msys\1.0\home\zhupf\android-ndk_auto-r10e 【zhupf 是我的windows登陆名字】
4. 下载一个zip.exe
zip.exe很多,这里直接在文章提供一个Zip, 下载并解压后直接放到-> D:\MinGW\x86\msys\1.0\bin
5. 修改一行脚本
文件 E:\Work\mono\external\buildscripts\PrepareAndroidSDK.pm 需要处理一下:
elsif(lc $^O eq 'cygwin')
改成,不然不认识我们的编译环境
elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys')
5. 启动
运行 D:\MinGW\x86\msys\1.0\msys.bat,切换到mono 工程目录,如:E:\Work\mono\ ,然后执行编译脚本:./external/buildscripts/build_runtime_android.sh
7. 第一次会失败
自动用git下载android_krait_signal_handler但编译可能失败【需要把git加到环境变量中】
下载E:\Work\mono\external\android_krait_signal_handler
但编译失败
8. 修改android_krait_signal_handler下的脚本
1)--------------
PrepareAndroidSDK.pm 内
elsif(lc $^O eq 'cygwin')
改成,不然不认识我们的编译环境
elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys')
2)--------------
build.pl内
#!/usr/bin/env perl -w
改成
#!/usr/bin/perl -w
PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r9");
改成
#PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r9");
3)--------------
\jni\Application.mk
NDK_TOOLCHAIN_VERSION := clang3.3
改成
#NDK_TOOLCHAIN_VERSION := clang3.3
9. 重新编译
./external/buildscripts/build_runtime_android.sh
10. 成功编译到
E:\Work\mono\builds\embedruntimes\android
11. 注意
1)--------------
这样会编译出针对4种处理器的库
armv5, armv6_vfp, armv7a, x86
可以根据情况修改(在这个文件最后,用#注释掉不需要的)
E:\Work\mono\external\buildscripts\build_runtime_android.sh
以便精简
比如:
#clean_build "$CCFLAGS_ARMv5_CPU" "$LDFLAGS_ARMv5" "$OUTDIR/armv5"
2)--------------
编译出的so文件大约8m, 是Debug
若要编译release版本
对于arm7等,修改build_runtime_android.sh
只要把CFLAGS里的-g改成-O2就可以了 【注意-O2 是gcc编译优化选项,其中‘O’是英文字母'O’】
对于x86,修改build_runtime_android_x86.sh
去除CFLAGS里的-g
注:O是优化等级(Optimize)的参数
-g选项,表示产生供gdb调试的调试数据
参考:
http://www.xuanyusong.com/archives/3553
其中加-Wl,–gc-sections \ 这个我这边试了会失败,可以不加。
12. strip去除调试信息(可以加到build_runtime_android.sh和build_runtime_android_x86.sh脚本)
1)--------------
$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-strip.exe libmono.so
2)--------------
$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-strip.exe libmono.so
最后
下篇文章会介绍如何加密Dll和在mono中保护key的问题 : http://www.cnblogs.com/lixiang-share/p/5979981.html
Unity防破解 —— 重新编译mono的更多相关文章
- Unity防破解 —— 加密Dll与Key保护
在阅读这篇文章之前,我在处理mono加密问题时,也是参考了雨凇的文章,所以建议先看一下雨凇写的关于加密Dll的文章: 1.Unity3D研究院之Android加密DLL与破解DLL .SO 2 ...
- Unity中的Mono & Linux上编译Mono的流程
前段时间编译了一下Unity的Mono,看了很多相关的文章,也遇到很多新坑.所以来总结一下,加深自己对Mono的理解 为什么Unity可以跨平台运行呢 通常Unity的脚本有C#.JS.Boo.不过现 ...
- 如何保护.net中的dll文件(防破解、反编译)
如何保护.net中的dll文件(防破解.反编译) 2010-07-19 15:08 [小 大] 来源: 赛迪网 评论: 0 分享至: 百度权重查询 词库网 网站监控 服务器监控 SEO监控 ...
- 单机 & 弱联网手游 防破解、金币改动 简单措施
手游经常使用破解方法 对于一个弱联网或者单机游戏,能够从下面方面去破解: 1.找得到存档文件的,直接破解改动存档文件. 2.找不到存档文件,就在游戏执行时借助一些软件来改动数值,比方用各种改动器手游助 ...
- 【转】Android 防破解技术简介
http://www.cnblogs.com/likeandroid/p/4888808.html Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是 ...
- 基于NDK的Android防破解& Android防破解 【转载】
两篇防破解文章转载 基于NDK的Android防破解:http://blog.csdn.net/bugrunner/article/details/8634585 Android防破解:http:// ...
- VB 共享软件防破解设计技术初探(三)
×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http://bbs.pediy.com/sho ...
- VB 共享软件防破解设计技术初探(二)
VB 共享软件防破解设计技术初探(二) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http ...
- Android 防破解技术简介
Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是随之而来的问题也越来越多,这其中比较令人头疼的问题就是:有些不法分子利用反编译技术破解 App,修改 ...
随机推荐
- 51nod 1967路径定向(欧拉回路)
题目大意:给出一个图,安排边的方向,使得入度等于出度的点数最多,并给出方案. 首先假设是个无向图,不妨认定偶点必定可以满足条件 我们还会发现,奇点的个数必定是偶数个 那么如果把奇点两两用辅助边连起来, ...
- Codeforces Round #401 (Div. 1) C(set+树状数组)
题意: 给出一个序列,给出一个k,要求给出一个划分方案,使得连续区间内不同的数不超过k个,问划分的最少区间个数,输出时将k=1~n的答案都输出 比赛的时候想的有点偏,然后写了个nlog^2n的做法,T ...
- bzoj3011 可并堆
我们可以遍历得出每个节点到根节点的距离h,然后用可并堆进行维护.树形dp 我用的是pairing heap #include<cstdio> #include<algorithm&g ...
- 对C++ templates类模板的几点补充(Traits类模板特化)
前一篇文章<浅谈C++ templates 函数模板.类模板以及非类型模板参数>简单的介绍了什么是函数模板(这个最简单),类模板以及非类型模板参数.本文对类模板再做几点补充. 文章目录1. ...
- IPVS和Nginx两种WRR负载均衡算法详解
动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了! ...
- JQuery用鼠标选文字来发新浪微博
最近注意到新浪博客有个小功能,就是当鼠标选中一段文字时会浮现一个小图片,点击这个图片可以把选中内容发送到新浪微博,一时兴起昨晚就写了一个Demo玩了一下,代码超简单,没优化,有兴趣的朋友可以自己改进. ...
- Firefox多国语言多OS离线安装包
Download Firefox in your language Firefox is made in large part by volunteers around the world. That ...
- (转)HTTP请求中URL地址的编码和解码
HTTP请求中,类似 http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html 的地址 如何解码成 http://www ...
- 2016"百度之星" - 初赛(Astar Round2A)--HDU 5690 |数学转化+快速幂
Sample Input 3 1 3 5 2 1 3 5 1 3 5 99 69 Sample Output Case #1: No Case #2: Yes Case #3: Yes Hint ...
- [bzoj2631]tree——lct
Brief Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: u v c:将u到v的路径上的点的权值都加上自然数c: u1 v1 u2 ...