猿人学第12题——js加密入门教学

7 篇文章 2 订阅
3 篇文章 0 订阅

一、js逆向简介

我们都知道,作为一个爬虫程序员来说,我们就是要有抓取各种网站公开数据的实力和能力,然而,随着网站数据的自我安全保护,大部分网站就开始在前端JS代码上做出相对的反爬措施。到目前为止,对于JS代码的安全保护方式有很多种。几年前,小网站大部分还都是静态为主,中型网站会掺杂少量的原生加密,大网站也只是在原生加密上做一些变种,加密的代码不是没有,不过也都是一些变量的加密(常规的一些加密算法:MD系列、AES系列、3DES系列、RSA系列等等)。但是这些简单的JS保护很难保持网站的安全性,于是前端开发者借助H5的崛起,开发了很多工具用来进行语法转换,浏览器兼容,而这些工具大部分都是AST的产物。直到现在 ,js攻防成为了目前市场的一大看点。那么,现在的爬虫程序员就不只是说会一些xpath等简单的爬虫就行了,掌握js逆向本领也是势在必行

二、教学实战(基础篇)

那么我们今天就以猿人学第12题的入门级别的js加密搞起。

点击翻页,可以看到数据就在请求接口里面

然后查看接口信息,就会发现两个动态请求参数,分别是page和m

当然,page我们可以直接循环请求时生成,但是m的话,给我们第一感觉就是做了加密或者编码处理。那么到底是什么加密方式或者是什么编码方式,需要我们做进一步分析

我们先全局搜索一下参数m或者m:,我们会发现会搜出来好多,毕竟该加密参数只是一个字母

所以我们采用启动器启动进入js文件,我们点击如下。可以清晰地看出来数据响应的大概堆栈结构顺序,那么这么多的栈,我们要点哪个呢?首先,我们知道jquery是属于js官方的一个包,网站也很少会在这里面做修改,所以我们可以先排除这些栈,那么就剩以12开头的栈了,也就是说这几个栈都是在12.js这一个js文件中的。所以,我们点击request,可以直接跳到最后请求时的数据结果

利用启动器启动的方式,我们进到了加密的js文件中,如图。我们在733行打上断点,并点击翻页,就会在最终请求接口前停下来,那么我们就可以看到他所请求时的参数值page和m,如图

可以很清楚的看出来,page参数就是你要加载的页数,而m参数则是经过了一个btoa方法生成。并且m进行btoa前的原值是'yuanrenxue'和page页数两个字符串的拼接值。那么,我们就把该网站的参数加密过程做好了分析,接下来 ,我们就需要模仿网站加载参数的形式去生成加密参数,并且发起请求和响应数据结果

我们知道,js中的btoa方法也就是python中的base64编码,那么,以下实现程序如下

'''
@author:fjm
@date:2022.8.14
@main:js加密参数练习
'''

import requests
import base64


def btoa(text):
    return base64.b64encode(text.encode('utf-8')).decode('utf-8').replace("=", "%3D")


def myspider(pages):
    total_count = 0
    for page in range(1, pages+1):
        text = "yuanrenxue" + str(page)
        btoa_str = btoa(text)
        print(f"第{str(page)}页的m值为{btoa_str}")
        # 请求
        headers = {
            'User-Agent': 'yuanrenxue.project',
        }
        cookies = {
            'sessionid': 'lnhlwq35v5bgtcjvk6stu98ku9e5g0bo',
        }
        url = f"https://match.yuanrenxue.com/api/match/12?page={str(page)}&m={btoa_str}"
        response = requests.get(url, cookies=cookies, headers=headers)
        print(response.text)
        # 解析
        res_json_list = response.json().get('data', '')
        if res_json_list == '': continue
        per_page_count = 0
        for item in res_json_list:
            value0 = item.get('value', '')
            value = 0 if value0 == '' else int(value0)
            per_page_count += value
        print(f"第{page}页的和为:{per_page_count}")
        total_count += per_page_count
    return total_count


if __name__ == "__main__":
    total_count = myspider(5)
    print(f"五页数字总和为:{total_count}")

请求结果如下

那么,这道入门的js加密就被我们轻松攻克了,接下来,就是我们的js加密的进阶练习,想要学习更多的python爬虫和js逆向的相关技巧和知识的小伙伴们一定要点下关注哟,后期会不定时分享相关干货内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crazy ProMonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值