2015-02-04 10:15:45 qq396225997 阅读数 782
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

有需求是在完整的apk中截取Android Unity3D并暴露Java的接口。这次文章就是这方面实现的一个小例子。

首先反编译apk,把asserts/bin/manager 文件下的UnityEngine 中的getkey 方法加入调用Android代码的调用:

AndroidJNI.AttachCurrentThread();
    AndroidJNI.PushLocalFrame(0);
    try
    {
        Debug.Log("kyx_keyevent run");
        using (AndroidJavaClass class2 = new AndroidJavaClass("com.kuaiyouxi.keyevent.KYXUnityKeyEvent"))
        {
            object[] args = new object[] { key };
            key = (KeyCode) class2.CallStatic<object>("kyxKeyEvent", args);
        }
    }
    catch (Exception)
    {
        Debug.LogError("kyx_keyevent run");
    }
    finally
    {
        AndroidJNI.PopLocalFrame(IntPtr.Zero);
    }
return GetKeyString(name);

Debug.Log("kyx_keyevent "+(int)key);

Reflector 

package com.kuaiyouxi.keyevent;

import android.util.Log;

public class KYXUnityKeyEvent {
	public static int kyxKeyEvent(int obj){
		Log.e("kyx_keyevent", "run in kyx_keyevent"+obj);
		if(obj == 97 || obj == 100 || obj == 96 || obj == 23){
			obj = 0;
		}
		return obj;
	}
	
	public static String kyxKeyEventString(String obj){
		Log.e("kyx_keyevent", "run in kyx_keyevent"+obj);
		return obj;
	}
	
	public static int kyxKeyDownEvent(int obj){
		Log.e("kyx_keyDownevent", "run in kyx_keyDownevent"+obj);
		if(obj == 97 || obj == 100 || obj == 96 || obj == 23){
			obj = 0;
		}
		return obj;
	}
	
	public static String kyxKeyDownEventString(String obj){
		Log.e("kyx_keyDownevent", "run in kyx_keyDownevent"+obj);
		return obj;
	}
	
	public static int kyxKeyUpEvent(int obj){
		Log.e("kyx_keyUpevent", "run in kyx_keyUpevent"+obj);
		if(obj == 97 || obj == 100 || obj == 96 || obj == 23){
			obj = 0;
		}
		return obj;
	}
	
	public static String kyxKeyUpEventString(String obj){
		Log.e("kyx_keyUpevent", "run in kyx_keyUpevent"+obj);
		return obj;
	}
	
	
	
}

把这个程序编译打包成apk。然后反编译,把上诉代码的smali放进unity3d apk中,打包签名。就可以跑起来了。是不是很简单~

2019-02-26 18:32:22 weixin_44058342 阅读数 848
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

作者:dawu@知道创宇404实验室
时间:2019/02/25

0x00 前言

这是一篇游戏引发的简单技术文。

起因是个人很喜欢玩 google play 上的一些数字类型(角色攻击是线性增长,怪物指数变强,到后期越打不过,通过重生增强属性变强)的小游戏。但是这种游戏仍旧存在一定缺陷,前期资源不多,玩的太慢、玩的时间长了,就感觉没意思,就不想玩了,所以在玩到游戏中期的时候,往往都会去网上搜索XXX破解版/内购版,快速进入后期然后放弃这款游戏。

这样的做法其实是很不安全的,因为无法判断XXX破解版/内购版在破解/内购之后还做了什么。所以我最后的解决办法是,逆向这些apk,修改游戏逻辑。让我在玩的时候,可以快速度过缓慢的前期。

逆向了几个玩过的游戏,发现这类游戏使用Unity3D开发的居多。因此本文将介绍简单Unity3D类安卓游戏的逆向修改思路。

0x01 准备工具

逆向最简单的Unity3D类安卓游戏建议使用安装好 JAVA 环境的Windows系统(涉及到dll文件的修改,所以Windows平台更加适合)。

1.1 安卓 APK 逆向三件套

一般 APK 逆向,常使用到 apktool、dex2jar、jd-gui。在逆向 Unity3D 安卓游戏时,仅仅只需要使用到 apktool

Apktool: 用于解压/重新打包安卓APK。
dex2jar: 将解压出来的dex文件变成jar,方便使用jd-gui查看
jd-gui: 查看dex文件逻辑

1.2 dll文件逆向三件套

因为一般的 Unity3D 安卓游戏的主逻辑都在 asserts/bin/data/Managed/Assembly-CSarp.dll 中,所以我们还需要 dll文件逆向/重新打包 的工具。

ILSpy: 用于查看dll程序逻辑

ILDASM: 用于反编译dll文件,生成il文件(存放了dll反编译后的指令)和res文件(反编译后的资源文件),可以安装Windows SDK或者从网上下载。

ilasm: .net4.0自带了,位置在 C:\Windows\Microsofr.NET\Framework\v4.0.30319\ilasm.exe

1.3 生成重新打包的自签名证书

修改完 apk 之后,需要对 apk 进行签名。该命令用于生成签名的证书。
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 0validity 10000

记住设置的密码,最后自签名应用的时候需要输入密码

0x02 开发一个简单的 Unity3D 游戏

用Unity3D开发了一个简单小游戏作为本文的样例,逻辑十分简单:

  1. 英雄每过一关战斗力都会增加100.
  2. 怪物的战斗力为 Math.pow(2,当前关数)
  3. 当英雄战斗力小于怪物的战斗力时,英雄无法闯关。英雄可以考虑修炼或者重生提高战斗力。
  4. 英雄每次修炼战斗力都会增加1000.
  5. 英雄选择重生后,关卡数清零,需要重新闯关,但英雄初始战斗力会增加 2000 * 重生前闯关数。
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    具体代码可以参考 Github

0x03 游戏逆向步骤

  1. 使用 apktool 解压游戏安装包
    java -jar apktool.jar d game.apk
  2. 提取出 game/assets/bin/data/Managed/Assembly-CSarp.dll ,使用 ILSpy 打开即可看到 dll 里面的逻辑。
    注: Unity3D开发的安卓游戏,其核心代码都在这个 dll 文件中,所以逆向/修改这个 dll 文件就可以了。这也是 Unity3D 和 其它安卓逆向不同的地方。
    在这里插入图片描述
    在没有混淆的情况下,反编译出的函数内容和原内容十分相似:
    在这里插入图片描述在这里插入图片描述
  3. 找到关键函数、关键逻辑后,就可以尝试反编译 dll 文件并修改。使用 ILDASM 将 dll 文件反编译成 il 文件。使用 ILDASM 打开 dll 文件后, File -> dump 就可以导出反编译结果了。
    在这里插入图片描述
  4. 根据步骤2,就很容易理解逻辑了,然后根据速查表,就可以知道在步骤3导出的il文件中修改哪里了。例如步骤2中 Click1 就是游戏中 点击闯关 按钮绑定的逻辑。闯关的关键判断就在: info.hero_power + info.temp_power + info.add_power >= info.monster_power。所以打开步骤3中生成的 .il 文件,结合 .NET IL 指令速查表修改这部分对应的关键逻辑即可。
    在这里插入图片描述
    修改为 info.hero_power + info.temp_power + info.add_power != info.monster_power 就可以通过此处的逻辑判断。
    在这里插入图片描述
  5. 修改为 info.hero_power + info.temp_power + info.add_power != info.monster_power 就可以通过此处的逻辑判断。 修改为 info.hero_power + info.temp_power + info.add_power != info.monster_power 就可以通过此处的逻辑判断。
    在这里插入图片描述
  6. 修改关键逻辑后,通过重新编译 dll 文件、apk 文件、签名修改后的 apk 就可以在手机上安装运行了。

重新编译dll文件命令如下:C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe game.il /output=Assembly-CSarp.dll /dll

将重新编译的dll放回 game/assets/bin/data/Managed/ 目录下,使用apktool重新打包apk:
java -jar apktool.jar b game
cp game/dist/game.apk ./

自签名应用:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore game.apk alias_name

  1. 修改成功,开局修炼一次后,就可以无限闯关。顺利到达第30关。
    在这里插入图片描述

0x04 杂谈和总结

1.Unity3D有一个较为明显的特征: 开局会显示游戏LOGO。这个可以作为判断一个游戏是不是Unity3D开发的小参考。

2.文中的demo到了31关,就会发生整型溢出,怪物战斗力变为负数。原因是怪物战斗力的值为int型。在以前玩过的某个后期极度不平衡的游戏中,我的确遇到过整型溢出的问题。造成花钱升级还能增余额的情况。

3.在修改游戏之前把游戏语言调整为英文有助于在逆向的时候理解各个函数的意义(对于没有混淆的应用)。

4.游戏修改之后,很容易丧失原本的乐趣,变成纯粹的数字游戏。谨慎修改!

0x05 参考链接

1.Apktool
2.ILSpy
3..NET IL 指令速查表
4.Unity3d类安卓游戏逆向分析初探

2015-02-03 10:47:27 qq396225997 阅读数 542
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

目的:截取Android Unity3d游戏交互事件,例如游戏中的keycode事件,并做自定义修改。

工具:apktool , .net Reflector 以及插件Reflexil

前言:

Android游戏的项目中,遇到Unity3D游戏的情况特别多。研究一下,废话不多说,植入主题:

操作:

1.先拿到一个Unity3D 的游戏,用apktool 反编译,去到asserts/bin/Data/Manager 目录下,里面就是存放Unity3d 的dll 文件。

2.把UnityEngine 拷贝到一个新的文件夹里。(因为在原来的文件夹编译会提示重复引用的异常,拷出来是最笨的方法了)用Reflector 


这几个方法就是Unity3d C# 写的获取事件的方法了。

3.直接用Reflexil 工具,对对应的方方法进行修改。


4.编译,放回asserts 文件夹下。编译打包签名apk。直接就可以运行了

2019-09-05 13:39:05 qq_43380549 阅读数 764
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

作者:dawu@知道创宇404实验室
时间:2019/02/25
英文版本:https://paper.seebug.org/943/
如果你想第一时间了解漏洞资讯,可以关注我们的知道创宇Paper:https://paper.seebug.org/829/

0x00 前言

这是一篇游戏引发的简单技术文。

起因是个人很喜欢玩 google play 上的一些数字类型(角色攻击是线性增长,怪物指数变强,到后期越打不过,通过重生增强属性变强)的小游戏。但是这种游戏仍旧存在一定缺陷,前期资源不多,玩的太慢、玩的时间长了,就感觉没意思,就不想玩了,所以在玩到游戏中期的时候,往往都会去网上搜索XXX破解版/内购版,快速进入后期然后放弃这款游戏。

这样的做法其实是很不安全的,因为无法判断XXX破解版/内购版在破解/内购之后还做了什么。所以我最后的解决办法是,逆向这些apk,修改游戏逻辑。让我在玩的时候,可以快速度过缓慢的前期。

逆向了几个玩过的游戏,发现这类游戏使用Unity3D开发的居多。因此本文将介绍简单Unity3D类安卓游戏的逆向修改思路。

0x01 准备工具

逆向最简单的Unity3D类安卓游戏建议使用安装好 JAVA 环境的Windows系统(涉及到dll文件的修改,所以Windows平台更加适合)。

1.1 安卓 APK 逆向三件套

一般 APK 逆向,常使用到 apktooldex2jarjd-gui。在逆向 Unity3D 安卓游戏时,仅仅只需要使用到 apktool

  • Apktool: 用于解压/重新打包安卓APK。
  • dex2jar: 将解压出来的dex文件变成jar,方便使用jd-gui查看
  • jd-gui: 查看dex文件逻辑

1.2 dll文件逆向三件套

因为一般的 Unity3D 安卓游戏的主逻辑都在 asserts/bin/data/Managed/Assembly-CSarp.dll 中,所以我们还需要 dll文件逆向/重新打包 的工具。

  • ILSpy: 用于查看dll程序逻辑
  • ILDASM: 用于反编译dll文件,生成il文件(存放了dll反编译后的指令)和res文件(反编译后的资源文件),可以安装WindowsSDK或者从网上下载。
  • ilasm: .net4.0自带了,位置在C:\Windows\Microsofr.NET\Framework\v4.0.30319\ilasm.exe

1.3 生成重新打包的自签名证书

修改完 apk 之后,需要对 apk 进行签名。该命令用于生成签名的证书。

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 0validity 10000
# 记住设置的密码,最后自签名应用的时候需要输入密码

0x02 开发一个简单的 Unity3D 游戏

用Unity3D开发了一个简单小游戏作为本文的样例,逻辑十分简单:

  1. 英雄每过一关战斗力都会增加100.
  2. 怪物的战斗力为 Math.pow(2,当前关数)
  3. 当英雄战斗力小于怪物的战斗力时,英雄无法闯关。英雄可以考虑修炼或者重生提高战斗力。
  4. 英雄每次修炼战斗力都会增加1000.
  5. 英雄选择重生后,关卡数清零,需要重新闯关,但英雄初始战斗力会增加 2000 * 重生前闯关数。
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

具体代码可以参考 Github

0x03 游戏逆向步骤

1.使用 apktool 解压游戏安装包

java -jar apktool.jar d game.apk

2.提取出 game/assets/bin/data/Managed/Assembly-CSarp.dll ,使用 ILSpy 打开即可看到 dll 里面的逻辑。

注: Unity3D开发的安卓游戏,其核心代码都在这个 dll 文件中,所以逆向/修改这个 dll 文件就可以了。这也是 Unity3D 和 其它安卓逆向不同的地方。

在这里插入图片描述

在没有混淆的情况下,反编译出的函数内容和原内容十分相似:

在这里插入图片描述

ILSpy 反编译的 Click1 内容

在这里插入图片描述
Click1 的原始代码

3.找到关键函数、关键逻辑后,就可以尝试反编译 dll 文件并修改。使用 ILDASMdll 文件反编译成 il 文件。使用 ILDASM 打开 dll 文件后, File -> dump 就可以导出反编译结果了。

在这里插入图片描述

4.根据步骤2,就很容易理解逻辑了,然后根据速查表,就可以知道在步骤3导出的il文件中修改哪里了。例如步骤2中 Click1 就是游戏中 点击闯关 按钮绑定的逻辑。闯关的关键判断就在: info.hero_power + info.temp_power + info.add_power >= info.monster_power。所以打开步骤3中生成的 .il 文件,结合 .NET IL 指令速查表修改这部分对应的关键逻辑即可。

在这里插入图片描述

修改为 info.hero_power + info.temp_power + info.add_power != info.monster_power 就可以通过此处的逻辑判断。

在这里插入图片描述

5.修改关键逻辑后,通过重新编译 dll 文件、apk 文件、签名修改后的 apk 就可以在手机上安装运行了。

重新编译dll文件命令如下:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe game.il /output=Assembly-CSarp.dll /dll

将重新编译的dll放回 game/assets/bin/data/Managed/ 目录下,使用apktool重新打包apk:

java -jar apktool.jar b game
cp game/dist/game.apk ./

自签名应用:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore game.apk alias_name

6.修改成功,开局修炼一次后,就可以无限闯关。顺利到达第30关。

在这里插入图片描述

0x04 杂谈和总结

  1. Unity3D有一个较为明显的特征: 开局会显示游戏LOGO。这个可以作为判断一个游戏是不是Unity3D开发的小参考。
  2. 文中的demo到了31关,就会发生整型溢出,怪物战斗力变为负数。原因是怪物战斗力的值为int型。在以前玩过的某个后期极度不平衡的游戏中,我的确遇到过整型溢出的问题。造成花钱升级还能增余额的情况。
  3. 在修改游戏之前把游戏语言调整为英文有助于在逆向的时候理解各个函数的意义(对于没有混淆的应用)。
  4. 游戏修改之后,很容易丧失原本的乐趣,变成纯粹的数字游戏。谨慎修改!

0x05 参考链接

  1. Apktool
  2. ILSpy
  3. .NET IL 指令速查表
  4. Unity3d类安卓游戏逆向分析初探

本文由 Seebug Paper 发布,如需转载请注明来源。

欢迎关注我和专栏,我将定期搬运技术文章~

也欢迎访问我们:知道创宇云安全 :https://www.yunaq.com/?from=CSDN91905

在这里插入图片描述

如果你想与我成为朋友,欢迎加微信kcsc818~

2019-04-07 10:43:36 qq_36869808 阅读数 2135
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

本文首发于I春秋,未经允许,禁止转载。

感谢蛋总~

0x00 前言

说明

Unity3D是一款3D引擎,用来开发3D游戏,同样的还有Unity2D用来开发2D游戏的。咳咳,我又来啰嗦了。说白了就是说你玩的有模型的Android手游基本都是Unity3D开发的。
有开发就有破解。
所以我们走着先。

内容

1.环境介绍(无聊选择跳过)

2.贝瑞快跑——金币初始化99999

你能学到什么?

1.万军丛中取敌将首级
2.修改dll文件

3.贝瑞快跑——草莓初始化99999

你能学到什么?

1.学以致用
2.如果从coin发现的各种好东西

0x01 环境介绍

长话短说。这里没意思。

.netframwork 4.0以上。

.net relector 最好是破解的,有需要可以留言。或者戳这里,可能有,看我会不会勤快了。

剩下的就是常用的Android逆向的环境配置了。

0x02 贝瑞快跑——金币初始化99999

试玩,我就不演示了,自己玩。

first

首先反编译。

我们来看Assembly-CSharp.dll这个文件。为什么要看这个?因为这个文件就和main函数一样。
这里写图片描述

这里就是这个文件的位置。

second

把文件拖到reflector中。

然后使用搜索功能。

搜索这里选择搜索方法。
这里写图片描述

这里我们要知道什么是coin,coin就是我们的金币的意思。

搜索coin会出现很多的字符串。我们要做的就是从这么多种找到我们需要的coin。

思考:

coin可能会出现在什么地方?
coin出现的地方:
1.初始化的时候
2.游戏结束的时候获取
3.游戏商店的购买
那么初始化,肯定会有一个类。
类的特性里有一个是封装,也就是getXXX or setXXX。
还有一个很重要的地方,就是类名。

思考完了之后我们进行动手。

这里写图片描述

set,get,我们找到这里。

set是放进去,get就是拿出来。

我们再往下看看
这里写图片描述
还有一个set,get,但是这次set,get的是tatolCoin,不知道单词的翻翻字典。

tatolCoin就是总金币数目。

我们先来尝试改getCoin的值。

你说你想像改smali代码一样?不好意思,这个还真改不了。必须要从汇编下手,这也是Unity3D比其他难一点的原因了。

Third

修改的方法就是通过汇编指令来进行修改。

这里需要使用一个插件就是
这里写图片描述

我们利用这个插件来改。

思考

改什么?怎么改?

我们既然要修改金币的数量,那么我们只要让他返回具体数值,就好。

但是我们如果直接返回具体的数值,就会出现金币不会增加,一直都是99999的问题,所以我们这里可以使用Add的方法去增加金币。

这里写图片描述

我们在原来的逻辑上插入一段汇编。

首先来看看idc.i4是个什么东西。
这里写图片描述

然后选择int,选择数值,选择在之后进行添加。

这里写图片描述

然后在之后选择一个add,加法运算即可。

这里写图片描述

save保存。

end

回编译进行测试。

这里写图片描述

打开游戏之后,我居然居然。。。。玩了一把。。。感觉还可以。。。。这里修改成功了,而且可以增加金币。

0x03 贝瑞快跑——草莓修改99999

之前修改了金币,草莓也得改一改。为了熟练练习。我们来进行对草莓进行更改

first

我们之前找到了getcoin的位置。

这里写图片描述

然后根据getcoin,我们发现了getFruits。其实还有很多东西都可以改。

使用之前的方法进行修改。
这里写图片描述

这里看到我们是修改成功的。

second

测试进行回编译。

这次我就不玩了。直接看结果。

这里写图片描述

end

还有很多东西等待着发掘,比如跑步速度等等等。

没有更多推荐了,返回首页