Unity 3d游戏逆向及.NET Reflector工具使用介绍
移动平台游戏框架主要有unity 3d和cocos 2d。我们首先得识别游戏使用的框架。
识别Unity游戏
Android平台的apk包可以直接解压,看是否有./assets/bin/Data/Managed目录,也可以查看lib文件夹下面包含的一些so,如果有libmono,libunity等模块,基本可以确定是unity游戏了。
Android平台中C#编写的主逻辑模块代码静态编辑之后存储于Assembly-CSharp.dll文件中。因为unity的跨平台,Android平台是unity编译的游戏,那么其对应的IOS平台上也是unity编译出来的。如果希望直接从IOS上面去看是否是unity游戏,可以提取游戏中的主模块查看是否有unity之类的函数即可。
破解思路
下面列举了一些破解版思路,如果能直接下断点在函数头修改寄存器可直接修改寄存器测试,遇到一些不能直接修改的,就用第二种方法,把修改后的Assembly-CSharp.dll注入到游戏中,让游戏执行我们修改后的代码。另外也可以动静态修改二进制实现。
1、修改unity游戏逻辑代码编译成汇编代码相关的值
(1) 修改传进来的参数,即寄存器,一般是set之类的函数
(2) 汇编代码中尽量不修改内存,不修改opcode,能改寄存器直接改寄存器
2、反编译Assembly-CSharp.dll,直接修改unity的C#源代码
(1) 修改函数返回值
(2) 直接删除函数体,只剩下 ret 指令
(3) 在对应函数修改,对变量进行处理
(4) 在对应函数增加一些call处理,主动call
3、分析源码直接修改代码
(1) 通过分析unity反编译后的源码找到对应的汇编指令下断点修改寄存器
(2) 通过直接静态分析dll,直接修改IL码的二进制码
4、在加载dll的函数位置dump原来的dll代码,可绕过dll加密,修改源代码
hook住mono_image_open_from_data_full函数,dump出dll可以,用IDA配合jdb挂起进程在那函数位置下断点dump也可以,源代码具体修改方案同“2”和“3”
常用工具
1、IDA工具
可以进行动态调试和静态分析的工具,能在合适的位置下断点,修改指定寄存器和编写IDC脚本配合分析
2、ILSpy
反编译和分析dll代码,可以交叉引用,可以以源码形式保存反编译的代码,提供代码给DirFind等字符串搜索定位工具定位代码位置
3、.NET Reflector + Reflexil
反编译和分析dll代码,弥补了ILSpy一些功能性的缺陷,可以分析出错误的CLR文件头,一些在ILSpy显示不出的dll文件,如果只是因为dll头部被修改,放在.NET Reflector中是可以分析出的。Reflexil则是.NET Reflector的一款插件,可以反编译和回编译IL码,方便实用可视化。
4、Ilasm和ildasm
Ildasm可以反编译dll,dump出反编译后的il码,而Ilasm则可以重打包il码,利用命令ilasm /dll *.il即可。
常用IL码二进制
(1)nop 二进制是 0x00
(2)ldc.i4.0 二进制是 0x16
(3)ldc.i4.1 二进制是 0x17
(4)ret 二进制是 0x2A
(5)ldc.r4 二进制是 0x22 ,后面跟四个字节
.NET Reflector + Reflexil的使用
用.NET Reflector打开Assembly-CSharp.dll,这里使用的.NET Reflector版本是9.0,Reflexil版本是2.1。如图所示,通过这个Reflexil插件,我们可以插入字段、类、方法等。
通过Tools菜单下的Reflexil选项,可以打开unity代码修改器:
在左边单击对应函数,就可以对该函数代码进行修改了。
下面举例分析。在逆向中我们经常需要插入log语句打印log信息来辅助分析。unity打印log的语句是:
Debug.Log
函数原型是:public static void Log(object message);
如果我们要打印下面函数中ToString的返回值应该如何操作呢?
按照正常逻辑,应该是先保存ToString()的值到寄存器,然后当作参数传递给Log函数打印出来。但是我不知道怎么保存这个值,所以想到了另外一个办法,仿照原代码,再次调用ToString()函数,然后将下面调用CalcMD5函数改为调用Debug.Log函数。
具体怎么操作呢?
(1)首先右击“ldloc.3”那一行代码(Offset为 196),选择“Create new...”,OpCode选择“ldloc.3”,然后点击“Insert before select”。
stloc.1 将值从堆栈弹出到局部变量 1
ldloc.1 将索引 1 处的局部变量加载到计算堆栈上
(2)OpCode选择“callvirt”,Operand type选择“Method reference”,Operand选择“ToString”函数(在mscorlib模块找到System.Text.StringBuilder::ToString函数)。然后点击“Insert before select”。
(3)OpCode选择“call”,Operand type选择“Method reference”,Operand选择“Log”函数。这个函数是在UnityEngine中查找,如图所示:
然后点击“Insert before select”,如下图所示:
添加代码后的情况如下:
修改完成后,右键“Assembly-CSharp.dll”,依次点击“Reflexil”,“Save as...”保存dll文件,重新打包安装运行就可以看到log输出信息了。
参考资料:http://gslab.qq.com/article-53-1.html
Unity 3d游戏逆向及.NET Reflector工具使用介绍的更多相关文章
- 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门示例
一. 工作区域详解 1. Scence视图 (场景设计面板) scence视图简介 : 展示创建的游戏对象, 可以对所有的游戏对象进行 移动, 操作 和 放置; -- 示例 : 创建一个球体, 控制摄 ...
- 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门演示样例
一. 工作区域具体解释 1. Scence视图 (场景设计面板) scence视图简单介绍 : 展示创建的游戏对象, 能够对全部的游戏对象进行 移动, 操作 和 放置; -- 演示样例 : 创建一个球 ...
- 《Unity 3D游戏客户端基础框架》概述
框架概述: 做了那么久的业务开发,也做了一年多的核心战斗开发,最近想着自己倒腾一套游戏框架,当然暂不涉及核心玩法类型和战斗框架,核心战斗的设计要根据具体的游戏类型而定制,这里只是一些通用的基础系统的框 ...
- Unity 3D游戏开发学习路线(方法篇)
Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓.但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备.Uni ...
- Unity 3D 游戏上线之后的流水总结
原地址:http://tieba.baidu.com/p/2817057297?pn=1 首先.unity 灯光烘焙 :Unity 3D FBX模型导入.选项Model 不导入资源球.Rig 不导入骨 ...
- Unity 3D游戏开发引擎:最火的插件推荐
摘要:为了帮助使用Unity引擎的开发人员制作更完美的游戏.我们精心挑选了十款相关开发插件和工具.它们是:2D Toolkit.NGUI.Playmaker.EasyTouch & EasyJ ...
- 【Unity】1.0 第1章 Unity—3D游戏开发和虚拟现实应用开发的首选
分类:Unity.C#.VS2015 创建日期:2016-03-23 一.简介 Unity是跨平台2D.3D游戏和虚拟现实高级应用程序的专业开发引擎,是由Unity Technologies公司研制的 ...
- Unity 3D游戏-消消乐(三消类)教程和源码
Unity 消消乐教程和源码 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Start Game -- ...
- Unity 3D游戏-NPC对话系统With XML
用XML做的Unity NPC对话系统 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Create X ...
随机推荐
- 关于websorm卡顿的问题
要是电脑不卡的话,使用webstorm真可谓是一种享受,但是随着项目的开展,文件逐渐增大,webstorm自然也会出现卡顿(毕竟缺点就是吃内存),这个时候我们可以增加Xms设置 Start1: 1 找 ...
- indexOf 和 lastIndexOf的区别
indexOf 和 lastIndexOf 是什么? indexOf 和 lastIndexOf 都是索引文件 indexOf 是查某个指定的字符串在字符串首次出现的位置(索引值) (也就是从前往后 ...
- python 正则表达式之零宽断言
零宽断言:用于查找特定内容之前或之后的内容,但并不包括特定内容本身.对于零宽断言来说,我认为最重要的一个概念是位置,零宽断言用于指定一个位置,这个位置应该满足一定的条件(它附近满足什么表达式),并且这 ...
- select联动遇到的问题
今天写了个select下拉联动,记录下过程中遇到的问题. dom部分 // 拿到选中项的索引 myselect.selectedIndex // 拿到选中项的text/value myselect.o ...
- java学习笔记之日期日历类
java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...
- 最重要的 Java EE 最佳实践
參考:IBM WebSphere 开发人员技术期刊: 最重要的 Java EE 最佳实践 IBM WebSphere 开发人员技术期刊: 最重要的 Java EE 最佳实践 2004 年 IBM® W ...
- mssql查询过去一段时间数据库中执行过的语句及执行效率
SELECT TOP 1000 ST.text AS '执行的SQL语句', QS.execution_count AS '执行次数', QS.total_elapsed_time AS '耗时', ...
- 自学Zabbix1.3-zabbix进程
默认情况下zabbix包含5个程序:zabbix_agentd.zabbix_get.zabbix_proxy.zabbix_sender.zabbix_server,另外一个zabbix_java_ ...
- 【npm】如何在Atom中安装emmet和atom-beautify插件?
为了提高编写HTML和CSS的速度,最近尝试着在Atom中安装emmet插件,下面谈谈安装成功的过程 1首先我尝试了网上教程中介绍最多的方法:打开Atom的引导界面(Welcome Guide)中的i ...
- 39.Linux应用调试-strace命令
1.strace简介 strace常用来跟踪进程执行时的系统调用和所接收的信号.通过strace可以知道应用程序打开了哪些文件,以及读写了什么内容,包括消耗的时间以及返回值等 2.安装strace命令 ...