一次U3D DLL加密的记录(二)

上一篇文章一次U3D DLL加密的记录(一)已经介绍了Assembly-CSharp.dll的加密和打包方法,但每次都得导出安卓工程,接着替换资源,再导出apk,这样以来是非常繁琐的。

这篇文章主要针对windows下对u3d游戏的加密一键打包的介绍

主要步骤:

①:编译加密后的libmono.so

②:在自定义方法中对Assembly-CSharp.dll进行加密

③:破解UnityEditor.Android.Extensions.dll,注入自定义方法

④:一键打包

首先参考一下我的一次编译libmono.so的记录,把我们新生成解密的libmono.so替换掉u3d原来旧的

开发环境:

vs2012,.net framework 2.0

工具清单:

.NET Reflector

reflexil插件

编写自定义程序集:

打开vs2012新建一个c#类库项目,名称中输入MyEncryptionDll,点确定完成

把Class1.cs该名成EncryptionDll

再设置一下工程属性,把工程的的环境改为.net framework 2.0

接着编写自定义方法了,该方法会从u3d打包方法中获取到路径,根据路径去加密和替换Assembly-CSharp.dll,示例代码如下

 1 using System;
 2 using System.Text;
 3 using System.IO;
 4
 5 namespace MyEncryptionDll
 6 {
 7     public class EncryptionDll
 8     {
 9         public static void EncryptionFunc(string stagingAreaData)
10         {
11             try
12             {
13                 string _path = stagingAreaData + "/assets/bin/Data/Managed/Assembly-CSharp.dll";
14                 FileStream _assemblyReadStream = new FileStream(_path, FileMode.Open, FileAccess.Read);
15                 BinaryReader _assemblyBinaryReader = new BinaryReader(_assemblyReadStream);
16                 byte[] _byteData = _assemblyBinaryReader.ReadBytes((int)_assemblyReadStream.Length);
17
18                 _assemblyBinaryReader.Close();
19                 _assemblyReadStream.Close();
20
21                 if (_byteData.Length > 0)
22                 {
23                     // 更改第一个字节信息,破坏程序集结构
24                     _byteData[0] += 1;
25
26                     FileStream _assemblyWriteStream = new FileStream(_path, FileMode.Create, FileAccess.Write);
27                     BinaryWriter _assemblyBinaryWriter = new BinaryWriter(_assemblyWriteStream);
28                     _assemblyBinaryWriter.Write(_byteData);
29
30                     _assemblyBinaryWriter.Flush();
31                     _assemblyWriteStream.Flush();
32
33                     _assemblyBinaryWriter.Close();
34                     _assemblyWriteStream.Close();
35                 }
36                 else
37                 {
38                     //throw new System.Exception("读取不到数据!");
39                 }
40             }
41             catch (System.Exception ex)
42             {
43                 FileStream _logStream = new FileStream("C://log.txt", FileMode.Create, FileAccess.Write);
44                 StreamWriter _sw = new StreamWriter(_logStream);
45                 _sw.Write(ex.Message);
46                 _sw.Flush();
47                 _logStream.Flush();
48
49                 _sw.Close();
50                 _logStream.Close();
51             }
52             finally
53             {
54             }
55
56         }
57     }
58 }

接下来就是编译我们的程序集了,编译选项改成release吧,点 生成-->生成解决方案

成功编译后,在生成目录中找到MyEncryptionDll.dll,把它复制到C:/Program Files (x86)/Unity/Editor/Data/PlaybackEngines/androidplayer目录下

破解UnityEditor.Android.Extensions.dll:

解压reflexil,安装并运行.net reflector(该注册的注册,网址中有教程),加载reflexil插件

点击打开reflexil插件

在目录C:/Program Files (x86)/Unity/Editor/Data/PlaybackEngines/androidplayer中找到UnityEditor.Android.Extensions.dll(记得先备份)

把它拽入.net reflector中打开它。同时也把我们自定义的MyEncryptionDll.dll拽入到.net reflector中

依次展开

UnityEditor.Android.Extensions, Version=1.0.0.0

UnityEditor.Android.Extensions.dll

UnityEditor.Android

PostProcessAndroidPlayer

PostProcessInternal(BuildTarget, String, String, String, String, String, String, BuildOptions) : Void

在展开过程中,如出现如下弹框

需要加载

C:/Program Files (x86)/Unity/Editor/Data/Managed/UnityEditor.dll

C:/Program Files (x86)/Unity/Editor/Data/Managed/UnityEngine.dll

我们可以借reflexil插件看到PostProcessInternal函数的il代码,我们的目的就是通过写il代码,更改PostProcessInternal函数,在它里边调用我们自定义的程序集中的函数,植入步骤如下:

在reflexil面板中,找到152行,选中,接着右键create new..

对着图输入一些信息

参数类型:ldarg.s  !!!,引用类型

参数来自stagingArea

接着Insert after select

这样我们就加入了一行代码

接着我们继续加下一行代码,选中刚生成的153行代码,右键 create new...

按照图中输入信息

这里需要选择我们自定义程序集中的函数,必须要在.net reflector中加载了我们的MyEncryptionDll.dll才能显示出来!!!

这样我们就添加完IL代码了,完成后的il结构如下

然后我们把更改后的UnityEditor.Android.Extensions.dll输出并替换原来的

这样,我们就算完事了,接下来就是按照正常流程在unity3d中选择android player,build就好了。

这样导出的apk中就已经是加密过Assembly-CSharp.dll的了,并且libmono.so也是带有解密功能的了!!!当然运行也就没问题咯。

时间: 2024-10-23 18:28:42

一次U3D DLL加密的记录(二)的相关文章

一次U3D DLL加密的记录(一)

这篇文章主要针对windows下对u3d游戏的加密过程 主要步骤: ①:编译和替换加密后的libmono.so ②:导出安卓工程 ③:加密和替换Assembly-CSharp.dll ④:用eclipse等工具导出apk 首先参考一下我的<一次编译libmono.so的记录> 接着把项目导出成安卓工程,在xxx/assets/bin/Data/Managed下找到Assembly-CSharp.dll,然后写个文件读写程序进行破坏c#程序集结构,从而达到该程序集解不开的目的 示例程序代码如下:

Unity3D DLL加密

Unity3D打包android应用程序时,如果不对DLL加密,很容易被反编译,导致代码的泄露.通常的做法是通过加密DLL或者对代码进行混淆.本文的所要探讨的是通过加密的方式来对DLL进行保护,并详细记录加密的操作过程. 主要参考 雨松的博文:http://www.xuanyusong.com/archives/3553 http://csftech.logdown.com/posts/452269-android-unity-encryption 这两篇文章已经详细介绍了加密的过程,但是还是有

Linux安全与加密基础(二)

Linux安全与加密基础(二) 常见的加密算法 SSL: Openssl与CA认证 ssh服务 dropbear AIDE sudo gpg gpg亦可用于对称加密与文件检验. 文件完整性的两种实施方式 被安装的文件     MD5单向散列     rpm --verify package_name (or -V) 发行的软件包文件     GPG公钥签名     rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*     rpm --checks

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Spring Boot学习记录(二)--thymeleaf模板

Spring Boot学习记录(二)–thymeleaf模板 标签(空格分隔): spring-boot 自从来公司后都没用过jsp当界面渲染了,因为前后端分离不是很好,反而模板引擎用的比较多,thymeleaf最大的优势后缀为html,就是只需要浏览器就可以展现页面了,还有就是thymeleaf可以很好的和spring集成.下面开始学习. 1.引入依赖 maven中直接引入 <dependency> <groupId>org.springframework.boot</gr

前端常用功能记录(二)—datatables表格(转)

前端常用功能记录(二)—datatables表格 并不是所有的后台开发都有美工和前端工程师来配合做页面,为了显示数据并有一定的美感,jQuery的DataTables插件对于像我这样的前端菜鸟来说真是雪中送炭,当然对于专业的前端开发者来说它更是锦上添花!DataTables提供了针对表格的排序.浏览器分页.服务器分页.筛选.格式化.统计等强大功能. 工作中对程序员的学习模式才深有体会,不是从入门到精通,而是从会用到了解.对于我来说,基本都是拿到一个知识先做个东西出来,再来细细品味个中的细节,然后

Java加密技术(二)——对称加密算法DES&AES

接下来我们介绍对称加密算法,最常用的莫过于DES数据加密算法. DES DES-Data Encryption Standard,即数据加密算法.是IBM公司于1975年研究成功并公开发表的.DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密. DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位. 通过java

u3d honey hex framework 代码解读记录(二)

// file: WorldOven.cs /// <summary> /// If baking were requested this function will handle starting all required processes and default settings required for initial pass /// </summary> /// <returns></returns> void Update() { // 如果有

netty 学习记录二

netty 最新版本是netty-5.0.0.Alpha1,去年10月份发布的,至今没有发新版本,估计这个版本还是比较稳定. 整包下载,里面包含一个 netty-example-5.0.0.Alpha1-sources.jar文件,提供了比较丰富的example例子,多看几遍还是非常有收获的,这里记录下. 先来看下channelHandler的两个不同继承: 方式一:直接从ChannelHandlerAdapter类里继承,读取操作从channelRead方法里执行 @Sharable publ