• 这里假设我们在Unity3D里面写的代码抽象成这样一个Test类,里面包含了公开和私有的变量,有自带的Start方法、Update方法和OnGUI方法,还有public、private和protected方法。虽然说用抽象类代表了项目里面实际的类,...
    这里假设我们在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/

    展开全文
  • 对于辛辛苦苦完成的apk程序被人轻易的反编译了,那就得不偿失了,这篇文章就是解决Unity打包出来的apk进行代码加固和混淆。   准备资料: 1:Obfuscator.zip 作用是代码混淆,是Unity的一个插件 2:Apkdb.rar...

    前言:

    对于辛辛苦苦完成的apk程序被人轻易的反编译了,那就得不偿失了,这篇文章就是解决Unity打包出来的apk进行代码加固和混淆。

     

    准备资料:

    1Obfuscator.zip  作用是代码混淆,是Unity的一个插件

    2Apkdb.rar    作用是反编译apk,做过修改之后回编译成修改好的apk

    3Reflector_8.5.0.179_XiaZaiBa.zip 作用是反编译代码,方便查看代码

    4:梆梆助手.exe 作用是对apk进行重新签名和对apk的加固

    以上文件下载地址:

     

    链接: http://pan.baidu.com/s/1CujX8 密码: jm3m

    如果链接无效,请联系我QQ:503115254

     

    正文:

    1:打包一个带有签名的apk

    在打包Player Settings设置里面,需要对签名重新设置,签名可以理解成为一个证书,可以设置密码信息,保证一部分的程序安全,据说在Unity5.0对程序的安全有了初步保障,有一个默认的签名。但是个人习惯还是使用自己的签名为好,如下图:

     

    以上都设置好之后,Alias下拉框选项就会多出一个选项,此时就是需要创建的签名了

     

     

     

    点击 Create a new key之后,如图,填写所需要的信息,就可以创建了新的签名了,新的签名一定要保存好,这个东西对于程序加固还有作用。如图所示

     

    我是保存到桌面上了

    然后正常发布自己的apk就可以了

     

    2:对apk进行反编译

    接下来就要用到上面介绍的各种工具了,首先使用的是Apkdb反编译工具,首先解压出来,这是一个安装包,解压之后,需要进行对其安装,最好是关闭杀毒软件,安装界面是一个dos界面,



    选择1 简体中文就可以了,输入1   然后回车继续安装

     

    安装过程中,会提示你需要安装Java,当然,对于已经打包出apk来说,这些肯定已经配置了,如果还没有配置,则需要配置Java环境了,当然,还有AndroidSDK的配置,这个请自行搜索,网上很多教程,这里就不多说了,如图所示:

     

    按任意键继续  就开始安装程序了,等待安装完毕后,会有一个选项,这里选择12都可以,我选择1

    然后会让你选择安装器,这个选择哪个都行,我选择N

    然后需要你重启电脑,因为要配置鼠标右键的功能

     

    重启后,右键自己发布出来的apk,你会发现多了一些东西,这些东西都是有用的


    点击APKDB编译,就准备开始对apk进行反编译

     

     

    这里选择1  于是就开始反编译了,编译完成后,就在同级目录下生成一个文件夹,这就是反编译出来的文件

     

     

    然后就开始对代码的混淆了

     

    3:对程序的代码混淆

    这次使用的是Unity的插件Obfuscator for Unity,解压后是一个unitypackage包,导入进去之后,你会发现工具栏多出了两个工具,如图所示

     

    这里主要使用的是Tools里面的Obfuscator 选项,我们写的代码是在\assets\bin\Data\Managed文件夹下,当然,你看到的是dll文件,没错,我们的代码就是被编译成了dll文件,也就是Assembly-CSharp.dll,此时,你可以用Reflector进行反编译dll来获取里面的代码(我分享出来的是绿色版本的Reflector,所以不需要安装就可以使用),如图所示

     

    所以就要使用到混淆器,混淆器是把里面的代码变量等信息进行重命名,这样可读性会变得非常差,接着,回到Unity中,点击Tools下的Obfuscator 选项,会弹出一个选择文件夹的提示框,这个提示框就是我们刚刚提到的dll文件夹,也就是解压后的文件夹,选择这个Managed文件夹就可以了,它会自动进行代码混淆,

     

    混淆完成后推出dos命令,此时的dll就被混淆了,利用我们的Reflector看下代码



    全都是替换成了这类信息,相信你会头大的,没事,电脑能认识就行。然后就是对已经修改好的apk回编译成可以用的apk

     

     

    4:回编译成可用的apk

    对于已经进行代码混淆的文件来说,原先是apk进行反编译得到的文件,所以还需要回编译回去,右键反编译出来的文件夹,


    同样选择使用APKDB编译,此时出现的画面略有不同,


    这里选择1就可以了,等待回编译完成后,自动输出一个新的apk,在输出之前,会有一个选项


    选择Y就是了,新的apk目录是在原先目录下重新创建了一个名为“已编译***”文件夹,打开后就是回编译的文件了。

     

    到这里,我们完成了对代码的混淆,但是还没有进行加固,防止反编译,所以,请往下看

     

     

    5:使用梆梆助手来对apk进行加固

     

    如果还没有账号的需要申请账户,下载梆梆助手才可以使用,

     

    然后导入自己的apk就可以了,这里是流水式的走下来,所以只需要导入和导出就可以了,


    添加单个apk文件,选择好刚刚混淆后的apk,然后你做的事情就是等,等待上传完--加固完--下载完--已完成,当到已完成的时候,说明这里已经可以导出了,导出需要前面提到的自己创建的签名,这里可是会用到的,如果不用,则apk安装包可能会出现问题

     

    选择导出签名apk,选择签名文件,输入密码,然后点击开始导出

     

     

    导出的apk是经过混淆,经过加固比较安全的apk

     

    9月19号更新:

    其实这样也算不是很安全,同时你也可以对代码进行加壳,网上一搜一大堆的加壳的工具,程序的安全没有绝对的。

    可以参考我的另外两篇文章:

    Unity编程笔录--Unity Android加密dll http://blog.csdn.net/adambieber/article/details/49837503

    Unity编程笔录--Unity Android 加密 so http://blog.csdn.net/adambieber/article/details/49871245

    好了,到这里结束了,如果有什么问题,请咨询我的QQ503115254

    展开全文
  • 行业背景 Unity3d引擎应用的行业越来越多,游戏、...Virbox Protector Unity3D加密工具, 是北京深思数盾自主研发的程序保护工具,可快速加密保护 Unity3D 游戏引擎开发的程序,对 Unity3D 脚本 C# 代码进行加密,防

    行业背景

    Unity3d引擎应用的行业越来越多,游戏、城市规划、娱乐、艺术与教育方面、军事与航天工业、室内设计、房产开发、工业仿真、在文物古迹、Web3d/产品/静物展示、地理等等行业都在应用。那么有关Unity3D程序的安全问题必须提上日程,辛辛苦苦研发的应用一旦被破解盗版,损失将不可估量。

    解决方案

    Virbox Protector Unity3D版加密工具, 是北京深思数盾自主研发的程序保护工具,可快速加密保护 Unity3D 游戏引擎开发的程序,对 Unity3D 脚本 C# 代码进行加密,防止逆向和反编译。 

    Virbox Protector在操作上非常简单,直接将项目文件夹拖入到加壳工具中,点击保护即完成了加密保护。保护方式主要是对 Assembly -CSharp.dll 进行加密 ,可以保护 Unity 的主要代码逻辑不被反编译,最大程度保护软件开发者合法权益, 同时 DSProtector 工具可以对 Unity 软件中的 .resS 和 resources 等资源文件进行加密防止软件或游戏等资源被非法提取。

    加密效果

    代码保护前:

    webp

     

    代码保护后:

     

    原始Unity3D资源文件反编译效果,如图所示: 

    DSProtector工具对resS、assets和resource资源文件进行保护后的反编译效果,如图所示:webp

    支持平台

    Virbox Protector支持全平台的程序保护:Windows、Linux、macOS、Android、Arm。兼容性及稳定性不用开发者担心。加密后的程序不会影响性能。

    公司简介

    深思数盾是一家专注于软件加密及授权产品的公司,主要产品服务有:VirboxLM授权平台(云锁、软锁、加密锁),软件保护工具:Virbox Protector(代码加密/混淆/虚拟化等)、Virbox 反黑引擎(反调试、内存保护等)、Virbox Compiler(安全编译器)等。帮助企业重点解决四大难题:1、防止软件源代码泄漏;2、保护软件未经授权被分拆、篡改和针对软件的逆向工程;3、根据不同场景,实现软件授权的有效交付;4、监控产品运行状况,推动收入增长。

    快速试用:

    试用版下载地址:http://dl.download.virbox.com/vps/virboxprotector_trial_windows.exe

    申请试用:https://shell.virbox.com/apply.html

     

     

     

    展开全文
  • Unity 3D项目游戏逻辑采用C#脚本,我们知道C#编译生成的DLL或EXE是IL程序集。IL程序集中有一个MetaData,记录了程序集中的一切信息,所以容易被反编译。当我们得到APK包的时候,其实他就是一个压缩文件,类似zip,...

    转自:http://blog.csdn.net/yupu56/article/details/53216705

    1.加密方案

    Unity 3D项目游戏逻辑采用C#脚本,我们知道C#编译生成的DLL或EXE是IL程序集。IL程序集中有一个MetaData,记录了程序集中的一切信息,所以容易被反编译。当我们得到APK包的时候,其实他就是一个压缩文件,类似zip,rar等,我们把后缀“.apk”改为“.zip”然后可以对其进行解压,得到一个文件夹目录,从路径assets\bin\Data\Managed下,我们可以得到Unity3D项目脚本进行编译生成的所有DLL的文件,这里简单介绍几个特殊的:

    Assembly-CSharp.dll:Unity 3D项目中我们自己写的游戏http://逻辑脚本。

    Assembly-CSharp-firstpass.dll:Unity3D项目中我们用到的库和第三方脚本,比如Plugins文件夹下的脚本。

    UnityEngine.dll,System.dll等:这些都是Unity3D系统用到的库文件。

    那么我们今天主角就是:Assembly-CSharp.dll,我们可以从网上下载一个Unity破解神器:“.Net Reflector”,对这些DLL进行查看,一切代码尽收眼底,下面看图说话:


    因此只需要对Assembly-CSharp.dll进行加密就行了,传统的防破解方式是是对IL程序集进行混淆或者加壳。但是这种混淆基本上只是做一些名称混淆或流程混淆或者加壳,常用的技术有:

    1.Unity官方提供代码混淆服务,收费的

    2.CodeGuard.unitypackage插件,出包是混淆,方便,提供多种混淆选择,灵活,插件有破解版,测试可行,个人比较推荐.

    3.Crypto Obfuscator for .Net,但是不支持Mac

    感兴趣的可以根据名字去搜索一下,参考:Unity3D 导出的apk进行混淆和加固(防止反编译)

      但是这种混淆或加壳的结果基本上还是保留了IL程序集的原貌,还是很容易被破解的,可以下载De4dot 对APK进行脱壳,然后再进行破解读取。

    因此我们需要一个更保险的加密算法,首先我们来分析下加密原理。参考:Unity3d 加密 Assembly-CSharp.dll (Android平台) 全记录

    加密原理: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 了,就变成了一个普通的文件,一个系统都不认识的未知类型的文件。


    2.Mono 编译准备

    Mono加载dll的代码位于/mono/metadata/image.c文件中的mono_image_open_from_data_with_name方法。我们可以在这个方法中对DLL进行一个解密,这样我们的Unity就可以正常读取加密过得DLL了。

    有了加密方案,下面要做的就是解决Unity的Mono的编译问题,如何编译出含有我们的解密算法的Mono。

    这里我参考了几位大神的文章:雨凇默默的Unity3D研究院陆泽西大神的Unity-Mono编译

    加密DLL首先要找准unity版本对应的mono,地址在这里 https://github.com/Unity-Technologies/mono

    看清楚这是Unity官方的github地址,使用的是Unity修改过得mono,不是原版的mono。

    2.1.确认咱们的Unity版本和mono的版本。

    unity的mono版本并不是按小版本分的,比如我想找unity4.6.1 对应的mono那么它就没有,unity只提供4.3x 或者 4.6x 或者5.1x 这种大版本的mono .从提交时间上来看更新的很随意啊。我感觉要想找到对应的unity版本,可以根据unity这个版本发布的时候,然后在github上找对应时间的mono版本,下载到本地。下面我都用unity5.3举例:


    2.2.在编译之前先确认编译环境。

    这个坑了好几天,网上大部分资料说的都基本是Linux环境,包括雨凇的mac也是Linux环境,所以,如果你有Linux系统或者Mac系统,那么最好不过,但是如果你是windows电脑,那么会碰到很多问题,首先需要在windows下安装一个虚拟的Linux环境,如MinGW 和Cygwin,但是我试了不成功,总是路径方面出错,因为Linux和win下的路径格式有差别,导致代码读取不到NDK位置,推荐装一个虚拟机,直接Linux上弄。保证步走弯路一次性成功。另外关于MinGW和Cygwin我走了好多弯路,可以参考我的另一篇文章:

    2.3.确定了Linux环境后,再来确定你是否有autoconf,automake,libtool库。

    没有的话可以使用安装brew,然后使用brew进行安装特别方便。

    安装完这些库后,可以在终端cd到mono的目录下,执行:./autogen.sh --prefix=/usr/local检测环境是否正确。根据提示安装。

    2.4.配置NDK环境变量。

    如果你的电脑有NDK和SDK,那么就在你的根目录下找到 .bash_profile文件,就行配置。没有就创建一个。

    ANDROID_NDK_ROOT=/root/Android-ndk_auto-r9

    export ANDROID_NDK_ROOT

    再输入echo $ANDROID_NDK_ROOT确保环境变量配置成功。



    3.Mono编译测试

    3.1.github下载下来对应的mono解压放在本地。

    在终端里先cd到这个目录下。

    打包脚本分两种, 一个是 arm的,一个是x86,执行build_runtime_android.sh 就可以了, 它会自动调用build_runtime_android_x86.sh。

    3.3.执行编译命令。

    这两个文件在mono-unity-5.3\external\buildscripts目录下,但是你需要在mono-unity-5.3目录下来执行build_runtime_android.sh,因为只有这个目录下有需要的makefile等文件,所以在终端执行应该是这样的:

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. cd Document/mono-unity-5.3  
    2. ./external/buildscripts/build_runtime_android.sh  

    如果不出意外应该成功了,不成功的也没关系,看错误然后分析下或搜一下,应该就没啥问题了。



    4.Unity Mono编译

    打包脚本我们需要改一下,因为下载下来的脚本直接运行打的是debug版本,效果就是打出来的.so比unity自带的大很多。我们要改成release版本。如下图所示,左边是x86,右边是arm。

    arm:把CFLAGS里的-g改成-O2 (O0 ,O1,O2,OS,O3分了好几个压缩档次,我觉得O2就可以了)然后在LDFLAGS里加上-Wl,–gc-sections \ 就行了(有的话就不要加了)。

    X86: 这里只把-g去掉就行,别的什么都别改。


    然后在下面把这两句代码注释掉,不然编译的时间就要增加了。

    #clean_build “$CCFLAGS_ARMv5_CPU” “$LDFLAGS_ARMv5” “$OUTDIR/armv5”
    #clean_build “$CCFLAGS_ARMv6_VFP” “$LDFLAGS_ARMv5” “$OUTDIR/armv6_vfp”

    在打mono.so前记得改一下解密算法。因为在测试所以解密和加密算法我们就写简单一点。如下图所示,mono-unity-5.3、mono/metadata/image.c里面找到 mono_image_open_from_data_width_name 。 因为我只会对自己写的c#编译后的dll加密,所以这里判断一下是否是我们自己的dll,解密算法很简单就是让字节下标为1的字节-1。

    如果你要热更DLL时一定要注意!!这里一定要先判断一下name是否为NULL 不然使用System.Reflection.Assembly.Load  在Android平台反射调用DLL的时候unity 会挂的。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. if(name != NULL)  
    2. {  
    3.     if(strstr(name,"Assembly-CSharp.dll")){  
    4.         data[0]-=1;  
    5.     }  
    6. }  

    代码如下图所示:


    还有如果想在 mono里打印Log的话可以使用

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. #include <glib.h>  
    2.   
    3. g_message(“momo: %s”,str);  

    OK 然后开始编译mono吧。arm 和x86 两个大概 5 分钟左右就能编译完成。

    直到出现以下字样,说明我们已经编译成功了。

    Build SUCCESS!

    Build failed? Android STATIC/SHARED library cannot be found… Found 4 libs under builds/embedruntimes/android


    注意:出Build failed?字样,并不是我们编译失败了,而是我们注释掉了build_runtime_android.sh 第145、146行,有些库就没有编译。只编译我们要的库,加快编译速度。

    编译出来的库位于builds/embedruntimes/android/armv7a文件夹中。对应放到adnroid工程中的x86和armeabi-v7a文件夹下。

    编译debug版,请将build_runtime_android.sh 第66行的 -g 加上。

    编译release版,请将build_runtime_android.sh 第66行的 -g 去掉。


    5.替换libmono.so  并加密Assembly-CSharp.dll

    替换libmono可以使用手动拷贝,又或者利用雨凇momo的使用ANT来自动完成。

    我这里实现了在Unity内部利用编辑器来实现libmono.so 的替换并且把Assembly-CSharp.dll的加密也写了进去,这只是一个简单的字节便宜加密来测试,更复杂的加密算法你可以自己去实现:

    5.1.Unity工程配置

      首先需要在你的工程Edior文件夹下新建一个Encrypt文件夹,放上你的含解密算法的 libmono.so 文件。然后利用编辑器脚本替换原始的libmono.so 文件。然后给你的Assembly-CSharp.dll进行加密,最后导出APK就是我们需要的加密的APK了。

    Unity工程配合如下图所示:


    下面是编辑器脚本BuildPostprocessor.cs,需要在BuildSetting下选择Google Android Project的选项,在导出Android工程的时候Unity自动调用的代码:

    [csharp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. /** 
    2.  * 文件名:BuildPostprocessor.cs 
    3.  * Des:在导出Eclipse工程之后对assets/bin/Data/Managed/Assembly-CSharp.dll进行加密 
    4.  * **/  
    5.   
    6. using UnityEngine;  
    7. using UnityEditor;  
    8. using UnityEditor.Callbacks;  
    9. using System.IO;  
    10.   
    11. public class BuildPostprocessor  
    12. {  
    13.     static string version = "5.3";  
    14.   
    15.     [PostProcessBuildAttribute(100)]  
    16.     public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject)  
    17.     {  
    18.         if (target == BuildTarget.Android && (!pathToBuiltProject.EndsWith(".apk")))  
    19.         {  
    20.             //Debug.Log("target: " + target.ToString());  
    21.             //Debug.Log("pathToBuiltProject: " + pathToBuiltProject);  
    22.             //Debug.Log("productName: " + PlayerSettings.productName);  
    23.             //DLL在android工程中对应的位置   
    24.             string dllPath = pathToBuiltProject +"/" + PlayerSettings.productName+ "/assets/bin/Data/Managed/Assembly-CSharp.dll";  
    25.   
    26.             if (File.Exists(dllPath))  
    27.             {  
    28.                 //先读取没有加密的dll    
    29.                 byte[] bytes = File.ReadAllBytes(dllPath);  
    30.                 //字节偏移 DLL就加密了。    
    31.                 bytes[0] += 1;  
    32.                 //在写到原本的位置上    
    33.                 File.WriteAllBytes(dllPath, bytes);  
    34.                 Debug.Log("Encrypt Assembly-CSharp.dll Success");  
    35.   
    36.                 //替换 libmono.so;  
    37.                 {  
    38.                     string armv7a_so_path = pathToBuiltProject + "/" + PlayerSettings.productName + "/" + "libs/armeabi-v7a/libmono.so";  
    39.                     File.Copy(Application.dataPath + "/Editor/MonoEncrypt/libs"+version+"/release/armv7a/libmono.so", armv7a_so_path, true);  
    40.   
    41.                     string x86_so_path = pathToBuiltProject + "/" + PlayerSettings.productName + "/" + "libs/x86/libmono.so";  
    42.                     File.Copy(Application.dataPath + "/Editor/MonoEncrypt/libs"+version+"/release/x86/libmono.so", x86_so_path, true);  
    43.                 }  
    44.   
    45.                 Debug.Log("Encrypt libmono.so Success !!");  
    46.             }  
    47.             else  
    48.             {  
    49.                 Debug.LogError(dllPath+ "  Not Found!!");  
    50.             }  
    51.         }  
    52.     }  
    53. }  

    但是,高兴的别太早。DLL是解不开了,但是你的解密算法是写在.so里面的,那么对方反编译你的.so取出解密算法,随便写个小工具就可以把你的DLL逆向回来。。

    在windows上下载Ida Pro神器(真是道高一尺魔高一丈啊)。IdaPro下载连接

    然后打开我们编译的libmono.so

    找到mono_image_open_from_data_width_name 方法,然后点击F5 解密算法就破解了。


    因此我们需要二次加密我们的 .so文件...可以去看雨凇Momo的 Unity3D研究院之Android二次加密.so二次加密DLL(八十二)

    展开全文
  • 我把Unity加密分为三个方向 每个方向是完全不同的内容,同时又是不得不防的不同方面 加密方向: 1.C# dll 加密 2.数据加密(模型,纹理贴图,UI) 3.阻断安装(加密狗,序列号) 本文主要讨论的是第2...

    按照我自己的理解

    我把Unity的加密分为三个方向

    每个方向是完全不同的内容,同时又是不得不防的不同方面


     

    加密方向:

    1.C# dll 加密

    2.数据加密(模型,纹理贴图,UI)

    3.阻断安装(加密狗,序列号)

     

    本文主要讨论的是第2种

    数据方向的加密

     

    尽管资源(Assets)在传输时可使用加密进行保护,但在数据流入客户手中后,其内容就有可能被获取,例如,有的工具可以记录驱动程序上的3D数据,允许用户获取传送至GPU的模型和纹理,因此,我们的立场通常是在用户决定提取资源时,才满足用户要求。

    当然,如果需要,也可以对资源包(AssetBundle)文件使用自己的加密方式进行数据密。

     

    上面是官方的一段描述

    就不废话了,还是直接贴代码吧。。

    //1.加密:对assetbundle的字节数组每位进行与key的异或处理(相同为0,不同为1)
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    namespace AbEncypt
    {
        class Program
        {
            const Byte key = 157;
            static void Main(string[] args)
            {
                var dir = Directory.GetCurrentDirectory();
                foreach (var f in new DirectoryInfo(dir).GetFiles("*.assetbundle", SearchOption.AllDirectories))
                {
                    Byte[] temp = File.ReadAllBytes(f.FullName);
                    Encypt(ref temp);
                    File.WriteAllBytes(f.FullName, temp);
                }
            }
            static void Encypt(ref Byte[] targetData)
            {
                int dataLength = targetData.Length;
                for (int i = 0; i < dataLength; ++i)
                {
                    targetData[i] = (byte)(targetData[i] ^ key);
                }
            }
        }
    }

     

            //2.解密
            WWW www = new WWW(User.BundleUrl);
            yield return www;
    
            byte[] stream = www.bytes;
            Encypt(ref stream);
            AssetBundle bundle = AssetBundle.LoadFromMemory(stream);

     


     

    使用方法:

    1.加密

    将加密代码放在一个新的VS工程里

    并发布成exe文件

    把这个exe文件放在AssetBundle的文件夹中

    运行exe文件,便已经将刺文件夹下的所有AssetBundle文件加密了

    2.解密

    再运行一次exe文件,便可以解密

    3.使用过程

    将AssetBundle文件制作好之后,先进行加密,然后才能把AssetBundle提交给服务端以供下载

    将解密代码写在客户端读取AssetBundle前,然后就可以正常读取AssetBundle了


     

    原理:

    此方法简单暴力

    将AssetBundle文件中的每一个字符都与一个秘钥异或处理,就完成了加密

    上面代码中“157”这个数字就是秘钥,一定要注意对秘钥的保密

    再进行一次异或,所有字符又会变回之前的数据,变回正常的AssetBundle

    可以进行一些变种

    除了使用其他秘钥外

    还可以只异或第一个字符、前两个字符等等形式

     

    虽然是一种很简单的方式,但是想要破解,难度还是非常大的~

    转载于:https://www.cnblogs.com/fws94/p/10375285.html

    展开全文
  • 点击打开工程资源包AssetBundle本来就不是安全的,我们可以将AssetBundle包,转换成byte流,然后加载的时候通过byte流加载。转换为byte流的时候可以添加加密方法;在加载的时候用对称的方法进行解密,具体做法我在...
  • 本文主要讲解Unity导出安卓工程到AS,对应的目录情况。我所用软件的版本:  Unity 5.3.5f1  AndroidStudio 1.3.1前导步骤:第一步,创建一个新的工程Unity_Build_to_Android第二步,创建以下文件
  • Unity3D安卓导出包加密学习–加密Assembly-CSharp.dllUnity3D安卓导出包加密学习—-编译mono http://blog.csdn.net/grimraider/article/details/51193224加密: 主要是用的Unity的PostProcessBuild功能,自己随便...
  • unity代码加密for Android,mono编译 最原始的介绍博文:http://www.luzexi.com/unity3d/index.html 老大丢给我的博文:http://www.cnblogs.com/xijianchui/p/5242527.html 在mac上编译 参考博文: 1....
  • Unity3d 加密 Assembly-CSharp dll Android平台 全记录
  • 首页 资讯 专题 周刊 技术 ...首页 > 技术 > 移动开发 > Android > Unity ...Unity 3D Android对dll加密和重编译mono源码进行解密 0条评论  为防止Unit
  • U3D 防止破解修改。DLL加密以及mono解密。。PC和Android平台下对Unity3D应用进行加密解密全程操作,详细实录
  • 前言: 以前写过Unity加密apk的方法,但是那只是非常初级的,现在使用了不同的方法,... http://www.luzexi.com/unity3d/游戏架构/前端技术/2015/04/11/Unity3D-重新编译Mono加密DLL/   正文: 1:下载必要工具 mo
  • Unity3D 08-Android加密DLL

    2017-06-30 17:12:05
    加密原理Unity3D 是基于 Mono的,我们平时写的 C# 脚本都被编译到了 Assembly-CSharp.dll ,然后 再由 Mono 来加载、解析、然后执行。 Mono 加载 Assembly-CSharp.dll 的时候就是读取文件到内存中,和平时读取一个 ...
  • 本文只是讲述一下过程,采用很简单的打包加密方法,至于需要什么样的加密结果,请大家按照需求去修改,字节偏移、前后颠倒加算法都可以,不过一般无需这么复杂,而且太复杂的加密对于极其追求运行效率的游戏来说,也...
  • 我最近研究发现80%以上的Unity3D游戏都没有做代码混淆。而且我觉得反编译后的代码可阅读性更加好。今天把《锁链战记》的代码和资源都反编译出来了。 1.Unity编译后最终会将代码编译在dll里面,无论是ios还是...
  • 1.Unity3D研究院之Android加密DLL与破解DLL .SO 2.Unity3D研究院之Android二次加密.so二次加密DLL 假装读者已经看过上面的两篇文章了,下面我会记录一下我做的整个加密流程。 一.选取加密Dll的算法  我们主要...
  • 对ab进行加密,防止资源被轻易盗取;网上有很多种加密,实在太废力了;以下加密只能防小白使用工具盗取;废话不多说 public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions ...
  • Unity3d 是基于 Mono的,我们平时写的 C# 脚本都被编译到了 Assembly-CSharp.dll ,然后 再由 Mono 来加载、解析、然后执行。Mono 加载 Assembly-CSharp.dll 的时候就是读取文件到内存中,和平时读取一个 游戏资源 ...
  • Unity3D研究院之Android二次加密.so二次加密DLL(八十二)  雨松MOMO 【Unity3D研究院之游戏开发】 围观3916次 42条评论 编辑日期:2015-07-17 字体:大 中 小 上文中说了怎么给DLL加密来...
1 2 3 4 5 ... 20
收藏数 508
精华内容 203