前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >破解某单机游戏到学习fiddler脚本改包

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

原创
作者头像
Deen_
发布2019-09-21 23:43:47
3.8K0
发布2019-09-21 23:43:47
举报
文章被收录于专栏:Deen的代金券日记

写在前面

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

像我这种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修改返回包
autoresponder修改返回包
  1. 通过Automatic Breakpoints进行改包,点击rules,再选择断点方式
image.png
image.png

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

image.png
image.png

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

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

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

image.png
image.png

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

image.png
image.png

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

代码语言:txt
复制
if (oSession.HostnameIs("www.baidu.com")){

        oSession.utilSetResponseBody('baidu');

    }

        
image.png
image.png
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.

代码如下:

代码语言:txt
复制
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

成果
成果

思考

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 开搞
    • 请求分析
      • 发现漏洞
      • 自动化实现
        • 碰到的问题
          • fiddler改包
            • 实现不断递增返回时间戳达到破解效果
              • 自动刷钱
              • 思考
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档