Python爬虫之Js逆向案例(3)-X品牌手机社区

2023-11-14

声明:XX手机社区加密逆向分析仅用于研究和学习

这篇文章的学习内容是以XX手机社区为案例,对JS逆向的整个过程进行详细分析

下面会进行以下几步进行分析(下方演示过程全部使用chrome浏览器);

  1. 锁定关键接口;
  2. 锁定关键字段;
  3. 破解关键字段;
  4. python爬虫结果演示;

一.锁定关键接口

进入社区,随便操作一下即可锁定查询接口,如下图:
在这里插入图片描述

二.锁定关键字段;

我们多请求几次,对比一下请求数据,找到可疑的加密参数,发现请求头里没有变化的参数,请求参数里有一个字段nonce每次都不一样,那应该就是这个字段了,下面老规矩,我们搜索这个字段,看看它是如何加密的(根据之前总结的经验,有没有能猜出来这个像哪种加密的数据?)
在这里插入图片描述

搜索一下,发现两个地方出现该字段,而且都是在做赋值操作,排除不掉无用的,那就都打上端点,以防打其中一个地方不对还需要回来重新打,如下图:
在这里插入图片描述

有没有发现里面写明了md5。。。

三.破解关键字段

先来分析一下都是由哪些数据加密出来的:
nonce = Object(u["md5"])(t + "" + parseInt(1e7 * Math.random(), 10) + 1, 32)

通过调试发现,t就是一个时间戳,再加上一个随机数,然后再通过md5加密,而且指定了32位;似乎所有难度都在函数u上、、、,如果是没有基础的同学,也可以不管这里的加密函数是啥,直接扣出u["md5"]的代码即可,下面再演示一下如何扣代码:

既然u是一个加密函数,我们在这个函数执行的时候打个端点,比如在(t+""的前面有个➡️,把这个端点点亮,我们单步调试时可直接进入这个函数,如下图:

在这里插入图片描述

扣代码的时候只需要把这个函数所在的父作用域的代码全部扣出来,稍微改写即可,如果能看出来这里是md5的加密源码,也可以不用扣,直接使用md5加密库;

直接贴爬虫代码吧:


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @File     : __init__.py.py
# @Desc     : 作者的所有代码均属于学习使用,不可商用或用在非法用途上。

import requests
import random
import execjs
import json

import time

url = 'https://bbs.vivo.com.cn/api/community/index'
headers = {
    'content-type': 'application/json;charset=UTF-8',
}


def get_timestamp():
    timestamp = int(time.time() * 1000)  # 获取13位时间戳
    return timestamp


def get_tamp_str():
    num = int(float(str(random.random() * 10000000)[:10]))  # 获取随机数
    str_ = str(get_timestamp()) + str(num) + '1'  # 获取21位随机数
    return str_


def get_cxt():
    # md5.js 扣出来的md5代码,放在这个文件的一个目录即可
    with open("md5.js", 'r') as file:  # 打开js文件
        cxt = execjs.compile(file.read())  # 导入js文件
        return cxt


def get_nonce():
    nonce = get_cxt().call('md5', get_tamp_str(), 32)  # 调用js文件md5函数加密,获取nonce
    return nonce


def get_data():
    data = {
        'imgSpecs': ["t577x324", "t577x4096"],
        'lastId': "",
        'nonce': get_nonce(),
        'pageNum': '1',
        'pageSize': '10',
        'timestamp': get_timestamp(),
    }
    return data

def main():
    res = requests.post(url, headers=headers,
                        data=json.dumps(get_data())).text
    tempRes = json.loads(res)['data']['list']
    list = []
    for data in tempRes:
        bbsname = data.get('author').get('bbsName')
        name = data.get('forum').get('name')
        summary = data.get('summary')
        tid = data.get('tid')
        title = data.get('title')
        list.append({
            'title': title,
            'bbsname': bbsname,
            'name': name,
            'summary': summary,
            'tid': tid
        })
    return list


if __name__ == '__main__':
    print(main())

四.python爬虫结果演示

在这里插入图片描述

总结:

  1. 请求头的参数原接口中有很多,但实际有用的只有一个,如何快速确定哪些有用?可以使用curl的方式快速确定有用参数;

后期会持续分享爬虫案例-100例,有兴趣的同学可加入我的知识星球,有更多技巧、高能总结等你哦!!!;

欢迎加入「python、爬虫、逆向Club」知识星球

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫之Js逆向案例(3)-X品牌手机社区 的相关文章

随机推荐

  • CentOS7平台命令安装Anaconda3、配置Python3开发环境

    要在 CentOS 7 上安装 Anaconda3 您可以按照以下步骤进行操作 1 下载 Anaconda3 安装包 首先 访问 Anaconda 官方网站以获取最新版本的 Anaconda3 安装包的下载链接 可以使用 wget 命令来下
  • 【数据库原理及应用教程(第4版

    文章目录 一 选择题 二 填空题 三 简答题 Reference 一 选择题 1 2 3 4 5 6 7 8 9 10 B C B D A 1 在 SQL Server 中不是对象的是 A 用户 B 数据 C 表 D 数据类型 2 声明了变
  • studio和solo哪个好_beats studio3 和solo3的区别再哪里?

    首先两款机子在外观上就有很大的区别 前者是solo3 后者是studio3 仔细观察可以发现solo3的耳罩比较小 是圆形的 studio3的是椭圆形的 两款都是头戴式 外观设计 录音师是包耳的 SOLO是压耳的 体积的话 录音师大 SOL
  • async与await

    async await 是ES7提出的基于Promise的解决异步的最终方案 一 async async是一个加在函数前的修饰符 被async定义的函数会默认返回一个Promise对象resolve的值 因此对async函数可以直接then
  • UI 自动化测试框架:PO 模式+数据驱动 【详解版】

    目录 1 PO 设计模式简介 什么是 PO 模式 PO 模式的优点 2 工程结构简介 工程结构 框架特点 3 工程代码示例 page 包 action 包 business process 包 util 包 conf 包 1 PO 设计模式
  • 基于Centos 7虚拟机的磁盘操作(添加磁盘、分区、格式分区、挂载)

    目录 一 添加硬盘 二 查看新磁盘 三 磁盘分区 3 1新建分区 3 2 格式分区 3 3 挂载分区 3 4 永久挂载新分区 3 5 取消挂载分区 一 添加硬盘 1 在虚拟机处选择编辑虚拟机设置 然后选择添加 2 选择硬盘 然后选择下一步
  • 敏捷宣言以及敏捷开发的特点

    敏捷宣言 敏捷宣言 也叫做敏捷软件开发宣言 正式宣布了对四种核心价值和十二条原则 可以指导迭代的以人为中心的软件开发方法 敏捷宣言强调的敏捷软件开发的四个核心价值是 个体和互动高于流程和工具 工作的软件高于详尽的文档 客户合作高于合同谈判
  • Go_流程、跳转控制语详解

    流程控制语句分类 流程控制语句可以控制代码的执行顺序和条件 顺序结构 普通的代码 由上而下依次执行 分支结构 if switch 循环结构 for if语句 条件表达式值必须是bool类型 不可省略括号 且左大括号不能另起一行 格式1 if
  • AI绘图Midjourney手把手教程

    以下是使用Midjourney AI绘画程序的注册和入门指南 Midjourney是一款功能强大的绘图软件 通过输入一段图片的文字描述即可生成精美的绘画 我们将为您提供详细的操作步骤 让您轻松上手 下面是使用Midjourney AI绘画程
  • Android绘制笔记——Color、Shader

    Android 颜色Color 1 颜色 1 十六进制ARGB颜色值表示 Int color 0xFFFF0000 红色 2 Color类常量 本质为十六进制表示 Int color Color RED 红色 ColorInt public
  • ffmpeg-android dlopen failed: library “libclang_rt.ubsan_standalone-aarch64-android.so“ not found

    NDK编译的ffmpeg 库 在android上使用 提示动态库错误 15 08 54 276 18357 18357 E AndroidRuntime java lang UnsatisfiedLinkError dlopen faile
  • 报时机器人的rasa shell执行流程分析

    本文以报时机器人为载体 介绍了报时机器人的对话能力范围 配置文件功能和训练和运行命令 重点介绍了rasa shell命令启动后的程序执行过程 一 报时机器人项目结构 1 对话能力范围 1 能够识别欢迎语意图 greet 和拜拜意图 good
  • Linux 或者 Docker 容器通过 date 设置系统时间

    目录 1 Linux 2 Docker 容器 2 1 进入容器内部修改 2 2 可能会遇到的问题 1 Linux 要在Linux系统中设置日期和时间 可以使用date命令 使用以下命令格式来设置日期和时间 sudo date s YYYY
  • kubernetes二进制单节点和多节点部署(多节点+dashbord)

    kubernetes二进制单节点和多节点部署 多节点 dashbord kubernetes单节点部署 环境准备 在 master01 节点上操作 上传 master zip 和 k8s cert sh 到 opt k8s 目录中 解压 m
  • YOLOv5 Focus C3 各模块详解及代码实现

    目录 yolov5s yaml yolov5s yaml基本参数含义 一些基本参数 BackBone Head Focus 一 Focus模块的作用 Focus的参数量 Yolov3和Yolov5的改进对比 关于Focus的补充 网络结构图
  • 轻量级人像分割深度学习模型PP-HumanSeg树莓派部署

    人像分割是图像分割领域的高频应用 PaddleSeg推出在大规模人像数据上训练的人像分割系列模型PP HumanSeg 包括超轻量级模型PP HumanSeg Lite 满足在服务端 移动端 Web端多种使用场景的需求 本项目将PP Hum
  • Ceph分布式存储详解

    一 Ceph概述 1 存储发展史 企业中使用存储按照其功能 使用场景 一直在持续发展和迭代 大体上可以分为四个阶段 DAS Direct Attached Storage 即直连存储 第一代存储系统 通过SCSI总线扩展至一个外部的存储 磁
  • ChatGPT泄露用户聊天记录标题;Adobe加入AIGC战局;阿里大模型前带头人杨红霞加盟字节跳动丨每日大事件...

    数据智能产业创新服务媒体 聚焦数智 改变商业 企业动态 诸葛智能推出 诸葛CDP 2 0 等三大产品升级 3月22日 容联云旗下场景化数据智能服务商 诸葛智能 举办2023春季发布会 推出客户数据管理平台 诸葛CDP 2 0 一站式用户行为
  • freemarker动态生成word和pdf

    1 使用freemarker生成word freemarker生成word的方法网上有很多 比较简单 基本上都差不多 所需工具 freemarker
  • Python爬虫之Js逆向案例(3)-X品牌手机社区

    声明 XX手机社区加密逆向分析仅用于研究和学习 这篇文章的学习内容是以XX手机社区为案例 对JS逆向的整个过程进行详细分析 下面会进行以下几步进行分析 下方演示过程全部使用chrome浏览器 锁定关键接口 锁定关键字段 破解关键字段 pyt