• 反编译unity3d发布apk

    2017-03-01 16:51:58
    郑重声明:本教程仅用于学习使用,从事任何商业用途非法行为与作者无关,请知晓! 本文目的:通过教会大家如何破解别人游戏的同时,也希望各位开发者能加强自身游戏的防破解能力! 1:到gitHub下载DisUnity...

    郑重声明:本教程仅用于学习使用,从事任何商业用途非法行为与作者无关,请知晓!

    本文目的:通过教会大家如何破解别人游戏的同时,也希望各位开发者能加强自身游戏的防破解能力!

    1:到gitHub下载DisUnity v0.3.3软件,下载地址: https://github.com/ata4/disunity/releases   简单教程:https://github.com/ata4/disunity

    2:下载希望破解的apk 改后缀名为.rar或.zip,然后解压;出来的目录结构如图:

    unity资源在 assets\bin\Data;  其中Managed下放的是dll,游戏源码被编译成Assembly-CSharp.dll,直接引用dll到monodeveloper 就看以考到源代码

    .asset或者XXXX.assets.split4 游戏资源

    3.将解压出的apk目录 直接拷贝到DisUnity v0.3.3 目录下,执行

    解压出  里面包含了 mesh、shader、texture2d等

    4、texture2D下的.ktx 查看;下载PVRTexTool工具,下载地址:http://download.csdn.net/detail/akof1314/7660209

    直接转为png格式的批处理脚本为:
    @echo off
    path %path%;"D:\Imagination\PowerVR\GraphicsSDK\PVRTexTool\CLI\Windows_x86_32"

    for /f "usebackq tokens=*" %%d in (`dir /s /b *.ktx`) do (
        PVRTexToolCLI.exe -f PVRTC1_4 -i "%%d" -d "%%~dpnd.png"
        del "%%~dpnd.pvr"
    )
     
    PVRTexTool也支持翻转参数flip,但是在这里,我测试无效,只能使用另一个工具ImageMagick来进行上下翻转,批处理脚本为:
    @echo off
    path %path%;"D:\Imagination\PowerVR\GraphicsSDK\PVRTexTool\CLI\Windows_x86_32"
    for /f "usebackq tokens=*" %%d in (`dir /s /b *.ktx`) do (
        PVRTexToolCLI.exe -f PVRTC1_4 -i "%%d" -d "%%~dpnd.png"
        del "%%~dpnd.pvr"
        "D:\Program Files\ImageMagick-6.8.5-5\convert.exe" -flip "%%~dpnd.png" "%%~dpnd.png"
    )


    文章转载自:http://www.cnblogs.com/U-tansuo/p/unity3d_apk_decompilation.html
    展开全文
  • U3D 防止破解修改。DLL加密以及mono解密。。PC和Android平台下对Unity3D应用进行加密解密全程操作,详细实录


        引言 :

             为了防止别人通过反编译来破解修改自己的游戏项目。可以通过两种比较成熟的方案来预防。一种是混淆,另一种就是加密(加壳)。由于加壳后的文件反编译比混淆后的难度更大,所以我们这里采取加密的方法对PC平台和安卓平台的应用进行加密。

             那么我们去加密什么呢?    Unity通过Mono来达到跨平台的效果。在Build编译时会将你编写的code转为符合CLI的CIL(Common Intermediate Language,中文:中间语言),并且主要的Code会编译在Assembly-CSharp.dll里面,然后再有mono来加载,解析,执行。Mono加载Assembly-CSharp.dll的时候就是读取文件到内存中,和读取一个游戏资源文件没多大区别。所以我们要做的就是把这个Assembly-CSharp.dll文件加密,简单点的可以修改文件的一个字节或者位移一下,破坏其原有的结构。就无法使之通过例如Reflector9VSPro去反编译,因为此时的Assembly-CSharp.dll已经不是一个正确的dll文件了。可尴尬的是,别人没法反编译出文件内容了,Mono自己也不认识了。这将导致,游戏无法运行。所以,我们在对其加密的同时也要加入相应的解密算法。

             image.c脚本在游戏运行时会去主动加载Assembly-CSharp.dll文件。那么我们在image.c相应的方法里面加入解密算法,然后从新编译Mono,生成相应的程序集,来替换待解密项目中的相应文件。就可以达到游戏运行正常又安全的效果。

            So ,Follow me to see.

    Window篇

    加密Assembly-CSharp.dll :

    需要工具:

      1. Reflector9VSPro:反编译工具:用于成果测试。

      2. xxtea:此教程所用的第三方加密解密算法:用于加密解密。

      3. MinGw:使用gcc编译:用于制作加密工具。

    1. 首先下载需要工具的工具3。进行安装配置。可在cmd窗口中用“gcc -v”指令来查看安装结果。
    2. 下载工具2。文件夹中有xxtea.h、xxtea.c两个文件。这两个就是加密解密的代码。
      • 创建新文件夹“encrypt”,把这两个文件放在“encrypt”文件夹中。
      • 新建C语言脚本“EncryptManage.c”,同样放在“encrypt”中。脚本内容:
      #include <stdio.h>  
      #include <string.h>  
      #include <stdlib.h>  
      #include "xxtea.h"  
      #define SIZE 1024*1024*10  
      void main()  
      {  
          FILEFILE *infp = 0;  
          if((infp=fopen("Assembly-CSharp.dll","rb"))==NULL)  
          {  
              printf("Assembly-CSharp.dll Read Error\n");//打开操作不成功  
              return;//结束程序的执行  
          }  
        
          //char buffer[SIZE];  
          char* buffer = (char*)malloc(sizeof(char)*SIZE);  
          memset(buffer,0,sizeof(char)*SIZE);  
        
          int rc = 0;  
          int total_len = 0;  
        
          total_len = fread(buffer , sizeof(unsigned char) , SIZE , infp);  
          printf("Read Assembly-CSharp Successfully and total_len : %d \n" , total_len);  
        
          //加密DLL  
          size_t len;  
          char* key = "123456";  //此处位密钥。可自由更改
          charchar *encrypt_data = xxtea_encrypt(buffer,total_len, key, &len);  
        
          printf("Encrypt Dll Successfully and len : %d\n" , len);  
        
          //写Dll  
          FILE* outfp = 0;  
          if((outfp=fopen("Assembly-CSharp_encrypt.dll","wb+"))==NULL)  
          {  
              printf("Assembly-CSharp_encrypt.dll Read Error\n");//打开操作不成功  
              return;//结束程序的执行  
          }  
        
          int rstCount = fwrite(encrypt_data , sizeof(unsigned char) , len , outfp);  
            
          fflush(outfp);  
        
          printf("Write len : %d\n", rstCount);  
        
          fclose(infp);  
          fclose(outfp);  
        
          free(buffer);  
          free(encrypt_data);  
      } 
    
    • 打开cmd窗口。cd到encrypt文件夹中。然后使用gcc编译EncryptManage.c文件。生成可自动化加密的exe文件"EncryptManage.exe"。
      代码为gcc xxtea.c EncryptManage.c –o EncryptManage
    1. Build PC平台的游戏项目。在生成的文件夹中找到我们需要加密的xxxxx\xxxx_Data\Managed\Assembly-CSharp.dll文件。把这个文件同样放在第二步中创建的encrypt文件夹中。
    2. 直接点击第二步创建的EcryptManage.exe文件。执行加密Assembly-CSharp.dll文件的操作。生成Assembly-CSharp_encrypt.dll文件。这个就是加密后的文件。把他从新名为原Assembly-CSharp.dll名称。放回他所在源目录。
    3. 使用Reflector9VSPro工具进行反编译Assembly-CSharp.dll。如果发现反编译失败。证明加密成功。此时可相应的运行游戏文件。会发现游戏也无法正常运行。

    重编译可解密的mono.dll文件 :

    需要工具:
    注意:如果你希望编译顺利进行,不把时间浪费在一些坑上。就需要这些工具。
      1. Visual Studio 2010:去编译和修改mono项目:由于mono-unity官方项目使用VS2010创建的,所用使用vs2010会避免很多的冲突,在用VS2015的时候就会碰到配置,引用,平台工具集型号…等等问题,再加上其他各种未知问题,最后选择了VS2010版本,才成功。

      2. mono-unity-5.6:我在此用的时5.6的包,观者可根据需求下载相应版本的包:我们通过对它的修改添加,从编译。生成相应的mono.dll文件,用于解密。经过测试,可编译成功的版本有4.6,5.1,5.5,5.6

    1. 使用上文中的加密文件xxtea.c和xxtea.h复制到下载的mono的工程目录里,具体位置在mono-unity-5.6\mono\metadata文件夹下。

    2. 然后用vs2010打开工程文件mono-unity-5.6/msvc/mono.sln,打开之后,通过“解决方案资源管理器”找到libmono项,再将复制在mono-unity-5.6\mono\metadata文件夹中两个xxtea文件添加到libmono项中,并找到libmono下的image.c,打开,开始添加解密代码。

    3. 由上述引言可知,image.c就是我们要添加解密代码的文件。首先,添加引用头文件#include"xxtea.h"和#include <stddef.h>

    4. 在脚本中找到方法 “mono_image_open_from_data_with_name”。这个就是加载Assembly-CSharp.dll的入口。那么我们就在此方法中添加我们的解密代码。
      代码如下:

    MonoImage *  
    mono_image_open_from_data_with_name (charchar *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status,    gboolean refonly, const charchar *name)  
      {  
          MonoCLIImageInfo *iinfo;  
          MonoImage *image;  
          charchar *datac;  
        
        //第一个参数data指向运行时Assembly-CSharp.dll的内存地址
          if (!data || !data_len) {  
              if (status)  
                  *status = MONO_IMAGE_IMAGE_INVALID;  
              return NULL;  
          }  
        
         //这是添加的代码,开始   你也可以换成自己想要的解密方法
         if(name != NULL)
         {
          if (strstr(name, "Assembly-CSharp.dll")) {  
              char* key = "123456";     //此处密钥需要对应加密时候所创建的密钥
              size_t len;  
              char* decryptData = (charchar *)xxtea_decrypt(data, data_len,key, &len);  
              int i = 0;  
              for (i = 0; i < len; ++i)  
              {  
                  data[i] = decryptData[i];  
              }  
              g_free(decryptData);  
        
              data_len = len;  
          } 
        }
         //这是添加的代码,结束
          datac = data;  
    

    5. 最后,我们开始编译工程。
    * 打开 Visual Studio Command Prompt(2010)
    * cd 到mono-unity-5.6\msvc目录中
    * 执行msbuild.exe mono.sln /p:Configuration=Release_eglib命令

    注意:直接打开mono.sln解决方案,通过Visual Studio直接生成是编译不了的,这是个坑。

    6.我在这里用了54秒就编译成功了。生成的dll位置在mono\builds\embedruntimes\win32\mono.dll。(63位的mono.dll文件要用Visual Studio x64 Win64 命令提示(2010)去编译)

    7. 最后把你编译出来的mono.dll文件复制到你的项目包中,替换Mono文件夹中的源mono.dll文件。
    好了,OK。运行游戏,完美运行。再用反编译工具去反编译Assembly-CSharp.dll。发现无法反编译。


    Android篇

    注意:由于windows和ubuntu平台中对Assembly-CSharp.dll的加密操作是一样的,所用不做多余叙述,Assembly-CSharp.dll的加密可以直接使用windows平台加密后的Assembly-CSharp.dll文件。 在window篇中我们要使用的是编译后的mono.dll文件。但是在Android项目中,我们要使用的是libmono.so文件。其他需要操作的对象文件都一样。所以我们只需要使用Ubuntu32为系统去重编译可解密的libmono.so文件即可。

    Ubuntu 32位虚拟系统搭建:

    需要工具:

      1. Ubuntu32位:ubuntu系统:由于windows上面比较麻烦,而且错误特别多。而ubuntu64位不选择的原因是坑很多。用32位系统至少可以让坑少一半。

      2. VMware Workstation :桌面虚拟计算机软件:用于搭载Ubuntu系统。

      3. android-ndk-r10e-linux 32位:基于linux系统的NDK:NDK的版本是根据项目需求下载的,此处操作的mono-unity-5.6的mono项目包,此项目要求使用“r10e”版本的NDK。

    1. 通过VMware Workstation 搭建Ubuntu虚拟环境。
    2. 安装编译所需相关工具:
      • autoconf
      • automake
      • bison
      • gcc
      • gettext
      • git    //编译时,项目会需要git命令去下载依赖文件。
      • glib >=2.0    //编译所需库文件。
      • libtool    //如果你是64为的NDK。由于交叉编译工具是32为的。则需要安装的libtool也是32为的。所以,这个工具在安装的时候要使用 sudo apt-get install libtool*命令安装,注意要加“  *  ”。这样可以安装整个libtool-bin库。非则的话就算安装了libtool也会一直提示没有安装libtool。在32位系统下不存在这个问题。
      • make    //编译工具。
      • perl    //用于运行pl脚本。

    命令为sudo apt-get install autoconf automake bison build-essential gettext git libglib2.0 libtool* perl
    3. 配置NDK的环境,配置步骤:
    a. 在终端输入sudo gedit ~/.bashrc。打开环境变量配置文件。
    b. 在文件末端直接加入环境变量:

     NDK_ROOT=/home/xxxx/xxxx/android-ndk-r10e   
     NDK=$NDK_ROOT
     ANDROID_NDK_ROOT=$NDK_ROOT
     export NDK_ROOT NDK ANDROID_NDK_ROOT
    

    c. 保存并且使环境生效:` source ~/.bashrc ``

    编译前的文件修改 :

    需要工具:

      1. mono-unity-5.6:观者可根据项目需求下载相应的包。

    1. 下载mono-unity-5.6文件之后。这个文件夹的上层级最少要有两层。如果不够,则新建空文件夹用于存放此文件夹。
      原因:在build_runtime_android.sh文件中,大概56行有 :KRAIT_PATCH_PATH="${CWD}/../../android_krait_signal_handler/build" 。这个表示,在编译的时候会下载依赖文件“android_krait_signal_handler”。如果无法保证上层级在两层以上,也可以更改这行代码。
    2. 在下载的mono-unity-5.6文件夹中。找到build_runtime_android.sh文件。具体位置在\mono-unity-5.6\external\buildscripts文件夹中。把他放在\mono-unity-5.6\根目录中。
    3. 打开 build_runtime_android.sh文件。在15行perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r10e -env=envsetup.sh && source envsetup.sh中。 -ndk=r10e描述的是所需ndk版本。
    4. 修改build_runtime_android.sh文件内容:
      • 在文件第6行的export ANDROID_PLATFORM=android-9下面添加exportANDROID_NDK_ROOT=/home/xxxx/xxxx/android-ndk-r10e。为防止不必要的错误,手动指定ndk目录。
      • 如果出现无法找到 envsetuo.sh文件的错误。则需要手动指定envsetuo.sh文件所在目录。第15行perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r10e -env=envsetup.sh && source envsetup.sh末端的``source中直接指定文件目录source xxxx\xxxx\mono-unity-5.6\envsetup.sh`。
      • 在文件第74行:-fpic -g -funwind-tables \中。把-g改为-O2(O0,O1,O2,O3分为好几个压缩档次)。通过更改这个可以编译出release版本。会比debug版本体积更小。
      • 找到第154到156行:
        #clean_build "$CCFLAGS_ARMv5_CPU" "$LDFLAGS_ARMv5" "$OUTDIR/armv5" 
        #clean_build "$CCFLAGS_ARMv6_VFP" "$LDFLAGS_ARMv5" "$OUTDIR/armv6_vfp"
        clean_build "$CCFLAGS_ARMv7_VFP" "$LDFLAGS_ARMv7" "$OUTDIR/armv7a"
      
      注释掉前两行。我们只需要armeabi-v7a和x86类型的libmono.so文件。所以注释掉可以节省编译时间,
    1. 修改build_runtime_android_x86.sh文件内容:

      • \mono-unity-5.6\external\buildscripts文件夹中找到:build_runtime_android_x86.sh文件。打开准备修改。
      • 同build_runtime_android.sh的修改一样。在第6行下面添加NDK目录:exportANDROID_NDK_ROOT=/home/xxxx/xxxx/android-ndk-r10e
      • 修改第71行:-fpic -g\。去掉-g改为-fpic \。为了防止x86下的手机进入游戏卡顿的情况。
    2. 注意: 如果你下载的是32为的NDK可以忽略此步骤。修改PrepareAndroidSDK.pm文件内容。文件在/mono-unity-5.6/external/buildscripts/下面。

      • 直接翻到最后的第435行中,找到PrepareNDK方法。
      sub PrepareNDK
         {
       	my ($ndk) = @_;
      	my $ndk_root = $ENV{$NDK_ROOT_ENV};
       	$ndk_root = $1 if($ndk_root=~/(.*)\/$/);
      
           # 读取NDK目录下的RELEASE.TXT文件以查看NDK版本号
      	if (-e $ndk_root and open RELEASE, "<", catfile("$ndk_root", "RELEASE.TXT"))
      		{
      			my @content = <RELEASE>;
      			close RELEASE;
      			chomp(@content);
      			my $current = $content[0];
      			print "\tCurrently installed = " . $current . "\n";
      	
      	         
      			# remove the possible '(64-bit)' from the end
      			#如果你下载的NDK是Linux 64-bit NDK,它的版本号是”  r10e-rc4(64-bit) “。那么将会在次数出错。程序将一直找不到你的NDK。
      			#所以需要修改下面代码为:`my @curr_arr = split(/\-|\s/, $current)`
      			#或者直接修改NDK目录下RELEASE.TXT文件内容为:` r10e (64-bit) `或者 ` r10e` 
      			my @curr_arr = split(' ', $current);
      			$current = $curr_arr[0];
      			
      			if ($ndk eq $current)
      			{
      				print "\tNDK '$ndk' is already installed\n";
      				return;
      			}
      	   .....
      }
      
    1. 检查编译所需环境是否合格。

      • 方法一:打开终端。cd 到mono-unity-5.6目录中,使用管理员权限执行autogen.sh文件。命令为:sudo ./autogen.sh。这是个批处理文件,帮我们检查编译mono-unity所需要的环境。如果出现缺失库的错误,那么根据错误进行相应修改和安装。这个文件会帮你执行configure,make,make clean,make distclean等命令。
      • 方法二:在终端中cd到mono-unity-5.6目录中。使用管理员权限执行sudo ./configure --prefix=/usr/bin命令。也是检查编译环境是否合格,如何没有合格,会报错。如果合格,则会他提示你执行make指令。到了这步,说明你的环境大致安装完成了。
    2. 开始第一次编译。管理员身份执行复制在mono-unity-5.6根目录下的build_runtime_android.sh文件,命令为:sudo ./ build_runtime_android.sh不要使用"sudo sh build_runtime_android.sh "去执行。第一次编译通常情况下都会碰到/usr/bin/env: perl -w: No such file or directory的错误。没关系。这次编译只是为了下载krait-signal-handler依赖文件。

    3. 如果你出现上面8所述的/usr/bin/env: perl -w: No such file or directory错误。那么打开刚才下载的krait-signal-handler文件夹。找到里面的build.pl文件。修改第一行#!/usr/bin/env perl -w#!/usr/bin/perl -w

    4. 注意: 如果你下载的是32为的NDK可以忽略此步骤。在修改完上述9中所述的错误之后。还需要用/mono-unity-5.6/external/buildscripts/目录下的PrepareAndroidSDK.pm替换/krait-signal-handler/目录下的PrepareAndroidSDK.pm

    编译libmono.so文件及其之后的操作 :

    1. 开始第二次编译。 运行命令为:sudo ./ build_runtime_android.sh

      • 如果出错:查看/mono-unity-5.6/根目录下面的config.log文件。编译的错误会全部输出在此文件中。
      • 如果不出错,那么恭喜你。在/mono-unity-5.6/builds目录下就是编译出来的armv7a和x86的libmono.so文件。测试完成,那么加入解密代码。然后进行最终编译。
    2. 添加解密代码。还是找到image.c文件。在 “mono_image_open_from_data_with_name”方法中添加解密代码。此处和windows平台不同的是需要把xxtea.cxxtea.h的代码直接合并到image.c以及image.h中。

    3. 再次编译。成功生成libmono.so文件。然后复制到windows平台下。替换源游戏apk文件中相应的文件。包括。两个libmono.so以及Assembly-CSharp.dll文件。

    从新打包APK :

    需要工具:

      1. Apktool:反编译apk和从新打包apk工具。工具相关教程:Android apk反编译及重新打包流程



    这里写图片描述

    我是李本心明


    首先谢谢大家的支持,其次如果你碰到什么其他问题的话,欢迎来 我自己的一个 讨论群559666429来(扫扫下面二维码或者点击群链接 Unity3D[ 交流&副业]CLUB ),大家一起找答案,共同进步 同时欢迎各大需求商入住,发布自己的需求,给群内伙伴提供副职,赚取外快。对了,资源的话,要在群公告里面找。

    由于工作生活太忙了,对于大家的帮助时间已经没有之前那么充裕了。如果有志同道合的朋友,可以接受无偿的帮助别人,可以单独联系我,一块经营一下。
    如果你有更好的经营方式也来练习我,加我QQ

    在这里插入图片描述


    展开全文
  • 反编译 Unity发布Apk

    2017-09-26 11:46:21
    转自:http://www.cnblogs.com/U-tansuo/p/unity3d_apk_decompilation.html 郑重声明:本教程仅用于学习使用,从事任何商业用途非法行为与作者无关,请知晓! 本文目的:通过教会大家如何破解别人游戏的同时,也...

    转自:http://www.cnblogs.com/U-tansuo/p/unity3d_apk_decompilation.html
    郑重声明:本教程仅用于学习使用,从事任何商业用途非法行为与作者无关,请知晓!
    本文目的:通过教会大家如何破解别人游戏的同时,也希望各位开发者能加强自身游戏的防破解能力!
    1:到gitHub下载DisUnity v0.3.3软件,下载地址: https://github.com/ata4/disunity/releases 简单教程:https://github.com/ata4/disunity
    2:下载希望破解的apk 改后缀名为.rar或.zip,然后解压;出来的目录结构如图:
    1
    unity资源在 assets\bin\Data; 其中Managed下放的是dll,游戏源码被编译成Assembly-CSharp.dll,直接引用dll到monodeveloper 就看以考到源代码
    .asset或者XXXX.assets.split4 游戏资源
    3.将解压出的apk目录 直接拷贝到DisUnity v0.3.3 目录下,执行
    2

    解压出
    3
    里面包含了 mesh、shader、texture2d等
    4、texture2D下的.ktx 查看;下载PVRTexTool工具,下载地址:http://download.csdn.net/detail/akof1314/7660209
    直接转为png格式的批处理脚本为:

    @echo off
    path %path%;"D:\Imagination\PowerVR\GraphicsSDK\PVRTexTool\CLI\Windows_x86_32"
    
    for /f "usebackq tokens=*" %%d in (`dir /s /b *.ktx`) do (
        PVRTexToolCLI.exe -f PVRTC1_4 -i "%%d" -d "%%~dpnd.png"
        del "%%~dpnd.pvr"
    )

    PVRTexTool也支持翻转参数flip,但是在这里,我测试无效,只能使用另一个工具ImageMagick来进行上下翻转,批处理脚本为:

    @echo off
    path %path%;"D:\Imagination\PowerVR\GraphicsSDK\PVRTexTool\CLI\Windows_x86_32"
    for /f "usebackq tokens=*" %%d in (`dir /s /b *.ktx`) do (
        PVRTexToolCLI.exe -f PVRTC1_4 -i "%%d" -d "%%~dpnd.png"
        del "%%~dpnd.pvr"
        "D:\Program Files\ImageMagick-6.8.5-5\convert.exe" -flip "%%~dpnd.png" "%%~dpnd.png"
    )

    原文转自:
    http://www.cnblogs.com/U-tansuo/p/unity3d_apk_decompilation.html
    郑重声明:本教程仅用于学习使用,从事任何商业用途非法行为与作者无关,请知晓!

    展开全文
  • Unity自动打包Apk

    2018-02-06 18:17:19
    Unity自动打包Apk unity打包apk相对来说比较容易,相信出过的人都明白,出包过程,没有大的难度,一步一操作,一步一等待,繁琐耗时,不懂的人又代替不了。这时候需求就来了,如何简单的一键打包搞定,这个就稍微...

    Unity自动打包Apk
    unity打包apk相对来说比较容易,相信出过的人都明白,出包过程,没有大的难度,一步一操作,一步一等待,繁琐耗时,不懂的人又代替不了。这时候需求就来了,如何简单的一键打包搞定,这个就稍微有点难度,当然作为程序员就是要解决这些问题,封装变化,变繁为简。

    打包apk大概可以分为以下步骤(出apk需要的jdk,Android sdk这些不用多说,相信大家都会配置)

    1、配置PlayerSetting
    2、配置渠道等第三方SDK
    3、copy外部资源和一些自己工程需要的一些配置
    4、unity打包build(如果出成Android工程,还需要就行Android工程的自动打包apk)

    没有什么难的东西,都是一些配置,繁琐的东西,一键化也就是写个脚本,按照步骤一步一步的执行就行了
    很简单相信大家都会,只是一些细节需要注意一下,细节中还是有一些坑的

    一、配置PlayerSetting

    有两种方法
    1、事先使用PlayerSetting 编辑页面保存一个配置好的ProjectSettings.asset,需要的时候直接替换掉ProjectSettings目录下的ProjectSettings.asset就行了
    设置分离obb文件的属性,有的人可能不知道
    这里写图片描述
    2、使用代码设置PlayerSetting(凡是在PlayerSetting编辑页面看到的属性都是可以使用代码进行设置的)
    (1)、Unity提供了命令行方式进行打包、调用方法等操作
    command line形式: unity执行文件路径 -projectPath 项目工程路径 -executeMethod 方法名 各种参数
    在unity项目Editor下的一个继承ScriptableObject的文件中的static方法都可以使用unity command line执行(注意Unity需要是关闭的)

    $unity_path -projectPath $project_path -quit -batchmode -executeMethod ProjectBuild.ProjectSetting -qmplatform $platform 
    //$unity_path unity执行文件路径
    //$project_path 项目工程路径
    //-batchmode 不打开unity
    //-executeMethod  执行unity方法
    //ProjectBuild.ProjectSetting Editor下的脚本名为ProjectBuild,其中有个名为ProjectSetting的方法,具体代码如下
    //-qmplatform $platform 传入的参数

    (2)、有一些属性设置,比较难找,使用 PlayerSettings.SetPropertyInt(“ScriptingBackend”, (int)ScriptingImplementation.Mono2x, BuildTarget.iPhone); 慢慢尝试

    class ProjectBuild : Editor
        {
            const string OPT_PLATFORM = "-qmplatform";
            const string OPT_BUNDLE_VERSION = "-qmbundle_version";
            const string OPT_SHOW_VERSION = "-qmshow_version";
            const string OPT_VERSION_CODE = "-qmversion_code";
            /// <summary>
            /// 根据参数配置Unity ProjectSetting
            /// </summary>
            static void ProjectSetting()
            {
                Dictionary<string, string> settings = new Dictionary<string, string>();
                settings[OPT_PLATFORM] = "";
                settings[OPT_BUNDLE_VERSION] = "";
                settings[OPT_SHOW_VERSION] = "";
                settings[OPT_VERSION_CODE] = "";
                string[] args = System.Environment.GetCommandLineArgs();
                ParseArgs(settings, args);//解析参数
    
                PlayerSettings.companyName = "****";
                PlayerSettings.bundleVersion = settings[OPT_BUNDLE_VERSION];
                PlayerSettings.shortBundleVersion = settings[OPT_SHOW_VERSION];
                PlayerSettings.defaultInterfaceOrientation = UIOrientation.AutoRotation;
                PlayerSettings.allowedAutorotateToLandscapeLeft = true;
                PlayerSettings.allowedAutorotateToLandscapeRight = true;
                PlayerSettings.strippingLevel = StrippingLevel.StripByteCode;
                PlayerSettings.aotOptions = "nimt-trampolines=512,ntrampolines=2048";
                PlayerSettings.targetGlesGraphics = TargetGlesGraphics.Automatic;
                PlayerSettings.Android.preferredInstallLocation = AndroidPreferredInstallLocation.Auto;
                PlayerSettings.Android.targetDevice = AndroidTargetDevice.FAT;
                PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel9;
                PlayerSettings.Android.forceInternetPermission = true;
                PlayerSettings.Android.forceSDCardPermission = true;
                PlayerSettings.Android.bundleVersionCode = int.Parse(settings[OPT_VERSION_CODE]);
                PlayerSettings.Android.useAPKExpansionFiles = true;//是否使用obb分离模式
                PlayerSettings.productName = "******";
                PlayerSettings.bundleIdentifier = "*****";
                PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, "宏定义");//宏定义的设置
                EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTarget.Android);
            }
        }

    (3)、对于一些如Icon、splash页面的设置可以使用原名替换图片的方法
    (4)、 PlayerSettings.Android.useAPKExpansionFiles = true;//是否使用obb分离模式,这个主要是针对Google play的
    obb的命名,是需要一定的规则的,不然无法使用,可以使用代码自动设置obb的名字在Editor目录下有这个方法,出包时会自动调用,可以在这里设置
    (如果需要对dll文件进行加密的话,肯定是出成了Android工程,这里可以获取Android工程中的dll文件进行加密,同时替换可以解密的so文件)

    [PostProcessBuild(90)]
    public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject)
    {
        files = Directory.GetFiles(pathToBuiltProject, "*", SearchOption.AllDirectories);
        if (files != null)
        {
              foreach (string fileName in files)
              {
                   if (fileName.Contains(".obb"))
                   {
                       int bundleVersion = PlayerSettings.Android.bundleVersionCode;
                       string bundlePackageName = PlayerSettings.bundleIdentifier;
                       Directory.Move(fileName, pathToBuiltProject + "/main." + bundleVersion + "." + bundlePackageName + ".obb");
                   }
               }
        }
    }

    obb的使用上的还有一点小小的坑,Google play商店在下载游戏的时候,会自动下载apk所需的obb,但是有时候也不能保证一定成功,所以需要项目本身就具有这样的检测下载功能https://www.assetstore.unity3d.com/en/#!/content/3189这里有非常详细的代码,可以copy直接使用

    二、配置渠道等第三方SDK和copy外部资源

    1、sdk的接入
    统一接口,支持不同各种渠道的sdk接入
    http://blog.csdn.net/chenjie19891104/article/details/42217281这个可以看一下
    2、和不同渠道绑定的参数,建议拿出来做配置,可以不用重新出版本就可以切换不同渠道的版本
    3、sdk切换相关目录资源的替换,unity直接出成apk的话,就在unity打包之前,如果是先出Android工程的话,也可以在Android工程中进行,效率会更快一点,不需要再从unity build就可以出成不同的渠道包

    三、unity打包build

    unity build Android 可以直接打包成apk或是Android工程,使用命令行调用的方式跟上面ProjectSetting的类似,-executeMethod 的参数名换成相应函数名即可,

     static void Build()
     {
               string android_project_path = "";//目标目录
                BuildTarget target = BuildTarget.Android;
                string[] outScenes = GetBuildScenes();//需要打包的scene名字数组
                BuildPipeline.BuildPlayer(outScenes , android_project_path, target, BuildOptions.AcceptExternalModificationsToPlayer);
     }
     // BuildOptions.AcceptExternalModificationsToPlayer  表示出成Android工程
    // BuildOptions.AcceptExternalModificationsToPlayer  表示出成Android工程

    直接打包apk就不用多说了,build成功就行了

    出成Android工程后还需要几步才能完成
    1、Android工程,自动打包apk,需要配置ant环境

    到官方主页http://ant.apache.org下载新版(目前为Ant1.9.6)的ant,得到的是一个apache-ant-1.9.6-bin.zip的压缩包。将其解压到你的硬盘上,例如:C:\apache-ant-1.9.6。然后配置环境变量

    ANT_HOME C:/ apache-ant-1.9.6
    path C:/ apache-ant-1.9.6/bin
    classpath C:/apache-ant-1.9.6/lib

    2、可以在Android工程中进行资源和渠道SDK的替换(也就是目录文件的替换),这样可以一个工程出成不同的渠道包
    3、签名的需要的ant.properties,这里写着Android签名文件的目录,用户名和密码,需要事先写好,copy到Android工程目录下

    key.store=./config/xxx.keystore
    key.alias=xxx
    key.store.password=xxx
    key.alias.password=xxx

    4、使用Android command line生成build.xml(这是ant签名打包的必须文件)
    command line形式: android update project -p Android工程路径 -n 生成apk的名字(这个command line的使用需要配置一下环境变量)

    android update project -n $apk_name -t 1 -p “$android_pj_path”
    //$apk_name 生成apk的名字
    //”$android_pj_path” Android工程路径

    5、使用ant release,这个command line需要在Android工程目录下执行,不然command line会找不到路径,最后在bin目录下生成apk文件,有签名的和不签名的
    可以考虑与Jenkin结合使用,会更方便操作

    展开全文
  • 最近在研究如何给Unity游戏进行加密,让别人不能轻易破解你的apk包,不过网上的加密方法都是有对应的破解方法~_~!!结果加密方法没找到好的,逆向工程倒会了不少。今天就来讲解如何提取一个没做任何保护的apk包中的...

      最近在研究如何给Unity游戏进行加密,让别人不能轻易破解你的apk包,不过网上的加密方法都是有对应的破解方法~_~!!结果加密方法没找到好的,逆向工程倒会了不少。今天就来讲解如何提取一个没做任何保护的apk包中的资源和代码。

      

      (1)打开apk包

      首先,将你的apk包重命名为zip或者rar类型的文件,然后进行解压缩,如下:

    重命名为,然后进行解压缩,得到如下的目录内容:

    各个部分的说明如下表:

    assets Unity游戏里面的资源和代码
    lib   arm和x86需要的so文件
    META-INF 信息包
    res 存放icon等资源
    AndroidManifest.xml 清单文件
    classes.dex Android Dalvik字节码
    resources.arsc 编译后的二进制资源文件

    我们主要关注的是assets目录,里面有我们想要的资源和代码。

      

      (2)提取代码

      Unity把我们大部分的代码都放到了这个dll文件中(当然还有其他代码放到了first-pass之类的代码,但不是主要的),我们可以在assets\bin\Data\Managed这个路径下找到所有需要的dll文件。要解析dll文件,我用到了这个软件(自行百度下载),用该软件打开

    得到以下这样的界面:

    通过点击右键进行导出,选好导出目录,等待一会,就能得到以下的源代码:

    我的测试项目就只写了一个Test.cs,可以看见上面已经成功导出了,打开一看:

    我滴乖乖,完全和我写的一模一样,一点不变地导出来了。(由此可见代码混淆和加密的重要性了)

      (3)提取资源

      要提取资源,我们需要用到Unity Studio,可在下载地址他的Github上下载。

     打开Unity Studio,点File/Load folder,选中assets\bin\Data该目录,然后就能得到如下界面:

    其中Scene Hierarchy可以查看游戏里面场景的分布情况,而Asset List可以查看资源。

    比如我的测试工程里面,只在空场景里放了一个汽车模型,可以从这个文件分析出我的场景结构如下:

    而打开Asset List,可以找到我放进去的一张蓝色按钮贴图:

    当然,除了贴图,像音频文件、xml文件、着色器等都能查看到,不过模型目测不能提取出来(这就要用disunity了)

      

      总结:unity游戏太容易被分析出来了,如果项目十分重要,那代码混淆、加密等工作还是十分重要的。

     

    展开全文
  • unity3d游戏资源提取

    2017-10-03 22:13:01
    1、unity3d使用c#作为控制脚本,android下使用libmono.so 2、libmono.so一般都加固了,目前走完init_proc后抓取镜像即可得到原始镜像 3、mono下加载c#文件的函数为 mono_image_open_from_data_with_name ,前2个...
  • Unity3D游戏资源的提取

    2014-09-16 22:37:07
    前言 ...国内一些比较小的Unity3D游戏基本上资源文件都打包在了apk的assets文件夹中,如下图中的《爸爸去哪儿2》资源结构。 我们知道,国外的游戏一般体验较高 画质一流,所以资源文件会更大
  • 基于深思云授权平台,有一套Unity3D代码及资源加密保护方案,可通过Virbox Protector加壳工具对代码及资源进行加壳,再配合精锐5加密锁或者云锁及软锁,可达到极高的安全性,可防止代码被反编译及资源被拷贝。...
  • 首页 资讯 专题 周刊 技术 ...首页 > 技术 > 移动开发 > Android > Unity ...Unity 3D Android对dll加密和重编译mono源码进行解密 0条评论  为防止Unit
  • Unity3d 是基于 Mono的,我们平时写的 C# 脚本都被编译到了 Assembly-CSharp.dll ,然后 再由 Mono 来加载、解析、然后执行。Mono 加载 Assembly-CSharp.dll 的时候就是读取文件到内存中,和平时读取一个 游戏资源 ...
  • unity3d引擎的游戏,重要的资源就是C#脚本,脚本是被打包到APK的assets目录下的一些dll文件,有的APP可能会对其加密,运行的时候再动态解密。可以通过HOOK libmono.so中的函数mono_image_open_from_data_with_name...
  • 首先感谢 雨松MOMO 的一篇帖子 教我们怎么提取 .ipa 中...教我们初步的破解unity3d资源的基本方法 附上原帖的链接:http://www.xuanyusong.com/archives/2584 下面我会从头介绍一下提取的全过程:步骤一:首先从 ...
  • Unity打包的APK文件中资源文件的组织方式和文件结构。
  • Unity3D手游开发实践

    2018-04-29 10:58:53
    虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:架构设计、原生插件/平台交互、版本与补丁、用脚本,还是不用?这是一个问题、资源管理、性能优化、异常与Crash、适配与兼容、调试及开发工具...
  • 大多数游戏都是使用Unity 3D做的,我们逆向分析主要分析\assets\bin\Data\Managed中的Assembly-CSharp.dll文件,当我们用.NET Reflector 或者dnSpy 打开Assembly-CSharp.dll文件时,有时候会发现什么信息也看不到,...
  • 我做这个是因为,我的Unity工程中的Scene0.unity场景文件损坏了,我就想着应该这个文件在生成的APK里边,就想把它给解出来用。 步骤, 1.解压APKAPK文件后缀改为rar/zip之类的直接解压得到下面的文件: 这...
  • 拿到一个Unity 打包出来的apk,如果没有加密的话 ,你是可以通过反编译修改其中的属性的。 步骤一 (1)把.apk 解压有两种方法  第一 .apk 变成 .zip 并解压 然后修改 \assets\bin\Data\Managed\Assembly-...
  • 最近玩了一个游戏,发现获取买装备需要获取星星,获取星星需要赢得比赛,那我要是想买齐所有装备,我就要赢很多场比赛,等我凑齐了装备...直接利用apk导入AndroidKiller然后反编译签名认证,分析,判断当前的游戏Uni...
  • 随机数校验 为了让玩家的操作体验更好,游戏开发之初,我决定把战斗计算放在前端实现,战斗结束之后,后端校验前端发来的数据。最简单直接的校验方法就是:按照前端的实现方法,后端实现战斗计算,逐条验证前端发来...
1 2 3 4 5 ... 9
收藏数 169
精华内容 67
热门标签