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的更多相关文章

  1. Unity防破解 —— 加密Dll与Key保护

        在阅读这篇文章之前,我在处理mono加密问题时,也是参考了雨凇的文章,所以建议先看一下雨凇写的关于加密Dll的文章: 1.Unity3D研究院之Android加密DLL与破解DLL .SO 2 ...

  2. Unity中的Mono & Linux上编译Mono的流程

    前段时间编译了一下Unity的Mono,看了很多相关的文章,也遇到很多新坑.所以来总结一下,加深自己对Mono的理解 为什么Unity可以跨平台运行呢 通常Unity的脚本有C#.JS.Boo.不过现 ...

  3. 如何保护.net中的dll文件(防破解、反编译)

    如何保护.net中的dll文件(防破解.反编译) 2010-07-19 15:08 [小 大] 来源: 赛迪网 评论: 0 分享至:      百度权重查询 词库网 网站监控 服务器监控 SEO监控  ...

  4. 单机 & 弱联网手游 防破解、金币改动 简单措施

    手游经常使用破解方法 对于一个弱联网或者单机游戏,能够从下面方面去破解: 1.找得到存档文件的,直接破解改动存档文件. 2.找不到存档文件,就在游戏执行时借助一些软件来改动数值,比方用各种改动器手游助 ...

  5. 【转】Android 防破解技术简介

    http://www.cnblogs.com/likeandroid/p/4888808.html Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是 ...

  6. 基于NDK的Android防破解& Android防破解 【转载】

    两篇防破解文章转载 基于NDK的Android防破解:http://blog.csdn.net/bugrunner/article/details/8634585 Android防破解:http:// ...

  7. VB 共享软件防破解设计技术初探(三)

    ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http://bbs.pediy.com/sho ...

  8. VB 共享软件防破解设计技术初探(二)

    VB 共享软件防破解设计技术初探(二) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http ...

  9. Android 防破解技术简介

    Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是随之而来的问题也越来越多,这其中比较令人头疼的问题就是:有些不法分子利用反编译技术破解 App,修改 ...

随机推荐

  1. BZOJ4419 SHOI2013发微博(平衡树)

    好友状态的变化次数不会超过m,于是考虑暴力,对每个人记录其好友关系的变化,通过前缀和计算贡献.这需要查询一段前缀时间内某人发的微博数量,可以离线建一棵绝对平衡的平衡树.事实上完全可以线性. #incl ...

  2. 机器学习:最近邻规则KNN算法

    这个算法就比较简单易懂了 就是把每个向量的特征值抽象成坐标,寻找最近的k个点,来进行划分 代码如下 #include <iostream> #include <cstdio> ...

  3. 【题解】NOI2014动物园

    传送门:洛谷P2375 一直到写到这道题目才发现我一直都理解了假的KMP……fail数组:fail[i]为从1-i(包含i)在内的字符串,相同的最长前后缀长度. 那么我们可以先思考暴力:先求出所有的f ...

  4. 【考试记录】4.8 Table ( 数论数学 --组合数 & 杨辉三角)

    陆陆续续的开始考很多的试,也会更新这些题目记录下来,免得做完了之后毫无印象,就这么水过去了(以前的考试都是如此,哎……) Table (T1) : 样例: 出于对数学题本能的恐惧考场上放弃了此题专攻T ...

  5. [BZOJ1283]序列

    Description 给出一个长度为n的正整数序列Ci,求一个子序列,使得原序列中任意长度为m的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和最大. Input 第1行 ...

  6. [LOJ#2553][CTSC2018]暴力写挂

    [LOJ#2553][CTSC2018]暴力写挂 试题描述 temporaryDO 是一个很菜的 OIer .在 4 月,他在省队选拔赛的考场上见到了<林克卡特树>一题,其中 \(k = ...

  7. hadoop基础----hadoop实战(九)-----hadoop管理工具---CDH的错误排查(持续更新)

    在CDH安装完成后或者CDH使用过程中经常会有错误或者警报,需要我们去解决,积累如下: 解决红色警报 时钟偏差 这是因为我们的NTP服务不起作用导致的,几台机子之间有几秒钟的时间偏差. 这种情况下一是 ...

  8. mycat 管理MySQL5.7主从搭建

    1.首先安装MySQL ab: 192.168.6.163 master 192.168.6.167 slave master: vi /etc/opt/rh/rh-mysql57/my.cnf.d/ ...

  9. The base command for the Docker CLI.

    Description The base command for the Docker CLI. Child commands Command Description docker attach At ...

  10. Extend the size of ext3 partition online in VM

    1. Increase disk space in vCenter 2. scan disk on the Linux VM # fdisk -lu > /tmp/fdisk. # > / ...