Unity3D初学加密技巧(反破解)
Posted 两水先木示
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D初学加密技巧(反破解)相关的知识,希望对你有一定的参考价值。
参考文章:
Unity3D研究院之Android加密DLL与破解DLL .SO(八十一) | 雨松MOMO程序研究院
Unity3D研究院之Android二次加密.so二次加密DLL(八十二) | 雨松MOMO程序研究院
Unity 2019.4.0 Mono 编译以及加密 windows版_雾凇|Songs的博客-CSDN博客
Windows 下使用 mingw+msys 交叉编译 Android Unity Mono_weixin_30449453的博客-CSDN博客 Unity3D安卓导出包加密学习--加密libmono.so_GrimRaider的博客-CSDN博客
官方文章:
Compiling Mono on Windows | Mono
目录
一、C#代码加密解密
1.1 Window工程
① Cygwin 安装Cygwin
2022年8月1日更新:安装Mono环境
② git clone unity-mono源码工程(网上说是需选对应Unity版本,未测试)
GitHub - Unity-Technologies/mono: Mono open source ECMA CLI, C# and .NET mplementation.
③ 使用Visual Studio 2019打开mono目录下的\\msvc\\mono.sln生成解密文件
2. Android工程(2022年9月9日更新已完成)
二、热更代码&资源加密
三、混淆代码
一、C#代码加密解密
1.1 Window工程
Window工程:打出exe包后得到如下截图结构文件
前提概要:
需要加密的文件:
xxx_Data\\Managed\\Assembly-CSharp.dll(核心dll)
有加密就会有解密,解密过程放到读取解析dll时,文件: MonoBleedingEdge\\EmbedRuntime\\mono-2.0-bdwgc.dll
开始进入window加密制作流程:主要参考Unity 2019.4.0 Mono 编译以及加密 windows版_雾凇|Songs的博客-CSDN博客
下载setup-x86_64.exe安装软件,打开cmd,先cd到setup-x86_64.exe所在目录执行。
setup-x86_64.exe -P autoconf,automake,bison,gcc-core,gcc-g++,mingw64-i686-runtime,mingw64-i686-binutils,mingw64-i686-gcc-core,mingw64-i686-gcc-g++,mingw64-i686-pthreads,mingw64-i686-w32api,mingw64-x86_64-runtime,mingw64-x86_64-binutils,mingw64-x86_64-gcc-core,mingw64-x86_64-gcc-g++,mingw64-x86_64-pthreads,mingw64-x86_64-w32api,libtool,make,python,gettext-devel,gettext,intltool,libiconv,pkg-config,git,curl,wget,libxslt,bc,patch,cmake,perl,yasm,unzip
这个过程大概是10分钟左右,因为它要下载一堆所需的文件,耐心等待。途中会让你选择2个导出目录,默认C盘,可选其他盘符,安装完毕后,在第一个你选择的导出目录下会有Cygwin.bat(桌面上也会出现Cygwin64 Terminal应用图标)执行它会打开一个命令行窗口,代表正常完成。
2022年8月1日更新:安装Mono环境
https://www.mono-project.com/docs/getting-started/install/windows/
安装完毕后按wins键(左下角开始)输入mono搜出
输入mono --version执行成功,注意这个C:\\Program Files\\Mono并不是一个文件,而是Mono环境命令行窗体。
② git clone unity-mono源码工程(网上说是需选对应Unity版本,未测试)
如果你是2019.4+的版本,那就选择上面的2019.4-branch-updates分支克隆,git命令如下:
git clone --recursive -b 2019.4-branch-updates https://github.com/Unity-Technologies/mono.git
国内需要镜像clone才会比较快,所以镜像使用相关文章:
git clone 换源 / GitHub 国内镜像_面里多加汤的博客-CSDN博客_github国内镜像源
本人使用https://gitclone.com git命令更改为:
git clone --recursive -b 2019.4-branch-updates https://gitclone.com/Unity-Technologies/mono.git
克隆完成后,打开①安装的Cygwin命令窗体程序,cd到②克隆到本地的mono工程目录下,执行
cd d:/xxx/mono/
区分64和32位window系统执行命令:
64位
./autogen.sh --prefix=$PREFIX --host=x86_64-w64-mingw32 --enable-msvc --disable-boehm
32位
./autogen.sh --prefix=$PREFIX --host=i686-w64-mingw32 --enable-msvc --disable-boehm
等待编译完成,它会将mono工程进行编译并输出到Cygwin.bat文件所在目录下的\\home\\计算机名\\mono文件夹下【Cygwin.bat是Cygwin命令窗体程序执行bat文件】
Cygwin目录:Cygwin.bat所在目录
mono目录:Cygwin目录\\home\\计算机名\\mono\\
③ 使用Visual Studio 2019打开mono目录下的\\msvc\\mono.sln生成解密文件
实在找不到就搜索文件mono.sln
生成过程中或许有些报红,但感觉没影响完成后去拿到我们需要的文件:
如果失败了会看不到下面的文件,只有mono-2.0-dac-bdwgc.dll,我们要是的mono-2.0-bdwgc.dll
mono目录下\\msvc\\build\\bdwgc\\x64\\bin\\Release\\mono-2.0-bdwgc.dll
将它替换掉MonoBleedingEdge\\EmbedRuntime\\mono-2.0-bdwgc.dll
加密dll代码:
string path = @"E:\\xxx_Data\\Managed\\Assembly-CSharp.dll";
byte[] bytes = File.ReadAllBytes(path);
bytes[0] += 1;
//如果你想验证一下是否加密成功,可使用dnSpy神器
//string outPath = @"E:\\xxx_Data\\Managed\\Assembly-CSharp_dec.dll";
string outPath = path;
File.WriteAllBytes(outPath, bytes);
加密后的dll只是暂时无法被破解,因为解密方法就在mono-2.0-bdwgc.dll,别人只要破解这个dll就知道解密方法,然后解密你已经加密的dll。
Unity3D研究院之Android二次加密.so二次加密DLL(八十二) | 雨松MOMO程序研究院
雨松篇均是安卓dll加密和解密,安卓解密文件是libmono.so,ios尚未接触。
2. android工程(2022年9月9日更新已完成)
【Unity】安卓加密编译libmono.so成功&失败记录(unity2017已成功编译)_两水先木示的博客-CSDN博客
① 、② 与Window工程相同
③ 使用Cygwin命令窗体程序执行
cd d:/xxx/mono/
./external/buildscripts/build_runtime_android.sh
完成后搜出libmono.so,将它放入.apk文件里的\\lib\\armeabi-v7a\\下(如果lib还有其他的armxxx目录也要对应放入arnxxx\\libmono.so文件,libmono.so也是会有对应lib一样的armxxx目录的,不要选错文件放入。
我测试现状安卓工程还未尝试过编译通过,window工程使用下方文章提供的mono工程测试可行,但安卓测试去编译build_runtime_android.sh失败Unity 代码加密 Mono 编译与加密 windows版_雾凇|Songs的博客-CSDN博客_unity代码加密
失败记录:
最关键的一点是git clone下的mono工程是必须完整的,不要去zip下载git工程,我就是嫌git clone命令行下载太慢,直接翻墙下载zip,结果搞了很久还是各种报错缺失文件,检查发现直接去下载zip,文件缺失了很多,比如:mono-unity-2021.2-mbe-pre-upgrade\\external\\bdwgc文件夹是空的!后续更新能够正常编译的情况。
编译Unity使用的libmono.so - K1_大大 - 博客园
最大问题在于所有文章都没有介绍2017之后的libmono.so的制作,基本上都有build_runtime_android.sh和 build_runtime_android_x86.sh 而且里面的内容还挺多,改的东西也很多,反正这x86.sh 只在2017之前的版本看到过,而且内容也相对一致,由于github克隆一致存在网络问题,而且没有找到相关的库提供,暂时性放弃,基本上可以看上面的K1_大大文章实现编译libmono.so解密文件。哎,github的链接引用库真的是醉了,还有国内的墙,不稳定的镜像,这一切都阻止着我继续下去,但不用担心,Unity自从出了IL2CPP,C#层加密应该是稳妥的。
二、热更代码&资源加密
没啥好说的,就是简单的二进制文件加密,基本上都是assetbundle包加密吧,加密后解密正常加载ab包即可,哎,反正就是做个样子,毕竟解密都在客户端。
三、混淆代码
暂未研究
linux初学者-磁盘加密篇
因为保密需要,一般系统中会在文件和磁盘中进行加密,但是文件的加密比较容易破解,不安全。所以在特殊需要下,会对磁盘进行加密,磁盘加密后在磁盘损坏的同时,其中的数据也会损坏,接下来将会介绍磁盘加密的一些内容。
新建立一个磁盘分区,输入"cryptsetup luksFormat /dev/vdb1"对磁盘分区/dev/vdb1进行加密,输入大写的"YES"后,输入两次密码,即可完成磁盘加密。
完成加密后如何挂载呢?如下图所示,如果将vdb1分区直接挂载,将无法挂载。输入"cryptsetup open /dev/vdb1 we"是将加密的磁盘分区vdb1打开为we,名字可以自行设置,出现"/dev/mapper/we"分区,然后格式化这个分区,就可以进行挂载了。
例如下图,挂载在/mnt后,在其中建立10个文件file{1..10},取消挂载后在/mnt下看不到这10个文件,输入命令"cryptsetup close we"后,可以关闭vdb1分区,这时候we分区不存在了,也就无法再进行挂载了。
将vdb1分区重新打开成其他名称的分区,如下图所示,挂载后会出现上述的10个文件。
如果需要开机时自动挂载,需要先在"/root"目录下建立一个记录密码的文件,例如建立"/root/lukswe",文件名称可自行设定,在其中输入加密分区vdb1的密码,为了安全,建议给其设置"600"权限。然后输入命令"cryptsetup luksAddKey /dev/vdb1 /root/lukswe"将密码存放文件与加密磁盘关联。在"/etc/crypttab"文件中写入解密配置文件,例如写入"we /dev/vdb1 /root/lukswe",we表示vdb1磁盘打开后的名称。最后需要在"/etc/fstab"写入开机自动挂载配置,写入"/dev/mapper/we /mnt xfs defaults 0 0",完成后重启即可检测是否自动挂载。
需要取消磁盘加密时,需要格式化这个磁盘,如果在之前设置过开机自动挂载,则需要先删除密码记录文件,再删除"/etc/crypttab"和"/etc/fstab"中的配置,取消挂载后,关闭加密磁盘,最后再格式化就可以删除这个加密磁盘了。
以上是关于Unity3D初学加密技巧(反破解)的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D代码加密防止反编译及资源加密
Unity3D加密外壳如何做到防止反编译?
手游方舟怎么预防外挂
Unity3D 加密 Assembly-CSharp.dll (Android平台) 防止反编译
如何防止Unity3D代码被反编译
unity3d反编译能提取场景资源吗