专栏首页Deen的代金券日记破解某单机游戏到学习fiddler脚本改包
原创

破解某单机游戏到学习fiddler脚本改包

写在前面

前段日子出去玩了,游山玩水的,网太差,就下了个单机耍耍。水墨风,打斗效果挺不错的(那么,请问哪里能够下载到呢?)

像我这种0氪玩家,肝是不可能肝的,这辈子都不可能的,阴阳师我都没肝过XD,氪也是不可能氪的,身上钱只能够吃吃饭而已......

开搞

不说了,web狗开始逆向!AndroidKiller打开,拖入apk,点击开始反编译!what??某数字加固宝,AndroidKiller关闭!自闭中.......

逆向又不会,只能回归自己老本行-开始抓包。

请求分析

像这样的单机游戏app实在没有太多请求,大概发现下面这些:

  1. 访问 /fightingx/utils/timeUtil2.php 返回一个时间戳
  2. 输入cdk向服务器兑换CDK
  3. 充钱请求

3的充钱是加密的乱码,如果不能逆向出源码找出解密,是基本不用看了。

至于2的请求,服务器返回的是json:{"ret":2},仅靠这样的数据是很难构造返回包的。除非:一是逆向出源码,找出是怎么解析的,再构造相应数据;二是找到一个cdk,构造一个陈工兑换的返回包,每次兑换都会返回这个。这是可行的,可是上哪找cdk呢,社工?(我加群水了半天也没水到一枚cdk)......

发现漏洞

最后我从1下手,这涉及到一个游戏机制的问题。游戏当中有一个“探索”的机制,即你从现在开始探索,经过6个小时后你就可以获得收获,受益不少。

探索

我一开始修改系统时间,提前了6个多小时,但是发现并没有什么用,然后通过抓包修改1请求的返回包,改成第二天的时间,发现“探索”就立马结束了!!我只要不停的重复这个动作,“富可敌国”指日可待。

自动化实现

碰到的问题

我使用burp的正则匹配进行返回包替换,将返回的时间戳换成几天或者几个月之后的,但是这个替换并不是一劳永逸的,**我需要不停的替换,使替换的时间每次都比上次的时间多6个小时。** 因为每次的出发时间点都是上一次结束的时间点,这也太累了吧,我手机操作就算了,每次还要修改burp......

fiddler改包

我要实现的功能很简单,就是使返回的时间戳每次都比上一次请求的多21600秒,或者更多,burp是没法实现的,还是我没找到。我将目光投向了fiddler,虽然不怎么用这东西。

fiddler修改返回包有三种方法

  1. 通过AutoResponder进行修改,具体操作是左边选择需要修改的请求,右边再点击AutoResponder按钮,添加规则,需要制定一个txt文本
autoresponder修改返回包
  1. 通过Automatic Breakpoints进行改包,点击rules,再选择断点方式
image.png

断点之后,每当有请求时,都会出现在下面。

image.png

双击进入,然后点击break on response,再点击textview即可修改返回包,修改完成后点击run to completion。

image.png
  1. 通过FiddlerScript改包,点击rules,再点击Customize Rules,就进入脚本编辑
image.png

这是采用c#编写的,也自定义了一部分函数和方法。脚本编写是再此基础上进行修改。我们要修改的是OnBeforeResponse

image.png

下图我打马赛克的部分就是脚本编写的位置。

image.png

最简单的实例,当请求host为www.baidu.com时候,返回baidu:

if (oSession.HostnameIs("www.baidu.com")){

        oSession.utilSetResponseBody('baidu');

    }

        
image.png
image.png

实现不断递增返回时间戳达到破解效果

http是无状态,这里也是,OnBeforeResponse这个函数每当有请求返回的时候都会重新运行一次,也就是我并不能在这实现一个类似于计数器的东西,每当请求某网站时就n+1,然后再某个时间基数上乘以n*21600.

但我并不需要返回值使这期间间隔的值为一个确切的值,我只需要大于一个值。

假设我探索出发的时间为a,通过修改返回包,返回来的时间为a+b,b>21600,第二次探索出发的时间为a+b,则第二次返回回来的时间为a+b+c,c>21600,第三次探索出发的时间为a+b+c......

也就是说,我需要找到一个递增的值,这个值在我探索出发,和探索结束这段时间内,增大的数值需要大于21600.

有什么是不断变大的,又不受状态影响呢?**系统时间戳**

我通过代码取系统时间戳,截取这个时间戳的后面几位为g,g是递增的,我让g乘以一个数字,使g在探索的时间里,增加的值与这个数字的乘积大于21600.

代码如下:

if (oSession.HostnameIs("www.xxxxxgames.cn")){

            oSession.utilDecodeResponse(); //解码 

            var now = new Date();

            var ts = now.getTime();

            var d = ts.ToString();

            var t = d.Substring(0,10);

            var ttt = t.Substring(t.Length - 4);

            

            var f = int.Parse(t);

            var g = int.Parse(ttt);

            

            var time = f + g\*1000;

            oSession.utilReplaceRegexInResponse('^1568.\*$',time);

  

            

        }

自动刷钱

当不用不停的修改返回时间戳来达到破解效果时,实现自动刷钱自动探索就容易的不少。简单思路就是安卓开启USB调试连接手机,通过鼠标操控手机。再用按键精灵不停重复探索动作,即可。

合影

最后成果:百万金币加上数不尽的紫装 :D

成果

思考

如何实现更加精确的动态修改返回包?

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android 0day收购价高达250万美金,首次反超iOS

    近日,漏洞收购商Zerodium更新了安卓和iOS的0day漏洞收购价,发现自2015年公司成立以来,安卓0day漏洞价格首次高于iOS漏洞价格。

    FB客服
  • React Native介绍及开发环境(Mac)搭建

    曾经有这么一个说法:世上凡能用JavaScript实现之事物,最后都用JavaScript实现了。

    一粒小麦
  • 安卓ADB进不去的几种情况!

    可能大家有些童鞋是学习有关安卓的,所以关于安卓adb的调试是缺少不了的。这里号主把自己遇到的几种adb进不去的情况及处理办法分享一下。

    FreeRonin
  • 优雅的监听onActivityResult

    此时,我们可能会用到EventBus这种全局分发事件的方式来处理,但种感觉不够优雅。

    Clayman Twinkle
  • 【H5】344- 微信 H5 页面兼容性解决方案

    当点击输入的时候,光标的高度和父盒子的高度一样。例如下图,左图是正常所期待的输入框光标,右边是ios的input光标。

    pingan8787
  • WebRTC常见问题 (FAQ)

    业务后台实现,关于userSig参考:https://cloud.tencent.com/document/product/647/17275

    jialuhu
  • 2019可信访问报告:限制登录位置最受企业青睐

    这是一份安全访问解决方案供应商Duo Security的《Duo可信访问报告2019》,涵盖了来自2400万台设备,100万个应用和服务以及数十亿个身份验证数据...

    FB客服
  • (四十三)c#Winform自定义控件-Listview

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    冰封一夏
  • Android技能树 — 时间相关总体小结

    发现很多开发人员做在时间相关的问题的时候,各有各的方法,然后对时间相关的处理,各种Java自带的时间相关类的知识面都不是很清楚,有时候看见他们在开发时候,都是一...

    青蛙要fly
  • Flutter 更新&升级

    https://flutter-io.cn/posts/announcing-flutter-1-7-9.html

    林小帅

扫码关注云+社区

领取腾讯云代金券