MRCTF-EzGame
前言
这是道U3D的游戏逆向,用借着这道题把Cheat Engine“游戏作弊”以及配合dump内存分析的方法思路给大致过了一遍,还挺有意思的
关于分析Unity 3d
U3D的主要逻辑一般在Assembly-CSharp.dll
文件里,可以拖入dnspy里找关键的逻辑代码
PS:C#的string默认字符编码是Unicode,这点要注意,昨天也是一道u3d的题目,里面加密算法的key是key='1234'
,但实际上自己写exp的时候key要写成key=b'1\x002\x003\x004\x00'
C# 的所有源代码文件,默认编码为 UTF-8,注意,是源代码文件,而不是 C# 中的 string。
C# 中的所有 string,默认编码均为 Unicode (UTF-16)。
C# 产生的 ASP.NET 源代码,如 ASPX/CS,在浏览器响应回去客户端之后,编码默认为 UTF-8。可以通过 ContentType 请求头信息更改默认编码。比如:ContentType: application/json, charset=utf-8。
————————————————
原文链接:https://blog.csdn.net/u011127019/article/details/99629697
简单介绍一下il2Cpp及il2CppDumper
就是一个将C#语言写的脚本处理转成了C++,我的理解主要是为了有更好的可移植性和运行效率
这里有较为详尽的介绍:https://blog.csdn.net/u013244147/article/details/88601244
但是这样处理之后Assembly-CSharp.dll
就无了,替换成了GameAssembly.dll
和*Assembly.dll
这个拖进dnspy是没用的,没什么信息,有个il2CppDumper可以实现反编译回原来的Assembly-CSharp.dll
(有一些基本信息,但是没代码)
这题就是这样的..根据提示选择dll和global-metadata.dat,反编译的结果在DummyDll文件夹里
本题解法
官方WP的做法是通过反编译得到得信息结合il2Cpp的API写dll注入脚本来解的,dll注入日后再弄。这里先学一下别的师傅结合ce的做法
四个任务分别是:
- 应该是到终点的意思
- 找到某个npc
- 吃到饼干
- 吃到105个钻石
ps:一开始尝试手动通关,有个地方怎么也跳不过去,可能是故意设(wo)置(tai)的(cai)吧hh
用CE找到关键数据内存
启动游戏,打开ce添加游戏进程
扫描搜索数据,这里好像吃钻石的数量比较好搜,边吃边搜,直到搜索结果锁定在关键的几个位置,基本就没错了(可以尝试修改后在游戏查验来确认)
然后看一下反编译后的dll里的信息:
有各个关键数据的偏移地址:像这样
然后可以用ce里的Structure dissect(在Memory View中的tool里面)来整理这些相关数据,不过要注意设置数据的字节长度,像这里的key实际上是8字节的,要给他右键改一下
全部给他按照要求修改后
getflag显示
应该是和flag相关的key不对,其实反编译出来有个函数叫EatTokenUpdateKey
,应该是每吃一个钻石key都会更新,所以单纯地修改钻石数量是不行的。
结合dump内存分析
ce里有个功能特方便,可以找到修改(或访问)指定内存的位置,右键就能看到。
那先把设置里的debugger改成VEH(好像可以绕过一些反调试?),然后右键key的内存,“找到哪修改了着这个地址的内存”
然后去吃颗星星触发
可以跟进进去直接在ce里看到修改位置的汇编码,能看伪代码吗?可以!
网上有很多的dump进程内存的工具,我用的火绒剑,把内存dump出来后直接拖进ida可以反编译(这方法好像可以脱一些壳?)
要在ida里找到函数对应的位置可以搜索函数头的字节,search里有一栏sequence of bytes,勾选一下那个Find all occurrences
注意要dump正确的文件(dll),但是不知道为啥我这里没法正确反编译,就tmlp…放一下别人的图吧
最后把这个函数撸一遍把正确的key跑出来再去ce里面修改就行了,这个就不说了。
Comments