我又来搞杀戮尖塔了,牌打不过就喜欢出老千,毕竟手握二进制的生杀大权,很难让人不想作弊。
但老任是神,我们要敬畏神明,神有你的生杀大权。
上次搞杀戮尖塔,是做的动态分析,顺便基于MacOS做了个修改器
不过动态分析还是太麻烦了,而且修改器也懒得写,一打开Xcode就觉得世间万物都比这玩意有趣。
于是这次上静态分析,想从二进制修改上实现一劳永逸。

分析

首先从steam前往游戏的安装目录。
浏览游戏安装目录
讲道理上面这张图不太必要,但我就是想展示一下库存非常非常小的一部分。
然后在MacOS上这样就能找到app的应用文件的直接可执行文件。
杀戮尖塔二进制可执行文件
但是看这1.8MB的容量显然不是包含了全部游戏逻辑的玩意,而很可能只是个游戏引擎的启动器。
毕竟游戏引擎基本都是跨平台的,跨平台软件的目录自然不会像原生开发的app那样简洁,而会多出许多平台适配、语言转换的东西。
于是就继续在目录里面找可能比较有用的东西。就遇到了这家伙。
desktop-1.0.jar
一个365MB的jar(驾)包,这看上去是比较有内容的样子。
这么说来这游戏还是java写的,其实之前动态分析的时候就发现了,游戏是运行在java虚拟机上的。
不过java逆向是没有研究过,毕竟连java代码也没有写过几行。

正经人谁写java嘛。
——鲁迅

百度了一下jar的逆向,发现一个人见人爱的工具叫JD-GUI
于是把刚发现的jar包拖到工具里面看一看。
jd-gui打开jar
jar包里面居然是包含了所有媒体文件的,确实没有见识过这样的软件工程。
于是又过了好一阵子才找到逻辑相关的内容,也就是代码部分。
ida用户差点瞬间哭下来。
jar包中的代码部分
这什么啊!
看不起搞逆向的吗!
直接给源码是怎么回事啊!
啊!!
ida落泪
于是不仅可以搜索类名和字符串等,还可以搜属性,方法,局部变量!
剩下的分析工作不就是阅读理解了吗?
回想一下我想修改什么,我想要无限费就好。毕竟玩游戏嘛,碾压对手就好,无敌就没啥意思了。
于是搜索一下关键词energy,找到一个叫EnergyPanel的类,似乎掌管着费(energy)相关的数值。

尤其是这个useEnergy(int e)方法,极有皇帝批阅奏章,财政拨款的风范。
于是决定拿这个方法来修改。

开刀

当发现JD-GUI不能编辑jar包内容的时候,确实有点靓仔落泪的冲动。
百度上有人说修改jar包拢共分3步:

  1. 把class文件从冰箱jar包导出来,并反编译成java文件;
  2. 把java文件修改;
  3. 把java文件再编译成class文件,塞到原来的jar里面。

我还真的天真地试了一下。
使用javac编译java文件
一个class的依赖这么多,编译你个—–!
这时候才发现java的逆向虽然看着很美好,但是并没有那么容易。
ida才是真正的朴朴素素才是真。
然后找到了一个基于字节码修改的jar包修改工具,Recaf
Recaf本体也是一个jar包,其用途是修改jar包。这就是 用魔法才能打败魔法
把jar包丢进Recaf并定位到useEnergy()方法,右键进入字节码编辑模式。
编辑字节码
这就是java字节码吗,像是语文课上生硬把汇编翻译成白话文。咱来粗略理解一下。

1
2
3
4
5
6
7
8
// 这里加载EnergyPanel的totalCount属性,不知道加载到哪,可能是寄存器吧
GETSTATIC com/megacrit/cardcrawl/ui/panels/EnergyPanel.totalCount I
// 这里加载局部变量e,也就是出牌要消耗的费,应该也是加载到寄存器吧
ILOAD e
// 这里应该是把前面两个寄存器相减
ISUB
// 然后把上述相减的代码放回到Energy.totalCount属性里
PUTSTATIC com/megacrit/cardcrawl/ui/panels/EnergyPanel.totalCount I

所以我猜,上述的四条字节码描述的就是totalCount -= e这条代码。
删掉就完事了。
最后重新打包成jar,这样就不需要再编译。把重新打包的jar替换掉原来游戏目录里的jar。

后记

点击开始游戏,还想着会不会有二进制文件校验之类的机制,结果啥也没有,G胖是好人。
完成,出牌不减费


Site by 喂草。
using hexo blog framework
with theme Noone.
蜀ICP备19016566号.