我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Unity3D DLL加密

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Unity3D DLL加密

Unity3D打包android应用程序时,如果不对DLL加密,很容易被反编译,导致代码的泄露。通常的做法是通过加密DLL或者对代码进行混淆。本文的所要探讨的是通过加密的方式来对DLL进行保护,并详细记录加密的操作过程。


主要参考

    雨松的博文:http://www.xuanyusong.com/archives/3553 

    http://csftech.logdown.com/posts/452269-android-unity-encryption

    这两篇文章已经详细介绍了加密的过程,但是还是有些坑和有些操作没有给出。


原理说明

所有的代码编译后是在apk\assets\bin\Data\Managed\Assembly-CSharp.dll下,要做的就是对这个DLL进行加密,Assembly-CSharp.dll由libmono.so加载,所以需要在libmono.so中对加密过的Assembly-CSharp.dll进行解密,幸好unity提供了mono的代码可以进行编译修改。当然对于libmono.so也存在被反编译的风险,本文暂不考虑。


准备

  • linux系统。本文选择采用的是Ubuntu14.04,虚拟机也可以,另外可以用Windows + Cygwin进行编译,不过考虑到这样做可能踩坑更多,果断放弃。

  • unity mono源码,可以在https://github.com/Unity-Technologies/mono下载,branch选择unity4.6,直接下zip包,或者git下来都可以,下载下来的zip包为mono-unity-4.6.zip。

  • unity3d 4.6版本,本文试验的是4.6的编译,注意一定要安装4.6.6+的版本,否则重编的libmono.so会报错(坑一)。

  • android ndk, 版本可以根据unity-mono中用的版本来下载,参见unity-mono/external/buildscripts/build_runtime_android.sh, 搜一下ndk=就能找到,本文用到的是r10e,下载下来的ndk为android-ndk-r10e-linux-x86_64.bin。

  • apktools, 用来对apk进行解包签名打包,2.0以上版本,否则打包是会报错。


编译mono

1)为了方便使用root进行编译,Ubuntu下root默认不开启,可以使用:

    sudo passwd root

    输两次密码后

    su - 

    进行登录


2)NDK安装

    安装7z 

       apt-get install p7zip-full

    解压

       7z x android-ndk-r10e-linux-x86.bin

    配置环境变量,配置方法有很多,可以修改/etc/profile或者~/.bashrc,这里直接shell下添加临时的环境变量,不添加后面编mono时会报找不到NDK

       export ANDROID_NDK_ROOT=/home/xubo/unity-dev/android-ndk-r10e

       export PATH=$ANDROID_NDK_ROOT:$PATH


3)检查一下mono使用的NDK版本

vi打开mono-unity-4.6/external/buildscripts/build_runtime_android.sh可以找到

perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r10e -env=envsetup.sh && source envsetup.sh

这里可以确定当前的unity mono使用r10e来进行编译的


4)安装编译必备的一些包

apt-get install autoconf automake bison build-essential gettext git libglib2.0 libtool perl


5)尝试第一次编译

    ./external/buildscripts/build_runtime_android.sh

    报错:

        /usr/bin/env: perl -w: No such file or directory

    这里unity-mono编译的时候会去git 一个包android_krait_signal_handler,在external目录下,就是这个包报错,这个包出错的问题很多,是个巨坑(坑二)。


    打开android_krait_signal_handler/build.pl,将第一行

        #!/usr/bin/env perl -w

    改为

        #!/usr/bin/perl -w


    将下面行

        PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r9");

    改为实际用到的NDK

        PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r10e");


    将buildscripts/PrepareAndroidSDK.pm替        换android_krait_signal_handler/PrepareAndroidSDK.pm


    打开jni/Application.mk将下两行都删掉   

APP_PLATFORM := android-9
NDK_TOOLCHAIN_VERSION := clang3.3

    否则会报下面的错误

make: execvp: /home/xubo/unity-dev/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8: Permission denied


6)尝试第二次编译

    configure不通过,打开config.log发现

./configure: line 4546: /home/xubo/unity-dev/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc: No such file or directory

    检查该目录,发现文件是存在的,这里是因为虽然NDK是64位的,但是交叉编译工具链是32位的,安装一下,而本文采用的编译机是64位的,安装一下64位下运行32位可执行文件的包

    apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0


7)尝试第三次编译,至此我们应该可以编译成功了,但还没涉及到加解密,注意编译需要在mono的根目录下进行。最终显示如下则OK:

Build SUCCESS!
Android STATIC/SHARED libraries are found here: builds/embedruntimes/android


加密程序

加密过程可参考上面的链接,就是将Assembly-CSharp.dll视作普通的文件,随便用什么语言写个加密的代码,简单的可以修改几个字节,做偏移啥的,生成一个新的Assembly-CSharp.dll,替换原来的,这样一般的破解软件就没辙了。


MONO解密

上面只是试验了一下mono的编译,关于将解密的代码添加至mono还没有做。


打开mono-unity-5.3/mono/metadata/p_w_picpath.c,找到mono_p_w_picpath_open_from_data_with_name函数修改如下

MonoImage *
mono_p_w_picpath_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name)
{
        MonoCLIImageInfo *iinfo;
        MonoImage *p_w_picpath;
        char *datac;
        
        //添加如下代码
        if(name != NULL)
        {
            if(strstr(name,"Assembly-CSharp.dll")){
                //这里写下你的解密的代码,入参data是从Assembly-CSharp.dll读文件读出来的
                //被加密的原始数据,通过你的解密代码生成一段新的data
            }
        }
        
        if (!data || !data_len) {
                if (status)
                        *status = MONO_IMAGE_IMAGE_INVALID;
                return NULL;
        }
        datac = data;
        if (need_copy) {
                datac = g_try_malloc (data_len);
                if (!datac) {
                        if (status)
                                *status = MONO_IMAGE_ERROR_ERRNO;
                        return NULL;
                }
                memcpy (datac, data, data_len);
        }


MONO正式编译

正式编译mono前,还有两个地方要修改,不修改编译出来的是debug版本,libmono.so有8M,

打开build_runtime_android.sh, 将下面标红的-g给去掉,编译release版本

CFLAGS="\
-DANDROID -DPLATFORM_ANDROID -DLINUX -D__linux__ \
-DHAVE_USR_INCLUDE_MALLOC_H -DPAGE_SIZE=0x1000 \
-D_POSIX_PATH_MAX=256 -DS_IWRITE=S_IWUSR \
-DHAVE_PTHREAD_MUTEX_TIMEDLOCK \
-fpic -g -funwind-tables \

同样build_runtime_android_x86.sh里面也去掉


Unity3D 签名

别忘记了,需要unity4.6.6+的版本,本文是在unity4.6.9下测试OK。

制作一个签名,后面在用apktool重新封包时用得到,用这个签名对游戏进行build。

wKiom1bT_7CxRO8WAAD5dUcSwDo177.jpg


Apktool解包封包

1)(windows下操作)确定apktool目录下有aapt.exe,apktool.bat,apktool.jar,确定版本是2.0+

2)将生成的包例如1.apk 复制到apktool/下

3)cmd命令行下,进入apktool目录,执行apktool d 1.apk进行解包,会在apktool下生成与包名相同的文件夹1/

4) 将加密过的Assembly-CSharp.dll覆盖1\assets\bin\Data\Managed\Assembly-CSharp.dll

5) 将编译过的libmono.so,注意这里选择armv7a/,和x86/下的,分别覆盖1\lib\armeabi-v7a和1\lib\x86\下的libmono.so

6) 封包命令行下执行apktool b -f 1,会在1/下生成dist文件,里头就是新封的包,改名为2.apk,并复制到apktool/下

7)签名,隐去的是你要填的签名文件名,和别名

    jarsigner -verbose -keystore ****.keystore -signedjar 2_s.apk 2.apk ****

8)2_s.apk就是你加密过的包,进行安装测试


libmono.so加密

雨松还提到了libmono.so的加密,这里先不涉及吧,strip动态库,可能能起到相同的效果。


小结

这样加密经过测试是OK的,可以防止一般的反编译软件进行破解了,对于高手可能还防不住,另外编译mono有点心惊胆战,android_krait_signal_handler这个工程是个坑,还是有点担心编出来的libmono.so有咩有啥隐患,所以这样弄需要在各种android机子上多测试。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Unity3D DLL加密

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Unity3D DLL加密

Unity3D打包android应用程序时,如果不对DLL加密,很容易被反编译,导致代码的泄露。通常的做法是通过加密DLL或者对代码进行混淆。本文的所要探讨的是通过加密的方式来对DLL进行保护,并详细记录加密的操作过程。主要参考    雨松
2023-01-31

unity3d 资源打包加密

资源打包脚本,放到Assets\Editor 文件夹下using UnityEngine;using System.Collections;using UnityEditor;using System.IO;public class ass
2023-01-31

Unity3D 代码加密保护工具

加密方式对于Unity3D的保护方式,主要是通过Virbox Protector Standalone对Unity3D程序的整个生成目录进行加密,可以保护Unity的主要代码逻辑不被反编译,最大程度保护软件开发商的合法权益,同时DSProt
2023-01-31

Unity3D加密保护解决方案

精锐5加密锁支持Unity3D代码及资源保护,并提供授权方案产品简介可使用Virbox Protector加壳工具对Unity3D代码进行加密。Unity3D使用开源mono C#语法,代码会编译到Assembly-CSharp.dll。可
2023-01-31

【Unity3D】存档文件加密代码

存档文件, 被修改起来现在变的很容易了, 为了解决这个问题,请用下面的代码,修改playerPrefs.cs1.替换fileReader = new StreamReader(fileName);serializedInput =Decry
2023-01-31

C#dll代码混淆加密的实现

本文主要介绍了C#dll代码混淆加密的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-06

Unity3d Android无法加载a

前几天做了AssentBundle的例子,遇到了问题,在论坛上问了三天都没人解答,最后在一个朋友的帮助下解决了。下面介绍AssentBundle。AssetBundles让你通过WWW类流式加载额外的资源并在运行时实例化它们。AssetBu
2023-01-31

c#怎么添加dll

c# 中添加 dll 的方法有:使用项目引用:在解决方案资源管理器中,右键单击项目并选择“添加”>“引用”,然后导航到 dll 文件并单击“添加”按钮。使用 dllimport:导入 system.runtime.interopservic
c#怎么添加dll
2024-05-14

反射加载 CGO 生成的 DLL

问题内容只是想尝试反射 dll 加载,所以我写了一个简单的消息框:package mainimport "c"import ("unsafe""syscall")//export onprocessattachfunc onpr
反射加载 CGO 生成的 DLL
2024-02-08

win10加载dll失败如何解决

加载DLL失败可能是由于以下几个原因引起的:1. DLL文件路径错误:请确保DLL文件存在于正确的路径中,并且路径中没有包含特殊字符或空格。2. DLL文件缺失或损坏:请检查DLL文件是否存在,并且没有被其他程序占用或损坏。如果DLL文件确
2023-09-02

loadlibrary加载dll失败如何解决

loadlibrary加载dll失败可能有多种原因,下面是一些常见的解决方法:1. 确认dll文件存在:首先要确保要加载的dll文件存在于指定的目录下,并且文件名和路径是正确的。2. 检查依赖项:有些dll文件可能依赖于其他的dll文件,如
2023-09-18

win10加载dll失败如何处理

加载 DLL 失败可能有多种原因,下面是一些常见的处理方法:确保 DLL 文件存在:检查 DLL 文件是否在正确的路径下,并确保文件名拼写无误。检查依赖关系:某些 DLL 文件需要依赖其他 DLL 文件才能正常加载,检查是否缺少了依赖的 D
2023-10-22

Android数据加密之Aes加密

前言:项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密。 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 Android数据加密之Des
2022-06-06

Android数据加密之Des加密

前言: 有个同事咨询我有关Android DES加密的相关实现,简单的实现了一下,今天来总结一下。 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 Android数据加密之Des加密 An
2022-06-06

Android数据加密之Rsa加密

前言:最近无意中和同事交流数据安全传输的问题,想起自己曾经使用过的Rsa非对称加密算法,闲下来总结一下。 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 Android数据加密之Des加密
2022-06-06

3DES_ECB_加密解密

import java.util.ArrayList;import java.util.List;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.c
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录