上一篇文章一次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 }

View Code

接下来就是编译我们的程序集了,编译选项改成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也是带有解密功能的了!!!当然运行也就没问题咯。

转载于:https://www.cnblogs.com/xijianchui/p/5244146.html

一次U3D DLL加密的记录(二)相关推荐

  1. Unity - 游戏加密方案-DLL加密方法记录

    Unity - 游戏加密方案-DLL加密方法记录 DLL加密 Unity中的自定义脚本都会打包到Assembly-CSharp.dll这个DLL中,所以目前常见的游戏加密方案就是,用对称加密算法加密A ...

  2. Unity3D DLL加密

    网上搜了很多教程 就这篇成功了 转载一下 原文 http://blog.51cto.com/snailwalk/1745970 Unity3D打包android应用程序时,如果不对DLL加密,很容易被 ...

  3. Mac 下编译 libmono.so 和 DLL 加密详解

    Unity 打出的安卓包为了防止反编译,需要对 Assembly-CSharp.dll 加密处理.Assembly-CSharp.dll 是由 libmono.so 运行时读取然后在 mono 虚拟机 ...

  4. unity打包实现对dll加密

    Unity 打包后防破解 DLL加密 前言:之前有个活,需要将公司的unity程序进行加密.本来想使用混淆插件进行简单的混淆,后来发现有问题所以选择dll加密.期间碰到很多坑,记录一下. 1.加密方案 ...

  5. 金蝶K3加密许可记录清除策略浅析

    1.1 应用场景及需求 加密许可记录是监控所有客户端的系统登录情况及加密站点许可的使用情况的信息表,可以统计客户端登录的应用系统即使用的模块,帐套名称.使用方式.登录用户名.工作站名称和登录时间的相关 ...

  6. VS调试dll详细过程记录

    VS调试dll详细过程记录 还可以参考博客: https://blog.csdn.net/u014738665/article/details/79779632 在我们写的程序中有时候调用dll,并且 ...

  7. MySQL学习记录 (二) ----- SQL数据查询语句(DQL)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  8. 文华财经指标公式大全,通达信指标加密破解DLL加密防破解技术方法

    STICKLINE(做多 AND C<O,C,O,0.3,0),COLORFF00FF;  STICKLINE(做多 AND C>=O,C,O,3,1),COLOR0000FF;  {ST ...

  9. Android动画学习记录二(属性动画、估值器和插值器)

    Android动画学习记录二(属性动画.估值期和插值器) Android动画学习记录二(属性动画.估值期和插值器) Android动画学习记录二(属性动画.估值期和插值器) 一.补间动画缺陷 二.属性 ...

最新文章

  1. redis面试知识点和内存算法了解
  2. 华科与浙大计算机学院,计算机最强14所高校排名,清华第2,浙大第4,南大第6,华科第10...
  3. keras从入门到放弃(十九)RNN和LSTM
  4. bzoj1059: [ZJOI2007]矩阵游戏
  5. 【ACL2020】Relabel the Noise: Joint Extraction of Entities and Relations via Cooperative Multiagents
  6. runas/cpau/lsrunase使用小结(以管理员运行指定程序)
  7. 如何避免核心代码资源泄漏和如何提高开发效率
  8. RankLib参数翻译
  9. 对话“第二人生”创始人:这不是一款游戏
  10. 城阳区人才共有产权住房细则
  11. 第三篇--编译CM系统
  12. 如何在Photoshop里抠头发丝
  13. FamilyParty生态起航,链游版皇室战争Infinite Force打响头炮
  14. 《异常检测——从经典算法到深度学习》5 Opprentice——异常检测经典算法最终篇
  15. 常见的设计模式有哪些?实际开发中你用了什么设计模式?
  16. 2020年阴历二月十六 读书笔记之漫步华尔街行为金融学
  17. 身为程序员,我敢和你打赌100块,这个数学符号你根本不会认不会写
  18. 【翻译】对于Ext JS 5,你准备好了吗?
  19. 散射介质成像中弹道光子、蛇形光子、散射光子的概念
  20. nodejs时间函数

热门文章

  1. 没有找到**.dll的解决方案
  2. ASP.NET 2.0中母版页中引用文件路径的问题(收集)
  3. 多目标跟踪新范式:CenterTrack
  4. 官方中文版开源!快速入门PyTorch
  5. 2018年度计算机视觉GtiHub top开源项目!
  6. 听说你还不懂哈夫曼树和哈夫曼编码
  7. 机器学习之特征工程-特征选择
  8. 算法移植优化(四)c++11 多线程
  9. python 单一继承定义_Python学习之单继承与多继承
  10. java类型之间的转换_JAVA基本数据类型及之间的转换