利用Cheat Engine与DnSpy破解Unity游戏的技术与实践
Ba1_Ma0 发表于 四川 二进制安全 3906浏览 · 2024-05-22 04:14

本文案例下载地址:

https://play.picoctf.org/practice/challenge/361?originalEvent=72&page=3


双击运行pico.exe


屏幕上方的一串英文是叫我们找flag,我在这个小地图里走来走去也没flag,上梯子后发现突破点


墙外有一个旗帜,但是我们无法出去,有空气墙,碰到旗帜就应该能拿到flag了

目前能拿到flag的思路:

使用Cheat Engine控制人物的坐标,直接修改坐标值,强制出去
使用DnSpy修改程序代码,使一开始运行游戏的时候就显示flag

Cheat Engine

Cheat Engine是一款用于修改计算机游戏运行时内存中数值的开源工具。它可以搜索和修改游戏中的各种数值,如生命值、金钱、经验值等等
下载地址:

https://www.cheatengine.org/

使用ctrl+alt+tab使游戏在后台运行,安装好Cheat Engine后双击运行


点击左上角的图标,导入游戏进程


导入之后就要搜索我们要修改的值了,在unity中,玩家的坐标是浮点数,我们可以一直移动来找到坐标值


由于不知道坐标,scantype选择未知的值,valuetype选择浮点数,然后点击firstscan


可以看到,扫描到了215168000个值,太多了,现在来慢慢筛选,点击scantype,选择增加值


然后回到游戏,我们向前走几步


然后回到Cheat Engine,点击nextscan


可以看到,值减少了很多,现在我们回到游戏,后退几步,回到Cheat Engine,选择减少值


点击扫描后又少了一些值,一直重复这几个动作


现在值减少到了6千多个,然后选择不变的值,点击repeat


点击nestscan


现在有400多个值,取消repeat,回到游戏,继续重复上面的动作


现在只剩下60多个值了,我们点击address然后右下角的图标


在最下面我们随便勾选几个值,代表着冻结,然后回到游戏看能不能移动,如果不能就慢慢筛选,直到找到坐标的值

经过一段时间的筛选后,发现这个值就是坐标值,一旦我冻结了他,回到游戏就无法移动


结这个值,然后双击,随便改一个值


注意别改太大了,大概这个值就能出去


现在解禁函数,成功突破空气墙限制

DnSpy

DnSpy是一款开源的.NET程序集反编译工具,它可以将.NET程序集反编译成可读性较高的C#代码或者IL代码。DnSpy不仅可以查看反编译后的代码,还可以编辑和调试.NET程序集,包括修改程序集中的变量值、方法等等

下载地址:

https://github.com/dnSpy/dnSpy/releases/tag/v6.1.8

Assembly-CSharp.dll是unity的程序集,所以我们反汇编这个文件就好了


双击打开DnSpy,将Assembly-CSharp.dll拖入


在APTX里找到了一些有趣的函数

private void OnTriggerEnter(Collider collision)
{
    if (collision.gameObject == this.player)
    {
        this.Mysterious.SetActive(true);
    }
}

如果玩家碰撞了这个对象,就会输出一些东西,这应该就是flag的触发方式了

在下面,可以看到游戏启动的函数名次Start

首先我们复制this.Mysterious.SetActive(true);这一行代码,然后右击APTX


然后右击创建的Start,选择编辑方法


然后进行修改,使一进入游戏就输出flag


ctrl+shift+s保存所有,双击打开游戏


一打开游戏就能看见flag了

0 条评论
某人
表情
可输入 255
目录