随着Visual Studio 2019正式版的发布,加上Unity2018.3.x版本的更新迭代,我又有了尝新的欲望了,哈哈哈!

借着这个契机,我有了重新整理框架的想法了,就是把框架编译成动态链接库dll,并且我把电脑系统还原了,所有的环境都将是最新的。

安装所有最新的环境

  • Visual Studio 2019正式版
  • Unity2018.3.10(现在不是最新的了)
  • JDK1.8.0
  • android-sdk-windows

创建我的框架类库

首先到官网下载最新版本的Visual Studio 2019,专业版和企业版的密钥网上自己搜。

安装完成后,我选择类库模板创建我们的框架类库。

然后引入UnityEngine.dll,UnityEngine.UI.dll,最后我把框架的代码都移植过来了。

然后在类库的属性里选择目标框架为 .NET Framework 4.6,之前大家都是用3.5是因为Unity只支持3.5,现在Unity 2018.3的脚本运行时版本默认是4.x了。

值得注意的是,在Unity2018.3.x打开C#脚本时,Visual Studio会弹出下面提示框,提示我们去下载.NET Framework 4.7.1版本的框架,我们选择第二个下载.NET Framework 4.7.1。

选择.NET Framework 4.7.1的开发包下载。

然后我遇到一个问题就是安装完之后再打开脚本还是提示我没有安装.NET Framework 4.7.1的框架,我搞了半天才知道怎么回事。原来这里下载的框架是电脑系统的.NET框架,然后Visual Studio也要有.NET Framework 4.7.1这个框架才可以,这是两个不同的环境,不要搞混了!

接着我们在开始菜单中找到Visual Studio Installer,打开后点击修改按钮,进入到安装目录,切换到单个组件,勾上.NET Framework 4.7.1 SDK和.NET Framework 4.7.1 目标包,最后安装即可。所以我怀疑,Unity 2018.3.x是不是支持.NET Framework 4.7.1框架的动态链接库?我没试,你们可以试试看告诉我。

这个步骤完成之后我们就可以编译了,然后把生成的dll复制Unity工程的Plugins文件夹里面。

接着我尝试发布Unity安卓包,Scripting Runtime Version默认是.NET 4.x Equivalent,Api Compatibility Level设置为.NET 4.x。

打包的时候出现了这个错误,原因是我在框架里面使用了UnityEditor.AssetDatabase.LoadAssetAtPath()函数,引入了UnityEditor.dll,注意!框架的dll不能引入UnityEditor.dll!后来我通过外部注入管理器的方式重写虚方法解决了这个问题,千万不要用宏来做,在Visual Studio里面定义的宏并不能像Unity那样动态识别,在编译成dll之前就已经是固定死了。

最后成功发布到安卓包了,至于怎么写动态链接库和调用其实很简单,这里就不扯了。

动态链接库反编译

打开Visual Studio的管理拓展,在联机搜索ILSpy反编译工具并且安装,ILSpy是开源免费,至于.Net Reflector是收费,自己选择。

安装完后,选择工具栏的ILSpy。

然后打开框架的dll,可以直接反编译看到代码。

动态链接库的混淆

本来想用加密的方式来处理,但是需要在mono上做解密,有点麻烦,并且现在大多数都是用IL2CPP的方式打包了,所以我就直接用混淆的方式来处理dll好了。

打开Visual Studio Installer,在工作负载上点击.NET桌面开发,勾上PreEmptive Protection - Dotfuscator之后安装。

安装完成后打开工具栏的PreEmptive Protection - Dotfuscator。

点击输入的加号按钮,添加我们的dll。

然后点击重命名的排除,再点击添加类型,在名称上填写“+public”,表示所有public的变量和函数都不进行混淆,这样我们才可以通过外部去调用,注意,如果dll里的代码有用到Awake,Start,Update,OnDestory等Unity自带的函数,都必须改成public,否则这些函数将被混淆,导致不能自动调用。

最后点击生成按钮,就会自动进行代码混淆。我们再打开ILSpy反编译工具查看刚才混淆过的dll,发现那些私有变量和函数的名字都重命名了,变得难以阅读。如果你想让你的dll变得更加难以反编译,可以购买pro版本,可以对dll的字符串加密,使其无法看到函数内部正确的逻辑,还可以进行控制流模糊处理,阻止反编译和增加反编译的复杂度。

我们把自己的框架编译成混淆的dll,这样就不用担心自己的代码裸奔了,至少可以防止小白反编译,平时开发的时候用mono,编译速度快,发布正式版本的时候再用IL2CPP,代码执行效率高,还不容易反编译。最后,我们还可以再用360的加固软件加壳一下,但是对于逆向工程的大神来说,这都是小意思,各种反编译和脱壳防不胜防。

Unity3D游戏框架之dll反编译和混淆相关推荐

  1. 第19天:WEB攻防-.NET项目DLL反编译

    使用IDEA载入目录 打开.aspx后进项代码分析 <%@ Page Language="C#" AutoEventWireup="true" CodeB ...

  2. .net dll反编译源码后,使用vs的正则替换get_和set_

    get_([a-zA-Z0-9]+)\((.+)*?\) 替换为 $1 = $2; 以上()中的表示要保留的元素,按顺序分别对应于替换后的$1 $2 *?表示非贪婪匹配防止匹配失败 用于最新版vsco ...

  3. .net dll 反编译修改IL再编译,修改版本号

    记一次.net dll 反编译修改IL再编译exe 可用Everything搜索ildasm.exe 在用ildasm.exe打开dll或exe 点击文件右键转储 转储之后用visua studio ...

  4. Android安全攻防战,反编译与混淆技术完全解析

    之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值得骄傲的事情.不过单纯从技术角度上来讲,掌握反编译功能确实是一项非常有用的技能,可能平常不太会用得到,但是一旦真的需要用到的了,而你 ...

  5. Android逆向学习(二):游戏开发物语反编译

    开罗游戏一直是像素风游戏里的精品,之前就有段时间比较喜欢玩它的游戏开发物语,游戏很好玩,就是有点费肝,鉴于用SL大法刷四维太肝,便考虑改一下 "玩游戏机" 培养方式的概率. 首先将 ...

  6. .dll反编译工具Reflector的使用

    这个软件经常更新,可以在本词条提供的扩展阅读提供的链接中下载最新的版本. 默认情况下,Reflector会打开一组公共程序集(mscorlib.System.System.Data.System.Dr ...

  7. Powerbuilder混淆与加密器(powerbuilder防止反编译,pb混淆器,支持5-12) obfuscator for PowerBuilder...

    正式版购买请参考:http://www.mis2erp.com http://www.pb-obfuscator.com http://www.pbd-obfuscator.com 下载地址:http ...

  8. 社区周末版--Unity3D 游戏框架LollipopUnity v1.0.1

    开源地址:https://github.com/Golangltd/LollipopUnity 文档地址:GameAIs.Com 设计 如下: 与后端LollipopGo v3.0.1  完美结合 帧 ...

  9. linux反编译unity手游,Unity3D安卓手游逆向

    本文就是记录自己的一次瞎胡闹!! 随便在网上找了一款使用Unity3D 开发的Android 手游,其运行效果是这样的 Unity3D逆向工具 使用ApkDb 反编译apk 文件(在apk 上右键–& ...

  10. 如何保护.net中的dll文件(防破解、反编译)

    .net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间语言,再由.net编译器 JIT 解释映象为本机代码并交付CPU执行.中间语言很容易被反编译,所以研究下如何有效的保护dll文件. ...

最新文章

  1. 太赞!639页《深度学习:Deep Learning》硬核课程PPT下载
  2. boost::geometry::compress_variant用法的测试程序
  3. 详解python的super()的作用和原理
  4. php手机论坛程序,网站开发-php开发手机论坛(8)-编辑帖子
  5. python 线性规划问题_一学高数,线代就头疼?让python帮你解决(内含教程)
  6. 小米10至尊纪念版DXO第一 雷军:这是小米打拼三年第二次登顶
  7. 代码检测利器“利特莫斯”之优化血泪史
  8. fpga驱动步进电机转动指定角度_通过PLC实现步进电机定位控制的方法
  9. Windows小技巧 -- 已连接wifi密码查看
  10. 为什么RGB 与 CMYK的差异,会有所不同?
  11. IEC 62304 - 2006 医疗器械软件 软件生存周期
  12. Libevent之信号事件管理
  13. LeetCode动画 | 218.天际线问题
  14. 100个问题搞懂Java并发
  15. 开源免费录屏和直播软件OBS Studio教程(02)
  16. 使用selenium爬取当当网图书
  17. 数字图像中的高频和低频
  18. 高德地图鼠标经过点标记显示信息窗体
  19. bzoj 4244: 邮戳拉力赛 动态规划
  20. MoreFunTV 猫范对Winows8的支持

热门文章

  1. PX4Flow使用操作
  2. 木疙瘩动画效果视频学习
  3. php 简繁体,php实现简体转繁体
  4. 机器学习(周志华) 第十六章强化学习
  5. 复域,频域,时域之间关系,转换,s平面(转)
  6. 服务器上的 smb 协议,使用smb协议python3访问服务器上的远程文件
  7. 滑动窗口协议(GBN, SR)
  8. 在Abaqus中怎么施加初始应力
  9. svn服务器调整显示图标修改,svn图标不显示可以通过调整Tortoise图标名称的字母顺序来解决...
  10. TDR土壤水分检测传感器方案设计