当前位置: 首页 > news >正文

[原创]安卓U3D逆向从Assembly-CSharp到il2cpp

https://bbs.pediy.com/thread-223467.htm

随着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,如下图

 

 

1.2  创建script定义界面元素

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

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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。

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

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

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

初始界面

点击HP和ATK后界面

点击LevelUp后界面

至此,我们完成了两种后台的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,我们可以很轻易的找到我们需要的关键函数,如图:

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

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

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

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

 

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

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

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

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

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

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

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

第二步,选择global-metadata.dat

进入到il2cppDumper控制台界面

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

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

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

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

 

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

 

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

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

 

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

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

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

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

APK请网盘下载,如下:

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

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

 

 


 

[培训]科锐逆向工程师培训班38期--远程教学预课班将于 2020年5月28日 正式开班!

上传的附件:

  • Sample源码.zip (32.25kb,133次下载)
  • Il2CppDumper-v2.1.6.zip (49.35kb,445次下载)

 

 

 

相关文章:

  • Unity Android il2cpp
  • Unity 找到原因了,如果你在Update里Instantiate一个prefab,上面的脚本会在这个update后执行start,然后执行lateupdate,这帧的update会被跳过
  • Unity -- Error
  • Unity iOS 删除 UIWebView
  • Jenkins 自己使用
  • Jenkins Pipeline语法(中)
  • Unity小技巧——设置代码编译时机
  • Unity 使用遇到的不足问题
  • 在eclipse中安装groovy插件详细步骤
  • Groovy 语言快速入门
  • Groovy常用语法总结
  • unity201 Mac15 bug
  • UE4扯淡大杂烩第二季
  • 《Gpu Gems》《Gpu Pro》《Gpu Zen》系列读书笔记
  • 【python3-4】Jenkins pipline集成参数自动化执行python脚本
  • 分享的文章《人生如棋》
  • #Java异常处理
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 0基础学习移动端适配
  • CEF与代理
  • centos安装java运行环境jdk+tomcat
  • CSS实用技巧
  • exports和module.exports
  • JS题目及答案整理
  • miaov-React 最佳入门
  • oschina
  • Protobuf3语言指南
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Vue实战(四)登录/注册页的实现
  • Vue学习第二天
  • 安装python包到指定虚拟环境
  • 大整数乘法-表格法
  • 新版博客前端前瞻
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #{}和${}的区别?
  • ( 10 )MySQL中的外键
  • (003)SlickEdit Unity的补全
  • (6)STL算法之转换
  • (ZT)薛涌:谈贫说富
  • (八)Flask之app.route装饰器函数的参数
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)汇编语言——简单程序
  • (一)插入排序
  • (一一四)第九章编程练习
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .bat批处理(六):替换字符串中匹配的子串
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .Net CF下精确的计时器
  • .NET delegate 委托 、 Event 事件,接口回调