安卓U3D逆向从Assembly-CSharp到il2cpp

安卓U3D逆向从Assembly-CSharp到il2cpp_第1张图片

随着unity技术的发展及厂商对于脚本源码的保护,很大一部分U3D应用的scripting

backend已经由mono转为了il2cpp,本文从unity简单应用的制作讲起,介绍U3D应用脚本的Assembly-CSharp.dll的逆向及il2cpp.so的逆向分析。

目录如下:

0x1.U3D应用制作  →  输出两个apk,分别为mono和il2cpp

0x2.mono后台apk的逆向分析  →  Assembly-CSharp.dll 逆向修改

0x3.il2cpp后台apk的逆向分析  →  il2cpp.so逆向修改

正文内容:

0x1.U3D应用制作

工具:Unity最新版本 2017.2.1f1

1.1 创建Project

新建一个Unity3D Project,Project name为UnityTest,如下图

安卓U3D逆向从Assembly-CSharp到il2cpp_第2张图片

1.2 创建script定义界面元素

创建GameObject和C# Script,均命名为Sample, 同时创建两个UI Text,分别命名为HP和Attack。打开C# Script,进行界面元素的义,创建三个矩形按钮分别为HP,ATK和LevelUP,设置点击HP显示100,点击ATK显示50,点击LevelUP后HP和ATK的值都翻倍。

代码如下:

using UnityEngine;

using UnityEngine.UI;

public class Sample : MonoBehaviour

{

public Text _hp;

public Text _attack;

private Rect _healRect = new Rect(10f, 20f, 300f, 100f);

private Rect _attackRect = new Rect(10f, 170f, 300f, 100f);

private Rect _LevelUpRect = new Rect(10f, 320f, 300f, 100f);

public void SetHp(int hp)

{

_hp.text = hp.ToString();

}

public void SetAttack(int attack)

{

_attack.text = attack.ToString();

}

public void OnGUI()

{

int hp_value = 100;

int attack_value = 50;

if (GUI.Button(_healRect, "HP"))

{

SetHp(hp_value);

}

if (GUI.Button(_attackRect, "ATK"))

{

SetAttack(attack_value);

}

if (GUI.Button(_LevelUpRect, "LevelUp"))

{

SetHp(hp_value * 2);

SetAttack(attack_value * 2);

}

}

}

代码和界面完成后,我们设置包名(com.test.test)进行打包,分别输出mono后台和il2cpp后台的apk。

安卓U3D逆向从Assembly-CSharp到il2cpp_第3张图片

点击Player Setting进行后台设置,可点击Scripting Backend选择mono或者il2cpp。

安卓U3D逆向从Assembly-CSharp到il2cpp_第4张图片

得到的apk我们分别命名为Sample-mono.apk和Sample-il2cpp.apk。

安装测试正常,界面如下:

初始界面

安卓U3D逆向从Assembly-CSharp到il2cpp_第5张图片

点击HP和ATK后界面

安卓U3D逆向从Assembly-CSharp到il2cpp_第6张图片

点击LevelUp后界面

安卓U3D逆向从Assembly-CSharp到il2cpp_第7张图片

至此,我们完成了两种后台的apk的创建,接下来先对mono后台的apk进行逆向分析。

0x2.mono后台apk的逆向分析

工具:Android Killer,DnSpy

思路:将Sample-il2cpp.apk拖拽进Android

Killer进行反编译,获取到脚本文件/Assets/bin/Data/Managed/Assembly-CSharp.dll,dll拖进DnSpy进行反编译分析,修改关键method后,保存并重新打包运行。

Android Killer部分不再上图,Assembly-CSharp.dll拖拽进DnSpy,我们可以很轻易的找到我们需要的关键函数,如图:

安卓U3D逆向从Assembly-CSharp到il2cpp_第8张图片

根据代码信息,我们可以确定,num为初始HP,num2为初始ATK,我们在此通过编辑IL指令将他们的值分别改为1000和500,如图:

安卓U3D逆向从Assembly-CSharp到il2cpp_第9张图片

确认后C#编码变更如下:

安卓U3D逆向从Assembly-CSharp到il2cpp_第10张图片

保存后,重新打包apk安装测试结果如下:

安卓U3D逆向从Assembly-CSharp到il2cpp_第11张图片

至此,我们的mono后台apk修改已经完成,接下来我们进行il2cpp后台apk的修改。

0x3.il2cpp后台apk的逆向分析

工具:Android Killer,il2cppDumper,IDA,010Editor

思路:利用il2cppDumper获取到关键函数的offset后,使用IDA找到关键函数,分析汇编语言逻辑后,利用010Editor进行16进制文件编辑来实现修改。

Android Killer相关操作再次不做赘述,反编译后我们得到的Project中,lib目录如图:

安卓U3D逆向从Assembly-CSharp到il2cpp_第12张图片

在此我们只分析armeabi-v7a文件夹下的libil2cpp.so,x86为intel架构,暂不做分析处理。

将il2cpp.so连同assets\bin\Data\Managed\Metadata 目录下的global-metadata.dat 文件一起放进il2cppDumper目录。

安卓U3D逆向从Assembly-CSharp到il2cpp_第13张图片

运行il2cppDumper,第一步,选择il2cpp.so

安卓U3D逆向从Assembly-CSharp到il2cpp_第14张图片

第二步,选择global-metadata.dat

安卓U3D逆向从Assembly-CSharp到il2cpp_第15张图片

进入到il2cppDumper控制台界面

安卓U3D逆向从Assembly-CSharp到il2cpp_第16张图片

选择mode后可以得到Dump.cs,包含关键函数的偏移信息

安卓U3D逆向从Assembly-CSharp到il2cpp_第17张图片
安卓U3D逆向从Assembly-CSharp到il2cpp_第18张图片

打开Dump.cs,找到关键函数的偏移信息

安卓U3D逆向从Assembly-CSharp到il2cpp_第19张图片

用IDA打开libil2cpp.so文件,跳转到此偏移地址 0x7CE514

安卓U3D逆向从Assembly-CSharp到il2cpp_第20张图片

定位到关键函数后,我们可以看汇编,也可以F5插件看伪代码,为了便于理解我们这里F5处理一下

安卓U3D逆向从Assembly-CSharp到il2cpp_第21张图片

这次我们从LevelUp入手,我们在编写源码的时候,是进行了乘以2的处理,为什么汇编语言中是直接将翻倍后的数值进行传参呢,因为汇编不会完全跟我们源码的逻辑相同,但是结果一定是一样的,LevelUp的汇编代码如下

安卓U3D逆向从Assembly-CSharp到il2cpp_第22张图片

切换到对应的地址查看16进制

安卓U3D逆向从Assembly-CSharp到il2cpp_第23张图片

0xC8即为200,我们使用010Editor将其地址7CE6B4的值修改为FF(十进制为255)

安卓U3D逆向从Assembly-CSharp到il2cpp_第24张图片

保存后替换lib/armeabi-v7a目录下的libil2cpp.so文件,打包运行,结果如下

安卓U3D逆向从Assembly-CSharp到il2cpp_第25张图片

至此,il2cpp后台的apk已修改完毕。

-------附件------

源码见附件,下载后请先open scence再进行building,scence路径Assets/Scences/Sample.unity

APK请网盘下载,如下:

链接: Sample-mono.apk 密码: fua5

链接: Sample-il2cpp.apk 密码: qpav

本文由看雪论坛 黯夏子风 原创  转载请注明来自看雪社区

你可能感兴趣的:(安卓U3D逆向从Assembly-CSharp到il2cpp)