前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS逆向之猪场某游

JS逆向之猪场某游

作者头像
老肥码码码
发布2020-01-17 15:12:28
8580
发布2020-01-17 15:12:28
举报
文章被收录于专栏:算法与数据之美

声明:本文仅供技术交流,切忌非法使用。

今天我们要抓取的是猪场某游收藏总榜的信息。

下图是收藏榜总榜的部分商品,一看这金额???果然是有钱人玩的游戏啊,到底是什么样的属性能让其价值连城?鼠标放到装备图标上,我们可以看到装备的详细信息,那么如何抓取下来呢?

我们从网页源代码中能清楚地看到价格的显示,根据英文猜测,具体的信息应该在这个"equip_desc"中,这一串字符串应该是加密之后的装备信息。

那么任务就是来解决这个加密的破解。根据equip_desc搜索相关信息

经过排查之后发现,decode_desc 这个名字翻译过来不就是“解密描述”吗?

看来解密的源头应该在这个js文件中,也就是util.js。我们打开这个js文件来进行分析。

打上断点之后发现这个decode_desc指的就是g函数

那么g函数是什么样的呢?

这个样子显然就是混淆加密了,把变量名、函数名、参数名给替换成诸如_0xcbc80b这样没有意义的表示,还利用了十六进制表示字母。

翻译成英文字母是不是看着顺眼多了呢?

从头逐步执行js代码,与此同时观察传入的值

具体的js也可以用python改写,但由于逻辑不够直观,可以利用execjs库执行js代码。

需要利用js调试工具WebStorm,改写部分js代码,可以把其用十六进制表示的字母转换过来,写成直观的函数。

比如

代码语言:javascript
复制
_0x36ab38['\x70\x75\x73\x68'](_0xcbc80b['\x53\x74\x72\x69\x6e\x67']['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0xcbc80b['\x70\x61\x72\x73\x65\x49\x6e\x74'](_0x1c0cdf[_0x33c80e], 0x2)));

可以写成

代码语言:javascript
复制
 _0x36ab38['\x70\x75\x73\x68'](String.fromCharCode(parseInt(_0x1c0cdf[_0x33c80e], 0x2)));

解决了js的问题,我们可以轻松的编写代码如下,利用简单的正则匹配提取加密后的内容,并利用js解密得到文字。

代码语言:javascript
复制
import requests
import re
import json
import execjs
from pymongo import MongoClient
import time

class CBG(object):
    
    def __init__(self):
        
        self.url='https://xyq.cbg.163.com/cgi-bin/equipquery.py?act=overall_rank&rank_type=31&page={}'
        self.headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
        self.conn=MongoClient('127.0.0.1', 27017)
        self.db=self.conn.MHXY
        
    def get_json(self,i):
        r=requests.get(self.url.format(i),headers=self.headers)
        js=re.findall(r"var data = (.*);",r.text)[0]
        js=json.loads(js)
        return js
    
    def decode(self,data):
        with open('test.js','r') as f:
            javascript=f.read()
        ctx=execjs.compile(javascript)
        real_content=ctx.call('get_g',data)
        return real_content
    
    def get_highlights(self,data):
        highlights=data.encode().decode("unicode_escape")
        return highlights
    
    def get_equip_info(self,i):
        js=self.get_json(i)
        equip_list=js["equip_list"]
        for equip in equip_list:
            gem_level=equip['gem_level']
            large_equip_desc=self.decode(equip['large_equip_desc'])
            sum_dex=equip['sum_dex']
            create_time=equip['create_time']
            collect_num=equip['collect_num']
            highlights=self.get_highlights(equip['highlights'])
            price=equip['price']
            rank=equip['rank']
            expire_time=equip['expire_time']
            server_name=equip['server_name']
            item={
            'gem_level':gem_level,
            'large_equip_desc':large_equip_desc,
            'sum_dex':sum_dex,
            'create_time':create_time,
            'collect_num':collect_num,
            'highlights':highlights,
            'price':price,
            'rank':rank,
            'expire_time':expire_time,
            'server_name':server_name
            }
            self.db['cbg'].insert_one(item)
                     
if __name__=='__main__':
    
    mhxycbg=CBG()
    for i in range(1,11):
        mhxycbg.get_equip_info(i)
        time.sleep(1)
        print("第{}页装备信息已存入数据库!".format(i))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与数据之美 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档