周末无聊,找点事干
我这个人就是闲不住,尤其赶上那种下了雨的周末,哪儿也去不了,就想着找点老古董出来瞎折腾。前阵子有个年轻同事,跟我抱怨说以前有款特火的小游戏,叫什么《屌丝猎艳记》,特老,说他小时候玩,肝得要死,但很多内容解锁不了。他问我有没有办法搞定。
我一听乐了,心想现在这些年轻人的手机里都是些高清大作,还惦记着这种十几年前的破玩意儿?不过我这人就是喜欢挑战这种老旧系统,越是没人维护的东西,搞起来越有意思。
说干就干,我决定把它给扒干净。
第一步,我得先搞到这个安卓应用的原文件。这玩意儿在应用商店肯定没了,我翻了翻我以前存备份的那个老硬盘,里面简直是个数字垃圾堆。费了半天劲,终于在深处一个叫“2013年备份”的文件夹里,找到了一个带版本号的APK文件。好家伙,这东西跟我一起躺了快十年了。
上手开搞:先看看皮囊
文件有了,下一步就是拆开看看里面到底藏了什么。这种老应用,基本上不会有啥高端的加固。我熟练地祭出了我的老三样,准备开膛破肚。
我把APK文件丢进工具里,一键分解。出来一堆文件,我瞄了一眼,果然,Smali文件一抓一大把,资源文件也乱糟糟地堆在一起,完全没做混淆处理。这简直就是把源代码敞开了放在我面前。
我当时就笑了,心想这哥们儿当年写代码的时候得多自信,一点防护措施都没有。对于我们这种喜欢逆向的人来说,这简直就是天堂。
我的目标很简单:要么是“金币”数量,要么是“好感度”判定。这种模拟经营类的游戏,所有的核心判断逻辑,都绕不开这两个数值。
深入腹地:定位核心函数
我开始在Smali代码里搜索关键词。我用了几个土得掉渣的词,比如:
- “consume” (消耗)
- “score_add” (分数增加)
- “isLock” (是否锁定)
很快,我在一个叫“*”的文件里,发现了一个叫“check_and_deduct_points”的函数。名字起得真够直接的,一眼就知道是干啥的。
我仔细看了一下这段代码的逻辑。它是检查用户当前的点数够不够,如果够,就执行一个减法操作,然后跳转到“成功”的场景。如果不够,就跳到“失败”的提示框。
真正的乐趣来了,我要开始动刀子了。
我找到控制减法的那个指令,果断把它修改了。我没有直接把它改成加法(那样太容易溢出报错),而是直接把程序流给改了。我把所有需要判定“是否够钱”的那几行代码,用一个简单的跳转指令给绕了过去。
简单来说,就是我告诉程序:“兄弟,别算了,直接默认老子有钱,跳到成功那里去。”
重新打包与测试
代码改完,我得把它重新组装回去。这一步虽然有点繁琐,但是轻车熟路。
- 先是重新编译回APK。
- 然后用我自己的测试签名工具,给它重新签个名。
- 把文件推到我的测试安卓机上,安装运行。
我打开应用,深吸一口气,开始测试核心功能。点一下需要消耗大量金币的剧情,以前是弹出“金币不足”的提示,直接秒开!点一下被锁住的VIP内容,直接就解锁了,根本没有提示我需要购买或者付费。
所有的“女神”角色,本来需要慢慢积攒好感度才能攻略的,现在我点进去一看,好感度直接满了。瞬间从一个“屌丝”变成了“高富帅”,所有限制全部解除。
我把这个搞定的版本发给了那个同事,他当时就震惊了,说他为了这个游戏花了多少时间,结果我半个下午就给他搞定了。这哪是什么高深技术,说白了就是当年开发者偷懒,留下的一个大口子。
这件事再次让我体会到,技术这东西,往往都是越老越好骗。那些看似复杂的应用,只要肯花时间,把它的结构理清楚,总能找到捷径。这种简单粗暴的成就感,比解决那些高并发高可用的大项目,来得更痛快、更直接。