Unity 3d游戏逆向之.NET Reflector工具使用介绍

移动平台游戏框架主要有unity 3d和cocos 2d。咱们首先得识别游戏使用的框架。html


识别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注入到游戏中,让游戏执行咱们修改后的代码。另外也能够动静态修改二进制实现。

一、修改unity游戏逻辑代码编译成汇编代码相关的值
(1) 修改传进来的参数,即寄存器,通常是set之类的函数
(2) 汇编代码中尽可能不修改内存,不修改opcode,能改寄存器直接改寄存器

二、反编译Assembly-CSharp.dll,直接修改unity的C#源代码
(1) 修改函数返回值
(2) 直接删除函数体,只剩下 ret 指令
(3) 在对应函数修改,对变量进行处理
(4) 在对应函数增长一些call处理,主动call

三、分析源码直接修改代码
(1) 经过分析unity反编译后的源码找到对应的汇编指令下断点修改寄存器
(2) 经过直接静态分析dll,直接修改IL码的二进制码

四、在加载dll的函数位置dump原来的dll代码,可绕过dll加密,修改源代码
hook住mono_image_open_from_data_full函数,dump出dll能够,用IDA配合jdb挂起进程在那函数位置下断点dump也能够,源代码具体修改方案同“2”和“3”

经常使用工具
一、IDA工具
能够进行动态调试和静态分析的工具,能在合适的位置下断点,修改指定寄存器和编写IDC脚本配合分析
二、ILSpy
反编译和分析dll代码,能够交叉引用,能够以源码形式保存反编译的代码,提供代码给DirFind等字符串搜索定位工具定位代码位置

三、.NET Reflector + Reflexil
反编译和分析dll代码,弥补了ILSpy一些功能性的缺陷,能够分析出错误的CLR文件头,一些在ILSpy显示不出的dll文件,若是只是由于dll头部被修改,放在.NET Reflector中是能够分析出的。Reflexil则是.NET Reflector的一款插件,能够反编译和回编译IL码,方便实用可视化。

四、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代码修改器:flex

在左边单击对应函数,就能够对该函数代码进行修改了。ui

下面举例分析。在逆向中咱们常常须要插入log语句打印log信息来辅助分析。unity打印log的语句是:加密

Debug.Log
函数原型是:public static void Log(object message);

若是咱们要打印下面函数中ToString的返回值应该如何操做呢?spa

按照正常逻辑,应该是先保存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

相关文章
相关标签/搜索