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
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
在文件的上半部分就可以看到需要的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
[root@workstation ndk]# source /etc/bashrc
[root@workstation ndk]# echo $ANDROID_NDK_ROOT
/usr/ndk/android-ndk-r10r
[root@workstation 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安装软件
Centos YUM更新软件:http://jingyan.baidu.com/article/19020a0ac84c3d529d2842ee.html
centos安装软件:https://www.centos.org/forums/viewtopic.php?t=871 查找某一类软件:yum list *Firefox*
文献资料
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
雨松
Unity3D研究院之Android加密DLL与破解DLL .SO(八十一):http://www.xuanyusong.com/archives/3553
其它
Unity 3d脚本加密方案:http://www.cppcourse.com/u3d-encryption.html
进度
已完成
- ndk安装及配置完成
- unity mono库clone到本地
遇到问题
- 安装gtk卡在 libffi 版本太低
我的环境
IL2CPP
之后的项目极可能会使用IL2CPP。如果是IL2CPP的话,就无需这一套加密了,因为通过IL2CPP生成的包中并不存在dll,而是二进制文件。
更多关于IL2CPP的资料,可以查看Unity官方的资料,或者我之前的文章:http://www.cnblogs.com/zhaoqingqing/p/3842690.html
Unity Mono脚本 加密的更多相关文章
- Windows 下使用 mingw+msys 交叉编译 Android Unity Mono
对于没有升级到 Unity5.4的用户,发布安卓版本都会有对 C# 脚本进行加密的需求,我们项目在裸奔了很长时间后,决定开始做这件事. 网上查看了很多资料,我很希望直接在 windows 下编译而不去 ...
- Unity获取脚本的CustomEditor(自定义编辑)数据
在此之前,粗略的介绍下 CustomEditor(自定义编辑). Unity对于我们创建的Mono脚本提供了属性面板的展示和修改.默认情况下,Inspector面板中会显示当前脚本类的公开字段(pub ...
- cocos2dx资源和脚本加密quick-lua3.3final
一.资源加密 版本号:Quick-Cocos2d-x 3.3 Final 调试工具:xCode 工程创建的时候选择的拷贝源码. 项目结构如图: 这个功能七月大神在很早之前就已经实现了,但是在3.3版本 ...
- 【Quick 3.3】资源脚本加密及热更新(三)热更新模块
[Quick 3.3]资源脚本加密及热更新(三)热更新模块 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 lua相对于c++开发的优点之一是代码可以在运行的时候才加载,基于此我们 ...
- 【Quick 3.3】资源脚本加密及热更新(二)资源加密
[Quick 3.3]资源脚本加密及热更新(二)资源加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 在前一篇文章中介绍了代码加密,加密方式是XXTEA.对于资源文件来说,同样 ...
- 【Quick 3.3】资源脚本加密及热更新(一)脚本加密
[Quick 3.3]资源脚本加密及热更新(一)脚本加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.脚本加密 quick框架已经封装好加密模块,与加密有关的文件在引擎目录/quic ...
- shell 脚本加密
日常编写shell脚本时会写一些账号和密码写入脚本内,但是不希望泄露账号密码,所以对shell脚本进行加密变成可执行文件. 主要使用 shc 对 Linux shell 脚本加密,shc是一个专业的加 ...
- 游戏编程之Unity常用脚本类的继承关系
前言学习Unity开发引擎的初学者会接触大量的脚本类,而这些类之间的关系往往容易被忽略.本文对Unity引擎开发中的一些常用类及其关系进行了简单的归纳总结. 博文首发地址:http://tieba.b ...
- Unity基础-脚本生命周期
理解Unity脚本的生命周期对游戏开发很重要,这篇文章对生命周期做一个记录和总结.Unity的脚本生命周期(消息),也就是在脚本运行时,自动并且按顺序执行的一系列函数.在unity官网中有对生命周期详 ...
随机推荐
- 使用python发送和接收邮件
关于电子邮件 大学之前,基本不用邮箱,所以基本感觉不到它的存在,也不知道有什么用:然而大学之后,随着认识的人越来越多,知识越来越广泛,邮箱已然成为很重要的通讯工具,大学一些课程作业需要有邮箱发给老师, ...
- 对于UDS(ISO14229-2006) 汉译的声明(必读)
本系列文章系作者个人翻译,最初目的为方便以后阅读和锻炼英语能力,欢迎读者参阅品鉴,本文不正确之处欢迎读者指出. 本文在此声明著作权利:转载必须注明出处,修改必须通知本作者
- github指令
一般用法 git stash git pull git stash pop 结局冲突 git add . git commit -m "message" git push 查看 g ...
- 【HTML5&CSS3进阶学习01】气泡组件的实现
前言 气泡组件在实际工作中非常普遍,无论是网页中还是app中,比如: 我们这里所谓气泡组件是指列表型气泡组件,这里就其dom实现,css实现,js实现做一个讨论,最后对一些细节点做一些说明,希望对各位 ...
- UIPickerView的使用(二)
上篇文章 UIPickerView的使用(一)学习了如何创建单列选择器,现在看一下如何创建多列选择器 多列选择器(以二列为例) 1.遵守协议和创建两个数据源 2.创建pickView 3.实现代理 / ...
- HTTP慢速DOS(slow http denial of service attack)
0x00用途 DOS攻击测试 0x01原理 传送门: http://blog.csdn.net/meiru8/article/details/38726025 https://www.nigesb.c ...
- iOS之关于 srand() 和rand()
srand(seed)用来将随机序列的起始点设为seed srand((int)time(0))表示以当前时间对应的int值为随机序列起点,这样每次运行程序,由于起点不同才可以得到不同的随机数 tim ...
- iOS多线程之1.从Thread看多线程的生命周期
Thread 是多线程中最容易理解,但是使用起来又是最麻烦的一种多线程方法.为什么说容易理解呢?一个NSThread的对象就是一条线程.使用起来麻烦是因为,需要我们自己管理线程的生命周期:创建线程 ...
- 好用的第三方控件,Xcode插件(不断更新)
第三方控件类: 1.提示框 MBProgressHUD: 是一款非常强大的.提供多种样式的提示框.使用起来简单.方便.可以在GitHub上查看具体的使用方法. https://github.com ...
- Android中的HTTP通信
前言:近期在慕课网学习了慕课网课程Android中的HTTP通信,就自己总结了一下,其中参考了不少博文,感谢大家的分享. 文章内容包括:1.HTTP简介2.HTTP/1.0和HTTP/1.1之间的区别 ...