使用Virvirtualbox 加密Protector对Unity3d软件进行加密?

sponsored links
unity代码加密
因为项目需要对unity代码进行加密,确定的方案就是加密编译后的dll,然后修改mono-unity源码加入解密代码,然后重新打包成&libmono.so。
网上有很多资料证实这个做法是可行的,但是在实践过程中这个过程的第一步就遇到了很大的困难--无法成功编译!!!后面我具体说下我的探索过程.
首先尝试的是linux环境,下载虚拟机安装linux环境,这一步很简单。但是对于我这样的linux小白来说使用命令行下载软件简直是噩梦,尤其是在国内环境各种墙各种下载困难的情况下,我放弃了这个环境。
然后鉴于osx系统可以执行sh脚本也有很方便的文件管理,我下载了osx系统。中间有段时间我尝试了windows下的cygwin,也是由于一些软件难以安装放弃了。
下载unityMono源码(unity mono 地址:&。你需要选择对应的版本号下载。)下载时可以用下载软件加速或者用离线方式下载,比http直连要快。autoconf
automake libtool perl 等工具,在编译过程中会提示你需要一些工具,就去下载安装吧。
按网上搜索资料的提示,把external/buildscripts下面的build_runtime_android.sh拷贝到mono目录下执行,系统没有对应版本的ndk,脚本会自动下载安装,然后在安装完成后出现提示:envsetup.sh
没有找到(这个问题困扰了我很久,因为项目哪怕系统中都没有这个文件的存在,于是百度谷歌发现这个文件也就是在android source里面用到过,而实际上这个项目跟android source没有一点关系)。最后我只能去看它的脚本是如何写的,然后我发现在prepareandroidsdk.pm脚本中,在写入envsetup.sh(原来这个文件是写入的而不是默认就存在的)时则只判断了是否有sdk环境(一个bug)。于是把if ($setenv and ($ENV{$SDK_ROOT_ENV} or
$ENV{$SDK_ROOT_ENV})) 修改成&if ($setenv and ($ENV{$SDK_ROOT_ENV} or $ENV{$NDK_ROOT_ENV}))就解决问题了。
后面还遇到了一个小问题:../libtool 找不到,在网上稍微搜寻了下答案发现可能是libtool版本跟项目中不一致导致的。修改aclocal.m4文件,将上面的LIBTOOL='$(SHELL)
$(top_builddir)/libtool'改成LIBTOOL='$(SHELL) &/usr/bin/libtool'后重新编译解决。
编译成功后,就是如何加入解密算法然后重新打包了,现在还没有实现,后续如果有坑的话再写出来。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在经历一番波折以后终于完成了unity代码加密的工作,下面我会列出距离步骤。
在成功编译mono以后,下一步就是确定加密解密算法。其实算法怎么样都可以,关键是要加入到mono的源码中。我在网上找了一个DES加密算法的c程序,结构很简单,单文件。然后用vs建立了一个项目来测试程序是否可靠。用fread二进制方式读取一个文件,进行加密然后解密,再用fwrite写入另一个文件。(这个过程中遇到过问题,经过一番探索找到了原因是读取和写入必须同时使用二进制方式fopen(path, &rb&); fopen(newPath,
再确定程序OK后,把代码拷贝到mono/metadata目录中新建文件 crypt.c 和crypt.h。在根目录下makefile文件中加入crypt.c和crypt.h,这样自动编译时才会包含文件。然后在image.c中引用&crypt.h&,并在mono_image_open_from_data_with_name方法中加入解密函数。
g_warning(&dll name:%s \n&, name);
if (strstr(name, &Assembly-CSharp&))
decry(data, data_len);
代码中decry是自定义的解密函数,然后if判断指定了我们只加密Assembly-CSharp.dll这一个文件。值得一提的是在mono环境下是没有bool这个类型的,所以我改成了int类型,而这样导致了memcpy的时候字节数不对,过了很久我才发现这个问题,于是把memcpy对应的字节数都乘以4解决问题。
重新编译mono成功,拷贝出libmono.so备用。
然后在自己的项目中编写一个控制台程序,传入文件路径自动加密,将程序拷贝出来备用。
下一步是讲需要加密的apk进行解包然后再封包和签名,这一步用apktool实现,网上有很多资料和工具来做这个工作,就不赘述了。
最后将自己编译的so和加密程序结合起来,将apk重新打包,任务完成!
ps:还有一个遗漏的问题就是自己编译的libmono.so文件有8M大小 而unity自带的只有3M多。经高人指点,在build_runtime_android.sh中去掉-g 参数,编译出来的libmono.so就只有4M多了。然后使用 ndk路径下的toolchains/arm-linux-androideabi-4.8/prebuild/darwin-x86/bin/arm-linux-androideabi-strip 命令对so文件去除标记,so文件就瘦身到3M多了。
原文地址:/thejavafan/item/5bc8d20a23f0f7d8dde5b033 Unity代码混淆方案内容提要:Unity引擎下的代码保护,由于Unity引擎的一些特殊性,实行起来较为复杂,在国内外业界并没有现成的方案.笔者通过在&QQ乐团&项目上的实际尝试,得出了一种具体可行,能够有效保护代码 ...
公司要求加密开发的代码源文件要求一部分加密一部分不加密. 最著名的就是Zend公司的Zendencoder了,但是不是开源软件.好不容易找到一个破(po)解(jie)版本的.全部加密的时候可以使用,部分文件加密不能使用很是纳闷,换成php4的部分加密也能使用.(破(po)解(jie)版的怎么这个时候不好使啊 .) 另想办法,在google上找到一个php_s ...
前言: 这一节我们将使用ant来加密和压缩js代码:主要通过我们的项目snow来讲解 代码下载 /makeapp/cocoseditor-samples (snow-lock) 操作过程 1 打开main.js,给代码加上如下if处理(如果是android平台,不需要require),因为我们准备把所有的js代码加密成sn ...
摘要:所谓SMC(Self Modifying Code)技术,就是一种将可执行文件中的代码或数据进行加密,防止别人使用逆向工程工具(比如一些常见的反汇编工具)对程序进行静态分析的方法,只有程序运行时才对代码和数据进行解密,从而正常运行程序和访问数据.计算机病毒通常也会采用SMC技术动态修改内存中的可执行代码来达到变形或对代码加密的目的,从而躲过杀毒软件的查 ...
先声明,娱乐向,至于有没有实用价值就不知道了...轻喷哈.
今天在网上乱逛的时候看到了陈浩大牛的这篇博客:/articles/1142.html 感觉里面说的WhiteSpace语言很有意思.维基百科: http://zh.wikipedia.org/wiki/Whitespace 一般的编程语言都会忽略空白字符 ...相关文章推荐
祝福大家2015年新年快乐!
先题外话扯淡一下2014年过去,忙碌的一年,工作上是经历了风风雨雨,不过相信2015你和我一样会运气大好!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...
无论从减少安装包大小还是迎合unity64位IL2CPP默认就会打开StrippingLevel功能,通过库剖离来减少DLL的空间大小。
那么问题是我们自定义库使用了一些type,例如xml,或...
Android中我为什么发不了邮件???我手机里明明有邮件客户端的,可我为什么不能调用它发送邮件???相信这是很多人会问的问题,手机里有Email客户端,可是偏偏在自己的应用里调用不了,抑或是不知道怎...
最近项目需要更改分享方式,以前接入各种SKD去分享的,现在要求直接使用IOS原生分享的接口!
一开始去网上找,发现并没有人直接写代码使用,但是在Unity的AssetStore中我找到了一个插件,也就...
最后再来说说模型怎么交互。模型交互主要还是以下这些交互方式:
主要的交互方式包括:
1、模型的旋转、平移和缩放
这些需要配合触屏来操作。
2、模型的选定-射线法
模型选定之后显示高...
本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。
http://blog.csdn.net/lzhq1982/article/details/
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)3317人阅读
Unity(112)
在同事的指导下,明白了网络加密的缘由以及手法。在网络通讯中,如果数据不进行加密,那么这些数据都是透明的 。就相当于你去寄信,但是这封信居然没有用信封装起来,这样邮局的任何一个人都可以拿过来看信的内容,毫无安全性可言。电脑中发送出去的每个数据包,都要在交换机 路由器上通过。如果你发送一个登陆网站的请求,而这个请求没有加密,那么在路由器上能明明白白的看到你的帐号密码。最简单的测试方式:在电脑上安装WireShark,然后让手机连上电脑发出去的Wifi,在WireShark中能看到手机发送的所有数据。现有的加密分为 对称加密和非堆成加密。对称加密:客户端和服务端 使用相同的密钥,加密速度很快,比如 DES 。非对称加密:客户端和服务端使用 不相同的密钥,加密速度非常慢。比如 RSA 。转自http://blog.csdn.net/huutu .cn一般项目中的加密流程如下C#库 中为我们提供了RSA和DES加密的API,下面分别来看。/**************************
* 文件名:UEncrypt.
* 文件描述:RSA加密 解密;
* 创建日期:;
* Author:ThisisG
* Page:/ThisisGame/UEncrypt.git
***************************/
using System.IO;
using System.T
using System.Security.C
namespace ThisisGame.UEncrypt
public class UEncrypt
/// &summary&
/// 生成RSA私钥 公钥
/// &/summary&
/// &param name=&privateKey&&&/param&
/// &param name=&publicKey&&&/param&
public static void RSAGenerateKey(ref string privateKey, ref string publicKey)
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
privateKey = rsa.ToXmlString(true);
publicKey = rsa.ToXmlString(false);
/// &summary&
/// 用RSA公钥 加密
/// &/summary&
/// &param name=&data&&&/param&
/// &param name=&publicKey&&&/param&
/// &returns&&/returns&
public static byte[] RSAEncrypt(byte[] data, string publicKey)
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publicKey);
byte[] encryptData = rsa.Encrypt(data, false);
return encryptD
/// &summary&
/// 用RSA私钥 解密
/// &/summary&
/// &param name=&data&&&/param&
/// &param name=&privateKey&&&/param&
/// &returns&&/returns&
public static byte[] RSADecrypt(byte[] data, string privateKey)
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privateKey);
byte[] decryptData = rsa.Decrypt(data, false);
return decryptD
/// &summary&
/// DES加密
/// &/summary&
/// &param name=&data&&源数据&/param&
/// &param name=&desrgbKey&&&/param&
/// &param name=&desrgbIV&&&/param&
/// &returns&&/returns&
public static byte[] DESEncrypt(byte[] data,byte[] desrgbKey,byte[] desrgbIV)
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, des.CreateEncryptor(desrgbKey, desrgbIV), CryptoStreamMode.Write);
cryptoStream.Write(data, 0, data.Length);
cryptoStream.FlushFinalBlock();
return memoryStream.ToArray();
/// &summary&
/// DES解密
/// &/summary&
/// &param name=&data&&源数据&/param&
/// &param name=&desrgbKey&&&/param&
/// &param name=&desrgbIV&&&/param&
/// &returns&&/returns&
public static byte[] DESDecrypt(byte[] data, byte[] desrgbKey, byte[] desrgbIV)
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, des.CreateDecryptor(desrgbKey, desrgbIV), CryptoStreamMode.Write);
cryptoStream.Write(data, 0, data.Length);
cryptoStream.FlushFinalBlock();
return memoryStream.ToArray();
测试工程下载:/ThisisGame/UEncrypt&Github 求Star
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1272860次
积分:16151
积分:16151
排名:第730名
原创:331篇
转载:108篇
评论:284条
文章:32篇
阅读:116079
(4)(1)(1)(2)(1)(1)(5)(1)(3)(3)(3)(5)(6)(4)(7)(1)(18)(18)(17)(13)(9)(24)(25)(2)(7)(5)(9)(17)(11)(7)(25)(8)(9)(1)(4)(12)(6)(2)(3)(16)(21)(10)(14)(1)(7)(25)(11)(6)(13)(4)(8)(7)(2)Unity3D研究院之提取游戏资源的三个工具支持Unity5
接着找一个Unity3d做的游戏,这里我在补充一下如何辨认某个游戏是用u3d做的。1.在网上随便下载一个游戏.ipa,并且解压到本地。2.找到xxx/xxx.app,右键显示包内容,打开Data文件夹。3.如果发现文件夹中包含 unity default resources 文件,那么恭喜你这个游戏就是用unity3d做的。再看看这里几个比较重要的文件。level0 / leve1 …. & 图中0-5一共有6个文件,这表示这个游戏用了6个游戏场景。sharedassets0/sharedassets1 …. 图中0-6一共有7个文件,它的数量永远比场景的数量多一个,可见它和场景有关联性,可以用工具把它解开看看。Managed:这个文件夹下放的都是dll ,unity自己写的脚本编译成dll后就放在这里,还有其他第三方的dll也放在这里。resources.assets:这个东西就比较重要了,他游戏里面所有放在resources文件夹下的东西都会放在这里,我们提取也主要在这里提取。Raw:如果游戏在StreamingAssets文件夹下放东西,那么就会出现一个Raw文件夹。<

我要回帖

更多关于 virtualbox direct3d 的文章

 

随机推荐