抓包获取冲顶大会/百万赢家题目 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vanpersiexp
V2EX    分享发现

抓包获取冲顶大会/百万赢家题目

  •  
  •   vanpersiexp 2018-01-26 12:35:36 +08:00 6036 次点击
    这是一个创建于 2893 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前看到有朋友抓包冲顶大会的分享,还没看到就被删了,后来一直忙也没空研究,这两天好研究了一下,分享出来。

    原理就是利用代理,然后将符合特征的包保存下来,然后本地再搜答案就行了。

    测试环境:Kali Linux

    用的代理是 mitmdump,好处是可以使用 Python3 写的 inline 脚本。

    mitmproxy 官方文档

    mitmproxy 的 git 地址

    冲顶大会题目是用 websocket 包推送过来的,所以 inline 脚本中只需要去把 websocket 包写入到文件中就好了。

    #冲顶大会 def websocket_message(flow): try: data=flow.messages[-1].content.decode('utf-8') with open('/tmp/raw_data.txt','a') as f: f.write(data+'\n') except Exception: pass 

    题目的格式: 42["showQuestion",{"answerTime":10,"desc":"12. 茅盾一生中现已获得证实的笔名有多少个?","displayOrder":11,"liveId":161,"options":"["32","128","98"]","questionId":1881,"showTime":16910048815676,"status":0,"type":"showQuestion"}]

    百万赢家(花椒直播的)推送的是 https (还是 http,我忘记了,反正不影响抓包)

    #百万赢家 def response(flow): try: data=flow.response.content.decode('utf-8') if 'Zepto' in data: print(data) with open('/tmp/raw_data.txt','a') as f: f.write(data+'\n') except Exception: pass 

    所以将以上两个保存成get_question.py文件,然后运行代理

    mitmdump -s get_question.py 

    手机(我用的安卓)提前安装好证书,证书在默认文件夹.mitmproxy/中,名称是mitmproxy-ca-cert.cer

    手动设置代理为电脑的 ip 地址,比如:192.168.1.100,端口默认的为:8080

    这个时候就能开始抓包了。

    冲顶大会抓下来的包如下,删掉了一些没用的,其实也可以过滤,冲顶大会的问题和答案就推送一次:

    42["showQuestion",{"answerTime":10,"desc":"1.我们把自己动手制作这个过程称为?","displayOrder":0,"liveId":159,"options":"[\"DIN\",\"DIY\",\"DIM\"]","questionId":1846,"showTime":16910033865640,"status":0,"type":"showQuestion"}] 42["totalLive",{"showTime":16910033870867,"count":530446}] 42["totalLive",{"showTime":16910033909864,"count":558373}] 42["showAnswer",{"answerTime":10,"correctOption":1,"desc":"1.我们把自己动手制作这个过程称为?","displayOrder":0,"liveId":159,"options":"[\"DIN\",\"DIY\",\"DIM\"]","questionId":1846,"showTime":16910033907129,"stats":[8650,388770,5037],"status":2,"type":"showAnswer"}] 

    百万赢家抓下来的包如下,含有 Zepto 这个标志,不过百万赢家的题目和答案都是一直推一直推,题目和答案的区别就在 show_answer:false 和 show_answer:1:

    #题目 Zepto1516890772573({"errno":0,"errmsg":"操作成功","consume":0,"time":1516891076,"md5":"","data":{"callfreq":5,"key":"197908302","msg":{"answer":{"doing":{"counter":2506,"doing":{"answer":{"A":{"option":"A","value":"陪姐妹一起上厕所"},"B":{"option":"B","value":"姐妹合照只 P 自己"},"C":{"option":"C","value":"为姐妹出谋划策"}},"expire":1516891090,"from":{"avatar":"http://image.huajiao.com/3bf9d9cccf4c642d50d49c52e2b2c105.jpg","brand":"","location":"宇宙专业出题小组","nickname":"百万赢家-官方"},"groupid":620,"is_renew":1,"number":1,"show_answer":false,"shuffle":0,"team_period":"20313","title":"以下哪种行为被称为“塑料花姐妹情”?","type":0},"join_count":0,"version":"c3834e49c0f7f60700e5674420905c6d"},"liveid":"197908302","sync":"answer","version":2506}},"time":1516891076}}) #答案 Zepto1516890772592({"errno":0,"errmsg":"操作成功","consume":0,"time":1516891146,"md5":"","data":{"callfreq":5,"key":"197908302","msg":{"answer":{"doing":{"average":"1.07","counter":2507,"doing":{"answer":{"A":{"option":"A","value":"陪姐妹一起上厕所"},"B":{"option":"B","value":"姐妹合照只 P 自己"},"C":{"option":"C","value":"为姐妹出谋划策"}},"correct":"B","expire":1516891124,"from":{"avatar":"http://image.huajiao.com/3bf9d9cccf4c642d50d49c52e2b2c105.jpg","brand":"","location":"宇宙专业出题小组","nickname":"百万赢家-官方"},"groupid":620,"is_renew":1,"number":1,"show_answer":1,"shuffle":0,"team_period":"20313","title":"以下哪种行为被称为“塑料花姐妹情”?","type":0},"join_count":3917617,"record":{"A":74567,"B":3747207,"C":95103,"Z":740},"renew_count":306333,"version":"f74e008b74be3b1221035d64b4a1f030"},"liveid":"197908302","sync":"answer","version":2507}},"time":1516891146}}) 

    基本上抓包过了以后,后面的就是常规套路了:

    def main(): brand_2_old='' for raw in tailer.follow(open('/tmp/raw_data.txt','r')): if args.brand == 1: if 'showQuestion' in raw: game=GetAnswer(args.brand,raw) game.run() elif args.brand == 2: try: raw=raw.split('(')[-1].split(')')[0] raw_json=json.loads(raw) raw_question=raw_json['data']['msg']['answer']['doing']['doing']['title'] raw_question_showanswer=raw_json['data']['msg']['answer']['doing']['doing']['show_answer'] if not raw_question_showanswer: if raw_question != brand_2_old: game=GetAnswer(args.brand,raw_json) game.run() brand_2_old = raw_question except Exception as e: continue else: print("python3 search_question -h") print("请查看帮助文档,目前仅支持两个 APP 的抓包获取题目。") sys.exit(1) 

    昨天测试了下冲顶大会,结果如图: cd

    刚才测试了下百万赢家,结果如图: bw


    详细的代码在我的 github 上:抓包获取冲顶大会 /百万赢家题目并搜索答案https://github.com/vanpersiexp/chongding

    写这个纯粹为了好玩,没打算靠答题赚钱,因为主持人废话实在太多,浪费时间。

    主要我看 github 上基本上都是图像识别的,所以就当提供另一种思路了。

    希望厂家看到后,也可以改进一下。

    直接抓包没有之前说的提前 10s 那么邪呼,可能我的程序比较慢吧,但基本上还是比 app 中出现的快一丢丢。

    第 1 条附言    2018-01-26 17:16:59 +08:00

    刚才5点场冲顶大会,抓到的websocket包是这样的。

    websocket

    18 条回复    2018-02-05 19:34:30 +08:00
    7654
        1
    7654  
       2018-01-26 12:44:38 +08:00
    。。。
    vanpersiexp
        2
    vanpersiexp  
    OP
       2018-01-26 13:18:51 +08:00 via iPhone
    刚才冲顶大会测试了下,基本上比 app 早两到三秒显示题目和答案吧
    chenyoufu123
        3
    chenyoufu123  
       2018-01-26 16:34:41 +08:00
    刚出来的时候在 mac 上用 charles 抓包测试过,没看到有题目描述啊,难道是我使用的方式不对?
    ctsed
        4
    ctsed  
       2018-01-26 16:40:41 +08:00 via Android
    @vanpersiexp 显示答案的时候已经过了答题时间吧?
    vanpersiexp
        5
    vanpersiexp  
    OP
       2018-01-26 16:48:45 +08:00
    @ctsed 我说的显示答案是搜索结果的答案:P
    vanpersiexp
        6
    vanpersiexp  
    OP
       2018-01-26 16:49:50 +08:00
    @chenyoufu123 我之前先用 BurpSuite 抓的,冲顶大会是 websocket 包,数据长度大概 250 左右的就是问题和答案
    qnxu
        7
    qnxu  
       2018-01-26 17:22:47 +08:00
    厉害了
    pheyer
        8
    pheyer  
       2018-01-26 17:54:42 +08:00
    @vanpersiexp 我搜了一下,好像 BurpSuite 不好处理 websocket 包吧,虽然也有插件支持,但插件不支持 websocket 好像
    vanpersiexp
        9
    vanpersiexp  
    OP
       2018-01-26 17:59:54 +08:00
    @pheyer 我最开始用 Burp 看的,我也没想出来怎么从 Burp 中导出 websocket 包,但 mitmdump 用 inline 脚本可以截取想要的 websocket,所以我用的是 mitmdump
    ahjsrhj
        10
    ahjsrhj  
       2018-01-27 09:42:07 +08:00
    前段时间解包 Android 版冲顶大会看过代码,地址啥的都是明文用 SP 存的,而且 socket 接口没验证,直接读到 url 自己写 socket 连接上去就有题目。感觉安全性做的很 low
    nonoezone
        11
    nonoezone  
       2018-01-29 12:04:39 +08:00
    楼主有没有试过西瓜视频的?西瓜的好像不好弄。
    vanpersiexp
        12
    vanpersiexp  
    OP
       2018-01-29 17:13:47 +08:00 via iPhone
    @nonoezone 给你提供个思路,下载 app 简单搜索,在里边搜 dan 哥答题,你可以抓他的包,我周六试过了,所有的答题类 app 都能抓到,而且 dan 哥答题的准确率还行,所以只要把 dan 哥的题抓下来然后再调用 selenium 直接百度看网页,跟 dan 哥答案对比,正确率要更高。而且抓 dan 哥的题目一样比正常早出现个 2-3s。
    我周六晚上试了一次,总共五次通关,冲顶一次,西瓜两次,好看视频两次,哈哈。
    缺点就是两部手机,一部开着简单搜索抓包,另一部答题。
    cjy9492
        13
    cjy9492  
       2018-01-29 17:27:28 +08:00
    @vanpersiexp 能否提供下蛋哥答题的协议格式,我抓了好几次就是没抓到 dan 哥答题的包
    vanpersiexp
        14
    vanpersiexp  
    OP
       2018-01-29 18:37:31 +08:00
    @cjy9492 蛋哥的格式如下面,证书没问题的话抓起来不费劲,处理成 json 就行。区分主要在于 step 的值。

    41:42/nv/huajiao/answer,["greet","欢迎使用简单答题"]258:42/nv/huajiao/answer,["answer",{"app":"huajiao","question":{"text":"氨基酸态氮是哪种调味主要成分,也决定了品质的好坏?","url":"","questionId":10},"answers":[{"text":"料酒","url":"","prop":0},{"text":"酱油","url":"","prop":0},{"text":"蚝油","url":"","prop":0}],"sn":10,"step":0,"status":0}]

    283:42/nv/huajiao/answer,["answer",{"app":"huajiao","question":{"text":"氨基酸态氮是哪种调味主要成分,也决定了品质的好坏?","url":"","questionId":10},"answers":[{"text":"料酒","url":"","prop":7},{"text":"酱油","url":"","prop":85},{"text":"蚝油","url":"","prop":7}],"sn":10,"tips":"我在思考,答案 B 好像有可能?","step":1,"status":0}]


    289:42/nv/huajiao/answer,["answer",{"app":"huajiao","question":{"text":"氨基酸态氮是哪种调味主要成分,也决定了品质的好坏?","url":"","questionId":10},"answers":[{"text":"料酒","url":"","prop":7},{"text":"酱油","url":"","prop":85},{"text":"蚝油","url":"","prop":7}],"sn":10,"tips":"我选 B 吧,应该没错","step":2,"status":0,"result":1}]

    41:42/nv/huajiao/answer,["greet","欢迎使用简单答题"]289:42/nv/huajiao/answer,["answer",{"app":"huajiao","question":{"text":"氨基酸态氮是哪种调味主要成分,也决定了品质的好坏?","url":"","questionId":10},"answers":[{"text":"料酒","url":"","prop":7},{"text":"酱油","url":"","prop":85},{"text":"蚝油","url":"","prop":7}],"sn":10,"tips":"我选 B 吧,应该没错","step":2,"status":0,"result":1}]
    308:42/nv/huajiao/answer,["answer",{"app":"huajiao","question":{"text":"氨基酸态氮是哪种调味主要成分,也决定了品质的好坏?","url":"","questionId":10},"answers":[{"text":"料酒","url":"","prop":7},{"text":"酱油","url":"","prop":85},{"text":"蚝油","url":"","prop":7}],"sn":10,"tips":"聪明且帅气的我,答对啦!","step":3,"status":0,"result":1,"final_index":1}]
    nonoezone
        15
    nonoezone  
       2018-01-30 12:18:49 +08:00
    @vanpersiexp 好思路,找个时间试试,不过 dan 哥好像有时有问题。它自己有时会抽风,题目都识别不出来,这样子抓包会不会有问题?西瓜视频现在有个性题的吧,两部手机可能出现的题目都不一样。
    vanpersiexp
        16
    vanpersiexp  
    OP
       2018-01-30 13:49:32 +08:00
    @nonoezone 对,西瓜确实有个性题,这个没办法。dan 哥的数据包需要自己多抓几次,它的格式经常变动,但还是有规律的,然后处理成 json,偶尔出错,但基本上还行比较稳定。
    joanwe
        17
    joanwe  
       2018-02-05 15:06:37 +08:00
    @vanpersiexp 大佬请教下 Charles 能抓 iOS dan 哥的数据包嘛 自己尝试了下只抓到了 index.html
    vanpersiexp
        18
    vanpersiexp  
    OP
       2018-02-05 19:34:30 +08:00
    @joanwe 没测试过 iPhone 的 dan 哥,现在 dan 哥也改 websocket 包了,估计也抓不到。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2463 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 04:47 PVG 12:47 LAX 20:47 JFK 23:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86