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 ...
随机推荐
- 写一段PHP代码,确保多个进程同时写入同一个文件成功(腾讯)
- 项目实战8—tomcat企业级Web应用服务器配置与会话保持
tomcat企业级Web应用服务器配置与实战 环境背景:公司业务经过长期发展,有了很大突破,已经实现盈利,现公司要求加强技术架构应用功能和安全性以及开始向企业应用.移动APP等领域延伸,此时原来开发w ...
- Python3实现简单可学习的手写体识别
0.目录 1.前言 2.通过pymssql与数据库的交互 3.通过pyqt与界面的交互 4.UI与数据库的交互 5.最后的main主函数 1.前言 版本:Python3.6.1 + PyQt5 + S ...
- 函数的作用域与this指向 --- 性能篇
紧接上一篇博文:js函数的作用域与this指向 先来说说this的作用于链,this后的属性或者方法在使用时是先从本实例中查找,如果找到就先返回,如果没找到就接着向上从原型链中查找,如果有多重继承关系 ...
- Java 模拟栈结构
栈和队列: 通常是作为程序猿的工具,用于辅助构思算法.生命周期较短,执行时才被创建 訪问受限.在特定时刻,仅仅有一个数据可被读取或删除 是一种抽象的结构.内部的实现机制.对用户不可见.比方用数组.链表 ...
- 命令行界面下使用emca安装配置Oracle Database Control实战
作为命令行忠有用户,server端软件的运维都倾向于使用命令或 脚本完毕,非常讨厌资源占用非常大的GUI.Oracle数据库作为重要的server端软件.其安装运维自然也全然支持纯命令行方式.虽然同一 ...
- HDU1065 I Think I Need a Houseboat 【数学递推】
I Think I Need a Houseboat Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- ElasticSearch核心知识 -- 索引过程
1.索引过程图解: api向集群发送索引请求,集群会使用负载均衡节点来处理该请求,如果没有单独的负载均衡点,master节点会充当负载均衡点的角色. 负载均衡节点根据routing参数来计算要将该索引 ...
- MyBatis_动态SQL
一.动态SQL 动态SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据提交的查询条件进行查询. 动态SQL,即通过MyBatis提供的各种标签对条件作出判断以实现动态拼接SQL语句. 二. ...
- 一起读源码之zookeeper(1) -- 启动分析
从本文开始,不定期分析一个开源项目源代码,起篇从大名鼎鼎的zookeeper开始. 为什么是zk,因为用到zk的场景实在太多了,大部分耳熟能详的分布式系统都有zookeeper的影子,比如hbase, ...