1.打开程序界面如下

试了一下发现可以用wasd移动,并且绿色的方块可以被推动
猜测是要把三个方块推到黄×上
2.尝试用CE直接搜索分数
从0->1->2,但是没成功
3.把程序放进Ghidra看下代码
从entry开始
void entry(void)
{
__security_init_cookie();
FUN_1400b32e0();
return;
}再进入FUN_1400b32e0()
观察到其中一段代码
iVar2 = FUN_1400045f0(); uVar5 = FUN_1400b432c();
if ((char)uVar5 != '\0') {
if (!bVar1) {
_cexit();
}
__scrt_uninitialize_crt(...);
return iVar2;
}
exit(iVar2);
推断FUN_1400045f0()大概率是主函数
4.进入FUN_1400045f0()
看了下代码逻辑大概是这样
FUN_1400045f0():
[1] 初始化本地变量、locale、字符串
[2] 加载字体
[3] 加载贴图 player.png
[4] 加载贴图 X.png(目标点)
[5] 加载贴图 box.png
[6] 初始化地图 (8x7)
[7] 根据地图堆叠各种对象:玩家、目标点、箱子、墙?
[8] 游戏循环 while(running):
- 处理输入(WASD/方向键)
- 更新玩家位置
- 判断玩家位置是否撞墙/箱子
- 箱子是否能被推动
- 玩家是否走到目标
- 绘图5.发现在初始化时都会调用这个函数
FUN_140018fb0((longlong)local_670,
CONCAT44((float)iVar22 * 64.0 + 90.0,(float)iVar20 * 64.0 + 320.0));猜测可能是物体的坐标
6.于是又打开CE试一下
根据代码判断是单浮点,类型选未知的初始值进行首次扫描

然后操控人物向右走选择增加的数值进行再次扫描

同理向左走选择减少的数值进行扫描
最后停一下选择未变动的数值进行扫描得到以下结果

7.把这些地址都双击添加一下
对每个地址对应数值进行修改
观察到其中一个地址修改数值后游戏人物位置会发生改变
可以推断这个就是它的x坐标
并把其它多余地址删除
8.推测y坐标地址在x坐标地址附近
用x地址+4来添加地址,类型选用单浮点
得到一个看起来像y坐标的地址

操纵人物移动,并修改数值
成功验证该结果
继续在该地址附近±4看是否有其它有用的地址,结果没找到
9.接下来要确定外面方块的坐标
将人物x坐标改大到外面会被立马传回来
最后反复试了一下发现1024时人物刚好与方块重合
10.对1024进行反复扫描得到

11.同样依次修改确定
最后得到结果

已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)



