Unity Mono脚本 加密

加密环境

引擎版本:Unity3D 5.3.4 及更高版本 (使用Mono而并非IL2CPP)

操作系统:CentOS 6.2(Final)

加密环境:Android、IOS(暂定)

加密对象:C#源代码(dll文件)

解密方法:libmono.so (重点:加入解密算法并重编译此文件)

加密的目地

.NET Reflector等反编译工具 无法通过对dll反编译得到源码

注意事项

dll的加密算法和libmono.so解密算法一致

思路分析

重点:我们需要对libmono.so重编译,加入我们的解密算法。

准备环境

编译系统:linux或mac os

我的编译环境:centos 6.2 Final,建议在linux或mac os中编译 libmono.so

linux安装运行库

git

在编译过程中,可能需要通过git获取某些运行库。

查看是否安装git:git –version

CentOS7 yum 安装git

https://git-scm.com/book/en/v2/Getting-Started-Installing-Git

其它package

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

glib >= 2.0  这个一直安装失败

centos安装软件

在root权限下,通过以下命令来安装软件:

yum install [nginx][php][php-fpm][mariadb][mariadb-server][mysql][mysql-server]...

Unity安装Android模块

确保已安装Unity引擎,并且Android模块已安装,Android SDK已安装并更新,保证可以打包APK

正式/测试工程

使用Unity创建一个加密测试项目或正式项目,用来用加密

Unity mono

unity的mono和原生mono有些不一样,所以需要去github拉取unity的mono库

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

monobuildtools

unity mono打包工具

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

Android SDK Tool/Android6.0

我使用Unity5.3.4在windows上打包apk,需要android sdk tool版本为23,Android6.0,所以同样请先准备好环境

Android打包工具

Android Studio:http://www.androiddevtools.cn/ 或者:http://tools.android-studio.org/

Eclipse:https://marketplace.eclipse.org/content/android-development-tools-eclipse

Andmore - Eclipse Android Tooling:https://projects.eclipse.org/projects/tools.andmore

android对应的NDK版本

查看路径:external/buildscripts/build_runtime_android.sh

https://github.com/Unity-Technologies/mono/blob/unity-5.3/external/buildscripts/build_runtime_android.sh

在文件的上半部分就可以看到需要的NDK版本,我在2016-06-25 clone的,需要的NDK版本为r10e

android-ndk 下载

根据android和unity的版本不同,需要的ndk版本也不同,我这儿以2016-06-25 clone的仓库为例,需要ndk-r10e

x64

android-ndk-r10e-linux-x86_64.bin:http://pan.baidu.com/s/1dDAqnK1

x86

android-ndk-r10e-linux-x86.bin:http://pan.baidu.com/s/1sjoneRr

设置android ndk环境变量

反编译工具测试加密结果

.Net反编译工具

主要加密对象是Assembly-CSharp.dll,所以可以准备几款.Net反编译工具来测试加密结果

下面举例.net的反编译工具

.NET Reflector:http://www.red-gate.com/products/dotnet-development/dotnet-developer-bundle/

C语言反编译工具

如果对libmono.so也加密的话,那还需要准备几款C语言反编译工具

下面举例C语言反编译工具

ida pro

官网:https://www.hex-rays.com/products/ida/

代销商:http://xlsoft.com.cn/category/%E5%8F%8D%E7%BC%96%E8%AF%91%E5%B7%A5%E5%85%B7/

libmono.so(解密方法)

加密C#的dll

根据自己的实际情况,对导出的 assets/bin/Data/Managed/Assembly-CSharp.dll  进行加密

在so中解密dll

Mono加载dll的代码的文件位于/mono/metadata/image.c

mono_image_open_from_data_with_name

打开image.c,找到 mono_image_open_from_data_with_name 方法,把解密方法写在这儿。此方法大概在1807行

MonoImage *
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;

    if (!data || !data_len) {
        if (status)
            *status = MONO_IMAGE_IMAGE_INVALID;
        return NULL;
    }
     //在这儿对加密过的dll进行解密
    if (strstr(name, “Assembly-CSharp.dll”) != NULL)
    {
        //这里是解密过程,我们采用的是xxtea加解密算法。
    }

    //.....
    return register_image (image);
}

遇到的问题

AndroidManifest.xml Error

Unity导出Android Project之后,AndroidMainifest.xml中有一行会报Error: android:debuggable="false" ,无法识别。

解决办法:http://stackoverflow.com/questions/24204140/android-error-when-i-set-androiddebuggable-false-or-true

CentOS安装软件 Error

在CentOS上安装一些软件时遇到:Errno 256] No more mirrors to try

确保系统已连接网络,输入以下命令(作用:重建缓存)

yum clean all
yum makecache

Linux安装ndk.bin?

资料:Linux下安装JDK-(bin版)  http://blog.csdn.net/sonnet123/article/details/9290561

安装步骤

以下命令都是ROOT身份运行

1. 安装ndk-文件拷贝

#mkdir /usr/ndk
#cd /usr/ndk
#cp /xxxx/android-ndk-r10e-linux-x86.bin /usr/ndk

2. 安装ndk-安装和配置环境变量

1. ./android-ndk-r10e-linux-x86.bin   成功后终端输出 Everything is OK

3. 安装ndk-安装成功

Everything is Ok
[[email protected] ndk]# source /etc/bashrc
[[email protected] ndk]# echo $ANDROID_NDK_ROOT
/usr/ndk/android-ndk-r10r
[[email protected] ndk]#

提示要ndk9?

查看参考资料caption的修改

./configure没有那个文件或目录

查看README文件

tar.xz安装

Linux下解压tar.xz格式压缩文件

资料:http://blog.csdn.net/longerzone/article/details/8707118

安装glib

我安装的是glib-2.48.1

1 ./configure  2  make  3 make install

这里configure主要是配置并生成Makefile文件,make主要是对程序进行编译,make install主要是对编译好的程序进行安装

资料:http://www.linuxfromscratch.org/blfs/view/svn/general/glib2.html

安装glib-提示缺少libffi

不知道大家注意到没有,在configure时,出现缺少相关库时解决方法都可以使用 库-devel 解决,那么这个
devel是什么呢?devel是个开发包,只有在开发程序时才会安装。里面包含了头文件、以及开发用到的相关库和

帮助文件等等。一般安装某些工具的时候就会出现

glib的安装:http://blog.chinaunix.net/uid-26126915-id-3368644.html

安装glib依赖库

libffi

下载,解压,执行 ./configure make make install 进行安装

libpcre >=8.13

./configure --with-prce=/usr/local/prec/

tar.bz2安装

命令:tar -xjvf xxx.tar.bz2 来解压,得到解压后的目录再进一步安装

其它错误

1. 文件格式错误

/bin/bash^M: bad interpreter: 没有那个文件或目录

方法二:在windows下用Notepad++修改格式为unix

PKG_CONFIG_PATH environment

如果配置 PKG_CONFIG_PATH

Linux操作知识

查看系统版本

lsb_release –a

查看linux系统位数

getconf LONG_BIT 输出32则是x86,输出64则是x64

给shell赋于root权限

1. 输入 su  2.输入root密码 回车

执行脚本:chmod 700 hello.sh

文件拷贝

cp [选项] 源文件或目录 目标文件或目录

访问共享文件夹

1.virtual box设置共享文件夹

2. 这一步是在mnt下创建share目录,可不创建

mkdir /mnt/share

步骤3,有两种方法

如果你希望把共享目录放在share下,并且mnt也创建 了share目录:
    #sudo mount -t vboxsf 共享文件夹名/mnt/share ,比如我的:

mount -t vboxsf mono/mnt/share

你希望直接放在mnt下:

#sudo mount -t vboxsf 共享文件夹名/mnt,比如我的:

mount -t vboxsf mono/mnt

4. 在 文件系统 – mnt 下就可以看到共享内容了

cd 目录操作

以root用户登录之后,默认是在当前用户文件夹内,往上跳到文件主目录中:cd ../../

virtualbox 虚拟和主机粘贴板共享

1. 从virtualbox官网下载对应版本的增加工具包,进行安装

2. 在linux中加载工具包 ios镜像,进行安装

3. 虚拟机和主机可以共享粘贴板内容了

Centos安装软件

CentOS6.X安装QQ2012

终于可以在centos下使用QQ啦!

Centos YUM更新软件:http://jingyan.baidu.com/article/19020a0ac84c3d529d2842ee.html

centos安装软件:https://www.centos.org/forums/viewtopic.php?t=871       查找某一类软件:yum list *Firefox*

文献资料

Unity 自动导出 AndroidStudio 项目

Perl语言(*.pl文件)

perl是解释性语言, 可用于linux/unix系统。可以理解为和windows下的bat一样。

  • *.pl 是perl语言的库文件,通常用 require xx.pl; 来加载
  • *.pm 是perl语言的模块文件,通常用 use module; 来加载
  • *.plx 是perl语言的脚本文件

运行: ./路径/文件名 (前面的“./”表示运行命令)

结束: ctrl + c

注释

单行:#开头,有个例外perl程序第一行也是#开头

多行:=pod 注释多行代码块 =cut

参考资料

Captain

Unity3d 加密 Assembly-CSharp.dll (Android平台) 全记录:http://blog.csdn.net/huutu/article/details/50829828

技术人生

Unity3D-重新编译Mono加密DLL

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

雨松

Unity3D研究院之Android加密DLL与破解DLL .SO(八十一):http://www.xuanyusong.com/archives/3553

其它

Unity 3d脚本加密方案:http://www.cppcourse.com/u3d-encryption.html

进度

已完成

  1. ndk安装及配置完成
  2. unity mono库clone到本地

遇到问题

  1. 安装gtk卡在 libffi 版本太低

我的环境

IL2CPP

之后的项目极可能会使用IL2CPP。如果是IL2CPP的话,就无需这一套加密了,因为通过IL2CPP生成的包中并不存在dll,而是二进制文件。

更多关于IL2CPP的资料,可以查看Unity官方的资料,或者我之前的文章:http://www.cnblogs.com/zhaoqingqing/p/3842690.html

时间: 2024-10-07 09:13:00

Unity Mono脚本 加密的相关文章

Unity Mono

好奇于Unity使用的mscrolib.dll和.Net Framework提供的mscrolib是否一致. 多语言标准通用对象运行时库(Microsoft Standard Common Object Runtime Library),描述:Microsoft Common Language Runtime Class Library, Microsoft .NET Framework 在Unity的安装目录下:X:\xxx\Unity_4.5.0\Editor\Data\Mono\lib\m

sch 助shell脚本加密 02

sch 助shell脚本加密 02 一.  简介 SHC(shell script compiler),即shell脚本编译器.通过SHC编译过的脚本对普通用户而言是不可读的,因此如果你想让你的代码实现加密功能,让其有效的屏蔽一些敏感信息,这个时候可以考虑使用SHC:它通常情况下是不太容易被破解的,但是还是有些人可以通过反编译SHC的方法来实现破解加密过的脚本. 二.  实验测试开始 2.1 下载并编译SHC [[email protected] ~]# wget http://www.dats

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

vbs脚本加密

vbs脚本加密使用screnc程序,它可以加密asp文件.html文件.js,vbs,sct,wsh文件 加密操作 d:\>screnc.exe d:\vbs\sendmail.vbs d:\vbs\sendmail.vbe d:\>dir d:\vbs 驱动器 D 中的卷是 本地磁盘 卷的序列号是 BAD9-2574 d:\vbs 的目录 2016/12/23  14:15    <DIR>          . 2016/12/23  14:15    <DIR>

破解JS脚本加密

有时候一些html内容被加密了,我们看不到这些内容:) 下面选取了2种破解JS脚本加密的方式,大家看看 对于HTML加密或限制来说参考下面的方法www.82676666.com zzzevazzz 写的破大部分加密,显源码的东东,在地址栏输入: javascript:s=document.documentElement.outerHTML;document.write('');document.body.innerText=s; 对于JS加密来说参考下面的方法 最近很多人在问加密代码的问题.其实

Unity3D技术之Android 脚本高级 Unity 手机脚本

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 高级 Unity 手机脚本 设备属性 您可以访问一系列特定设备的属性:     SystemInfo.deviceUniqueIdentifier 唯一的设备标识. SystemInfo.deviceName 用户指定的设备名称. SystemInfo.deviceModel 设备型号. Sys

gzexe 助shell脚本加密 01

gzexe 助shell脚本加密 01 一.  简介 很多时候我们的脚本会涉及到一些私密的信息,例如:用户名,密码,或者其它重要信息的时候,我们使用一些加密的手段来屏蔽这些信息,确保系统的安全已经脚本的可流传性,通常情况下我们只需要通过系统自带的gzexe这个工具就够了. 二.         实验测试开始: 2.1 编写一个用于测试的脚本 [[email protected] ~]# vi woo.sh #! /bin/ksh echo 'PrudentWoo'' '`date +%Y-%m-

Quick-Cocos2d-x Lua脚本加密学习

学习记录一下: 具体看实际操作. 使用cygwin 或者 git 进入shell脚本模式,进入你的项目文件夹: 大概是在:D:\quick-cocos2d-x\bin\yourProject 执行命令: ../compile_scripts.sh -i scripts -m files -o my_scripts <执行编译shell,输入scripts文件夹里面的.lua文件,编译模式是编译成文件,编译输出文件夹是my_scripts> 开始编译了. 如果出现了错误,根据错误,解决排除错误.

【Unity 3D】学习笔记二十七:unity游戏脚本(七)

使用C#编写游戏脚本 在前面提到,unity支持三种语言编写脚本:js,C#,boo.入门的时候建议只用js,因为js比较简单易懂,语法也不是很严格.但后来晋级的时候推荐使用C#,因为它比较符合unity的编程思想,执行效率更高.下面总结下怎么使用C#编写脚本. 继承MonoBehaviour类 在unity中,任何一个脚本,包括上述三种语言都需要去继承MonoBehaviour这个类.为什么我们之前写JS代码的时候没有继承咧?因为在创建JS代码的时候,系统会将其类名与继承关系隐藏起来. 在pr