点点数据K参数加密逆向分析(RPC方案跟加密算法还原)

文章目录

  • 1. 写在前面
  • 2. 接口分析
  • 3. 断点分析
  • 4. RPC调用
  • 5. 算法还原

【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章

作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!

1. 写在前面

  最近有点小忙,又来到了周末,熬夜更一篇逆向技术文章!本期写的是之前做过的一个网站,一个类似七麦数据的APP聚合类平台,平台内榜单、搜索、评论、评分、下载量等接口在发送请求的时候需要携带一个加密参数K

往期同类文章回顾,感兴趣的可阅读:七麦analysis参数分析与Python算法实现

2. 接口分析

这个加密参数K的算法在所有的接口均是通用的,加密手法跟很多网站相似也不相似,相似的是API路径加请求参数参打包加密,不相似的是在此之外又增加了动态参数参与加密,这里我们以评论页面为例,开始分析,如下所示:

在这里插入图片描述

随意点击一个切换评论天数,触发请求,查看一下接口发包情况。可以看到就一个加密参数K值,其他字段的话都是固定的!其中id字段是APP应用的唯标识,也是密文!这里我没有去深入研究,按理说也是可以去分析找到生成算法的,当然非必要!应为在搜索的时候可以从上级接口中拿到每个APP对应的密文id,如下所示:

在这里插入图片描述

3. 断点分析

针对上面的加密参数,首先需要定位加密参数生成的位置,也是逆向分析的第一步!有多种定位的方式,其中包括XHR断点以及Hook,直接搜索加密之后的K,基本是无望,一搜一大堆。这里我们下一个XHR断点

在这里插入图片描述

触发断点后往前跟栈,可以看到JS文件没有一百也有大几十,都是Webpack,如下经过反复调试找到加密入口函数,如下所示:
在这里插入图片描述

h加密方法接受四个参数,e是请求提交的参数,path是接口的短路径,r是请求方法,n也是一串参数,不知道是哪里来的话,这里可以先不管。只需要知道它肯定也是参与了加密就行,可以在控制台看了一下明文信息,如下所示:

在这里插入图片描述

把之前的断点释放在加密方法内下个断,往下走可以看到最终加密参数生成的结果返回,我们可以在控制台打印验证一下,如下所示:

在这里插入图片描述
在这里插入图片描述

4. RPC调用

这里借着这个案例分别说说RPC跟扣加密加密代码还原的两种解决方案。找到了加密方法后,如果你不想再继续调试去扣加密代码的话,就可以上RPC了!RPC是什么?即远程调用,调用什么?调用最终的JS加密方法,我们可以不需要继续去了解这个方法下面的具体加密逻辑,因为就算我们扣下来了,可能还会面临环境问题

做爬虫JS逆向,不需要去深入了解RPC技术,只需要知道如何在逆向中巧妙运用即可!

直接注入ws服务,替换编辑后的JS文件,如下所示:

在这里插入图片描述

h加密方法最终的返回值就是密文K,在其内部直接编写一个自执行函数,接受加密所需参数,再调用加密方法生成K参数值,这里我们甚至不需要去分析参数n的来源

编写Python调用代码,并在本地启动后刷新网页,代码实现如下:

import asyncio
import websocketsasync def receive_message(websocket):try:while True:send_text = input("请输入要加密的字符串:")if send_text == "exit":print("退出!")await websocket.send(send_text)breakelse:await websocket.send(send_text)response_text = await websocket.recv()print("加密结果:", response_text)except Exception as e:print("发生异常:", e)finally:await websocket.close()async def main():async with websockets.connect('ws://127.0.0.1:8765') as websocket:await receive_message(websocket)asyncio.run(main())

可以看到ws服务接受到提交参数后,调用加密方法成功拿到加密结果,如下所示:

在这里插入图片描述

上面RPC的方案,在ws服务开启后可把Python调用稍微修改一下做成一个API服务提供远端调用,这样爬虫可以直接并发调用加密

5. 算法还原

上面说到的RPC方案虽然可以绕过加密的这个问题,但是性能肯定是不能跟算法相比。能还原算法的大部分是不会去使用RPC方案的,一般场景都在短期内无法快速还原加密算法的情况下,会采用RPC作为一个临时的数据抓取方案

接下来,我们往下分析,去扣JS代码并还原加密算法!首先我们先找到n参数内d、k、l、num、s、sort是如何生成的!断点继续往下走,注意看!在K进行base64编码返回密文前的一行JS代码,如下所示:
在这里插入图片描述

来,就是这里!我们总结分析一下!上图几个参数的值跟n参数内的字段对应关系如下:

n = {“s”: s, “k”: d, “l”: f, “d”: 0, “sort”: “dd”, “num”: 10}

像上面三个动态生成的参数,参与加密一般也有可能是其他算法生成的、但是也可能是在前面某些接口内生成的,请求一次刷新一次最新的参数,所以可以先用搜索大法去验证一下,一般可能会有意想不到的结果,如下所示:

在这里插入图片描述
在这里插入图片描述

至此,参与加密的动态参数n就搞定了,每次请求之前请随便找个主页接口求一下把上面的动态参数拿出来即可!

接着继续,分析加密逻辑,现在已经是周六的凌晨3点了~一边回忆复盘加调试、一边记录到文章中

进入到Object(l.b)函数内部,这里提示一下各位新手朋友,像一些基本的调式技巧不熟悉的可以先学习一下,多看看大佬的视频或者文章,我觉得我一般都写的够细了,还有人私信问怎么操作?说看不懂!如下所示:

在这里插入图片描述

现在我们尝试将这个方法加上前面的加密函数h全部扣出来,进行替换,JS代码中写有注释!如下所示:

function m(e, n, o) {var d = "";// t.from自己定义一下,就一个编码方法n = t.from(n, "utf8"),o = t.from(o, "utf8");//使用NodeJS中内置经典加解密模块替换//var c = Object(r.createDecipheriv)("aes-128-cbc", n, o);//使用AES算法创建解密器var c = crypto.createDecipheriv("aes-128-cbc", n, o);//将十六进制编码的密文进行解密return d += c.update(e, "hex", "utf8"),d += c.final("utf8")
}function h(e, path, n, r) {var s = n.s, d = n.k, f = n.l, v = n.d, h = n.sort, k = n.num, y = function(content, t, e) {for (var a = Array.from(content), n = Array.from(t), r = a.length, o = n.length, d = String.fromCodePoint, i = 0; i < r; i++)a[i] = d(a[i].codePointAt(0) ^ n[(i + e) % o].codePointAt(0));return a.join("")}(function(s, t, path, e) {return [s, t, e, path].join("(&&)")}(function(t, e) {var n = c()(t);if (!_()(n)) {var r = [];for (var d in n)m()(n[d]) && "get" === e && (n[d] = n[d].join("")),"post" === e && (m()(n[d]) || o()(n[d])) && (n[d] = JSON.stringify(n[d])),r.push(n[d]);return r.sort(),r.join("")}// 这里我们先将Object(l.b)替换为上面的m函数}(e, r), parseInt((new Date).getTime() / 1e3) - 655876800 - v, path, h), m(s, d, f), k);//return t.from(y).toString("base64")//采用浏览原生函数编码方式,return btoa(y)
}

上面JS代码已经还原了90%,只差最后一步t.from,这个方法是干嘛的?断点继续调式,如下所示:

在这里插入图片描述
from方法接受两个参数,r默认空,t需要编码的字符串,e编码类型,默认UTF-8,来~用调式环境的数据编写一个from函数测试一下,跟浏览器一致,如下所示:

最后将浏览器环境请求参数跟动态参数n的数据丢给上面还原的加密算法,测试如下:
在这里插入图片描述

K加密结果与浏览器一致,至此结束!补环境的话代码量会更多,这个网站加密结构还是很清晰的

在这里插入图片描述

测试运行一下抓取评论接口数据,效果如下:

在这里插入图片描述

最后!互联网任何公开的数据源有获取数据的需求,可以适当的利用工具与技术来助力。但切记不要滥用,以免对任何第三份平台与网站造成压力与负担!请使用合理、合法、合规、合情的方式去满足自己的需求

好了,到这里又到了跟大家说晚安的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/294697.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式——行为型——责任链模式Chain Of Responsibility

请求类 public class ApproverRequest {private int type;//请求批准的类型private float price;//请求的金额private int id;//请求的编号 } 审批人抽象类 public abstract class ApproverPerson {protected ApproverPerson next;protected String name;//审批过程public a…

【详细讲解语言模型的原理、实战与评估】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

【Java面试题系列】基础篇

目录 基本常识标识符的命名规则八种基本数据类型的大小&#xff0c;以及他们的封装类3*0.10.3返回值是什么short s1 1; s1 s1 1;有什么错? short s1 1; s1 1;有什么错?简述&&与&的区别&#xff1f;简述break与continue、return的区别&#xff1f;Arrays类的…

【性能测试】性能场景收集与分析

本文章为学习笔记&#xff0c;内容是性能场景收集以及如何分析 压测场景 压测策略 系统架构梳理 性能场景设计-业务范围 分布式压测 指标监控

Netty学习——源码篇10 Netty内存分配ByteBuf基础 备份

1 初始ByteBuf ByteBuf是Netty整个结构中最为底层的模块&#xff0c;主要负责把数据从底层I/O读取到ByteBuf&#xff0c;然后传递给应用程序&#xff0c;应用程序处理完成后再把数据封装成ByteBuf写回I/O。所以&#xff0c;ByteBuf是直接与底层打交道的一层抽象。 2 ByteBuf的…

计算机视觉的技术领域

计算机视觉是一门研究如何使计算机能够“看”和理解图像和视频的科学。它结合了图像处理、模式识别、机器学习、人工智能等多个领域的技术。以下是计算机视觉中的一些关键技术领域。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. …

Netty核心原理剖析与RPC实践11-15

Netty核心原理剖析与RPC实践11-15 11 另起炉灶&#xff1a;Netty 数据传输载体 ByteBuf 详解 在学习编解码章节的过程中&#xff0c;我们看到 Netty 大量使用了自己实现的 ByteBuf 工具类&#xff0c;ByteBuf 是 Netty 的数据容器&#xff0c;所有网络通信中字节流的传输都是…

C++其他语法..

1.运算符重载 之前有一个案例如下所示 其中我们可以通过add方法将两个点组成一个新的点 class Point {friend Point add(Point, Point);int m_x;int m_y; public:Point(int x, int y) : m_x(x), m_y(y) {}void display() {cout << "(" << m_x <<…

十四.PyEcharts基础学习

目录 1-PyEcharts介绍 优点&#xff1a; 安装: 官方文档&#xff1a; 2-PyEcharts快速入门 2.1 第一个图表绘制 2.2 链式调用 2.3 opeions配置项 2.4 渲染图片文件 2.5 使用主题 3-PyEcharts配置项 3.1 初始化配置项InitOpts InitOpts 3.2 全局配置项set_global_o…

SQLBolt,一个练习SQL的宝藏网站

知乎上有人问学SQL有什么好的网站&#xff0c;这可太多了。 我之前学习SQL买了本SQL学习指南&#xff0c;把语法从头到尾看了个遍&#xff0c;但仅仅是心里有数的程度&#xff0c;后来进公司大量的写代码跑数&#xff0c;才算真真摸透了SQL&#xff0c;知道怎么调优才能最大化…

时序数据库IoTDB:功能详解与行业应用

一文读懂时序数据库 IoTDB。 01 为什么需要时序数据库 解释时序数据库前&#xff0c;先了解一下何谓时序数据。 时序数据&#xff0c;也称为时间序列数据&#xff0c;是指按时间顺序记录的同一统计指标的数据集合。这类数据的来源主要是能源、工程、交通等工业物联网强关联行业…

基于Arduino IDE 野火ESP8266模块 文件系统LittleFS 的开发

一、文件系统LittleFS的介绍 LittleFS是一个为微控制器设计的轻量级、可靠且高性能的文件系统。它专为嵌入式设备打造&#xff0c;拥有占用空间小、对硬件要求低的特点&#xff0c;同时保证在断电情况下数据的完整性和稳定性。 1.设计与特点 LittleFS的设计旨在提供嵌入式系统所…

Pytorch for training1——read data/image

blog torch.utils.data.Dataset create dataset with class torch.utils.data.Dataset automaticly import torch from torch.utils.data import Datasetclass MyDataset(Dataset):def __init__(self, data):self.data datadef __getitem__(self, index):# 根据索引获取样本…

数据可视化高级技术(Echarts)

目录 &#xff08;一&#xff09;数据可视化概念及Echarts基础知识 数据可视化的好处&#xff1a; 数据可视化的目标 数据可视化的基本流程 &#xff08;二&#xff09;数据图表 类别比较图表&#xff1a; 数据关系图表&#xff1a; 数据分布图表&#xff1a; 时间序列…

智能文档合规检测系统:在央企国企招标采购领域的应用

一、背景介绍 在央企国企采购过程中&#xff0c;合规性是一个不可忽视的重要方面。采购方需要确保供应商的资质、业绩、规模等条件符合采购要求&#xff0c;同时避免设置不合理的条件限制或排斥潜在供应商。为了提高采购效率和确保合规性&#xff0c;智能文档合规检测系统应运…

网页的血液——javascript

JavaScript 基础知识概述 1. JavaScript 介绍 JavaScript 是一种高级的、解释型的编程语言&#xff0c;它是一种基于对象的、事件驱动的语言&#xff0c;它允许开发者创建动态的网页。JavaScript 是一种脚本语言&#xff0c;它可以嵌入到 HTML 中&#xff0c;或者作为外部文件…

YOLOv9改进策略 :主干优化 | 无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023 RIFormer

💡💡💡本文改进内容: token mixer被验证能够大幅度提升性能,但典型的token mixer为自注意力机制,推理耗时长,计算代价大,而RIFormers是无需TokenMixer也能达成SOTA性能的极简ViT架构 ,在保证性能的同时足够轻量化。 💡💡💡RIFormerBlock引入到YOLOv9,多个数…

ADS-B及雷达显示终端8.4

#更新内容# 本次软件更新内容不少&#xff0c;但可见部分不多。主要更新集中的系统后台部分。后台更新内容包括&#xff1a; #后台更新内容# 1、增加了对部分特殊雷达编码格式的支持。应甲方要求&#xff0c;对部分国产雷达及其特殊的雷达编码协议进行了支持&#xff0c;增加了…

OpenHarmony无人机MAVSDK开源库适配方案分享

MAVSDK 是 PX4 开源团队贡献的基于 MavLink 通信协议的用于无人机应用开发的 SDK&#xff0c;支持多种语言如 C/C、python、Java 等。通常用于无人机间、地面站与通信设备的消息传输。 MAVLink 是一种非常轻量级的消息传递协议&#xff0c;用于与无人机&#xff08;以及机载无…

【好书推荐4】图机器学习

【好书推荐4】图机器学习 写在最前面编辑推荐内容简介作者简介目录前言/序言本书读者内容介绍 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能…