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 ...
随机推荐
- Dynamics CRM可以设置会话超时和非活动超时吗?
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复266或者20171213可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- python 3.6 +pyMysql 操作mysql数据库
版本信息:python:3.6 mysql:5.7 pyMysql:0.7.11 ########################################################### ...
- Linux中MySQL5.6编译安装与MySQL5.7二进制安装步骤
首先,介绍一下MySQL的几种安装方式 1.RPM.Yum 的安装方式:安装方便.安装速度快,无法定制 2.二进制:不需要安装,解压即可使用,不能定制功能 3.编译安装:可定制,安装慢. 编译安装中需 ...
- Linux----CentOS-7搭建免流服务器
本次实验采用腾讯云服务器:https://cloud.tencent.com/ 大学生身份的可以看看有没有什么活动购买 其他身份的78一个月 关于腾讯云服务器的使用可以看看腾讯云的使用手册 本博客涉及 ...
- 分布式文件系统及FastDFS
1.前言 今天来谈谈分布式文件系统,侧重点是文件系统,分布式稍微带一下.然后聊下我用的FastDFS的例子. 2.从小需求开始 我的博客的编辑器用的是markdown,它内嵌了一个文件上传功能,不过后 ...
- 【SqlServer】【问题收集】删除同一张表中完全相同的记录
1 概述 在Sqlserver中,当通过SqlServer设计器删除同一张表中两条完全相同的记录时,会弹出如下提示: 点击“是” 弹出如下提示,不让删除 2 问题解决 这个问题很简单,用DEL ...
- 摧枯拉朽,说说ES6的三把火
阅读目录 我是 Jser 我骄傲 作用域 模块系统 类(Class) 我是 Jser 我骄傲 JavaScript 如今可谓是屌丝逆袭高富帅的代名词哈,从当初闹着玩似的诞生到现在 Github 上力压 ...
- 超详细的 Linux CentOS 编译安装python3
前言: 安装完CentOS7后,执行#Python与#python -V,看到版本号是2.6,而且之前写的都是跑在python3.X上面的,3.X和2.X有很多不同,在这里我就不弊述两者之间的区别了新 ...
- 自学Zabbix3.8.2-可视化Visualisation-maps网络地图
自学Zabbix3.8.2-可视化Visualisation-maps网络地图 可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map,通过map可以了解应用的整体状况:服务器是否异常 ...
- MVC+EF 入门教程(四)
一.前言 写了那么久,那么现在给大家看效果了 二.效果展示 点击创建Blog 显示 编辑 编辑成功,是不是很酷. 删除 终于完成了,准备睡觉!虽然有很多不足的地方,我会慢慢的去改的.感谢累了一天的自己 ...