js逆向爬虫实战(2)--快手第三方平台之加密参数

爬虫js逆向系列
我会把做爬虫过程中,遇到的所有js逆向的问题分类展示出来,以现象,解决思路,以及代码实现。我觉得做技术分享,不仅仅是要记录问题,解决办法,更重要的是要提供解决问题的思路。怎么突破的,遇到这个问题怎么思考,尝试的方法有哪些。这样就可以有的放矢。希望对大家有用

爬虫认知
在程序猿所有的方向中,爬虫是离money最近的一个方向,你的明白?而且爬虫可发展的方向很多,前可走大数据,人工智能,后可转后端,还有就是安全领域。而且爬虫做得好,要求的技术栈还是比较全面的。如果你对爬虫有兴趣,欢迎加V:13809090874,一起沟通交流

免责申明
此内容仅供学习交流使用,不用于商业用途,如果涉及侵权,联系作者删除

此专栏系列主要写一些js逆向爬虫的实战:

  1. 抖音第三方数据分析平台爬虫心路历程(done)
    1.1 爬虫js逆向之无限debugger–抖音第三方数据分析平台的坑
    1.2 爬虫js逆向之加密参数破解–抖音第三方数据分析平台的坑
  2. 快手第三数据分析平台爬虫爬虫心路历程(done)
    2.1 js逆向爬虫实战(2)–快手第三方数据分析平台的请求解析
    2.2 js逆向爬虫实战(2)–快手第三方平台之加密参数
    2.3js逆向爬虫实战(2)–快手第三方平台之获取登录cookies
  3. 淘宝
  4. 拼多多
  5. 知乎
  6. B站
  7. 微博
  8. 小红书
  9. 美团
  10. 携程

js逆向爬虫实战(2)–快手第三方平台之加密参数与登录破解

上次写了新快的请求分析(http2.0)的解决办法,一直在想把js参数破解与登录破解的问题写了,不过呢,最近应公司需求做了一个window一个桌面版软件的破解,一个exe程序,搞的我有点头大。破解没解决,最后用自动化工具解决了。好了,咱们言归正传,说说快手第三方数据分析平台–新快的加密参数破解和自动登录问题

新快的加密参数:xyz与nonce

为什么是这两个参数,可以参考上一篇文章js逆向爬虫实战(2)–快手第三方数据分析平台的请求解析
下面我们的主要目的,是要获取xyz与nonce的加密过程。OK,咱们走起。

1. 找一个有效的请求

在这里插入图片描述
大家可以看到我所圈住的请求,每条请求都会带有“xyz”与“nonce”这两个参数,而且也都是变量。右边的则是该请求的响应结果。

2. 搜索大法

在我们不知道这个网站是否对js代码混淆的时候,我们第一步一定是去搜“xyz”与“nonce”这两个参数,看看能不能搜到。
在这里告诉大家一个小技巧,不要在chrome里搜,因为chrome只能搜单文件,无法进行全局搜索。在charles里搜或者在fiddler里搜。
在这里插入图片描述
我是用charles的,我们在搜索框中输入“xyz”,然后下面出来一堆的结果。我们细细去看。第2部分,其实是我们的请求头中的url中所带的“xyz”参数,对我们是没用的。我们主要找的是js文件,也就是第3部分。
在第3部分中有两个文件:main.8bxxxx.chunk.js与async~…js这两个文件。我们看文件名,async是异步的意思,而main,大家对这个应该非常熟悉吧,主要的文件。异步的那个我们暂时不看,先看看main这个文件。
此时我们要移步chrome,找到该js文件,(main.js文件的路径也在上图)
在这里插入图片描述
根据上图所描述的顺序,找到main.js的文件,格式化一下,然后搜索“xyz”,我们就找到“xyz”所在的位置了。目前还遇到js混淆,还算幸运。是说他们弱呢,还是我们强,哈哈哈。

3. 分析js

我们仔细去看一下上图所显示的js代码,我们可以基本确定两个加密参数“xyz”与“nonce”就是在这里封装的。当然,我们不确定的话,可以在这里打个断点,刷新一下页面,就可以看出的确是这这里(这一步我自己做过了,就略过了)。
到这里,我们找到了加密参数最顶层的封装结果的地方了,下面我们要做的就是往下逆向,看这两个“xyz”,“nonce”是怎么生成的吧。不然我们没办法模拟它,对吧。

return "post" === e.method.toLowerCase() ? (e.params = function(e, t={}) {
                let a = "".concat(e, "?AppKey=joker")
                  , r = {
                    xyz: "",
                    nonce: ""
                };
                const n = i()(p, 9).join("");
                return a += "&nonce=".concat(n),#nonce生成的地方
                r.nonce = n,
                r.xyz = u()(a),#xyz生成地方
                r
            }("".concat(e.baseURL).concat(e.url), t),
            e) : e

4. 逆向js

我们可以看出xyz的生成是依赖与nonce的,那我们就先找nonce这个参数,从上面的js代码中,我们可以看出nonce就是等于“n”:

n = i()(p, 9).join("");

跟紧了,开始开车了啊!!!!
我们就是找i()这个方法了。这里就得打断点一点点往里面找了。这也是它开始混淆的地方。
在这里插入图片描述
我们第一步断点调试,进入i()方法里,然后通过控制台输出的形式,我们可以吧上面的混淆的js代码:

e.exports = function(e, t, n) {
        return t = (n ? a(e, t, n) : void 0 === t) ? 1 : u(t),
        (o(e) ? r : i)(e, t)
    }

简化为:

e.exports = function(e, t, n) {
        return u(t),r(e, t)
    }

这里有两个方法u(t),r(e,t)

1.1 第二步深入–u(t)

在这里插入图片描述
不废话,再深入r(e)

1.2 第二步深入–u(t) -->r(e)

在这里插入图片描述

1.3 第二步深入–u(t) -->r(e)–>r(e)

在这里插入图片描述

1.4 第二步深入–u(t) -->r(e)–>r(e)–>r(e),到底

在这里插入图片描述
到了这里,就已经到了这个nonce()请求参数的底部了。e = 9,是一个“number”类型,所以就可以直接“return”了。这个js经过四层的调用,我们找到了最底部。
接下来我们要做的,不是说把完全去读它的js,完全消化理解,然后复现它,这样做我们会很蛋疼的。这里只是4层调用,要是10几层,几十层,那岂不是要疯了。
我们要做的就是,完全拷贝它的js,到我们自己的js文件中,hook住这个方法就是。一个原则“缺啥补啥”

至此,我们就找到nonce参数的实现过程,同理‘xyz’参数寻找过程也是如此,就不啰嗦了,主要是贴图说,打字说这个过程实战太烦。以后找个机会录个视频,三五句话就能说明白的事情

上代码,python

我们找到参数的模拟过程了,然后就是把相关的js代码模拟出来。这就是参数破解的全过程了。(代码我只能截图,不开源,因为我们毕竟是做爬虫的,逆向的代码开源,我怕人家打我
nonce.js
在这里插入图片描述
xyz.js
在这里插入图片描述
xyz的破解比较长,有200多行js,没贴全,(如果你需要破解代码研究学习,可以VX我

python的代码可以公开,如下

import requests
import os
import execjs
import redis

redis_cli = redis.StrictRedis(host='127.0.0.1',port=6379,db=5,decode_responses=True)
def xyz(url):
    js = execjs.compile(open(r"./xyz.js").read())
    res = js.call('xyz',url)
    return res

def nonce():
    js = execjs.compile(open(r"./nonce.js").read())
    return js.call('nonce')
def all_rank_list():
    cookies = redis_cli.lrange('ksxk_cookies',0,-1)[0]
    print(cookies)
    header = {'Content-Type': 'application/json;charset=UTF-8', 'pragma': 'no-cache', 'cache-control': 'no-cache', 'accept': 'application/json, text/plain, */*',
              'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36', 'origin': 'https://xk.newrank.cn',
              'sec-fetch-site': 'same-origin', 'sec-fetch-mode': 'cors', 'sec-fetch-dest': 'empty', 'referer': 'https://xk.newrank.cn/data/account/rank/overall',
              'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'Connection': 'close', 'Content-Length': '101',
            'Cookie':cookies}
    url = 'https://xk.newrank.cn/xdnphb/nr/cloud/ks/rank/accountAllRankList'
    nonce_ = nonce()
    url_ = url + '?AppKey=joker&nonce={}'.format(nonce_)
    xyz_ = xyz(url_)
    url_params = {
        'xyz':xyz_,
        'nonce':nonce_
    }
    url = '{}?{}={}&{}={}'.format(url,'xyz',url_params['xyz'],'nonce',url_params['nonce'])
    post_params ={"type":"搞笑","rankDate":"2020-10-07","start":1,"size":20,"rankType":"realTime","sort":"newrankIndex"}
    r = requests.post(url, json=post_params, headers=header,verify=False)
    print(r.text)

在这里插入图片描述
请求参数的破解就已经完成了,哈哈哈哈哈哈,还有谁!!(不能跳,得低调点)
当然这对于爬虫的前期工作来说只是完成了一半,还有个什么问题啊,朋友们。还有登录的问题,也就是cookies的问题。没有cookies,一切都是白搭

登录问题,待会写。主要是通过selenium自动登录,因为还有滑块的问题。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页