点点数据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加密结果与浏览器一致,至此结束!补环境的话代码量会更多,这个网站加密结构还是很清晰的

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

最后!互联网任何公开的数据源有获取数据的需求,可以适当的利用工具与技术来助力。但切记不要滥用,以免对任何第三份平台与网站造成压力与负担!请使用合理、合法、合规、合情的方式去满足自己的需求
好了,到这里又到了跟大家说晚安的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章
相关文章:
点点数据K参数加密逆向分析(RPC方案跟加密算法还原)
文章目录 1. 写在前面2. 接口分析3. 断点分析4. RPC调用5. 算法还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…...
考研数学|《1800》+《660》精华搭配混合用(经验分享)
肯定不行,考研数学哪有这么容易的! 先说说这两本习题册,李永乐老师推出的新版660题,相较于18年前的版本,难度略有降低,更加适合初学者。因此,对于处于基础阶段的学习者来说,新版660…...
【Redis 二】Redis客户端(Jedis、SpringDataRedis、RedisTemplate)
1. Redis客户端 Jedis 以redis命令作为方法名称,学习成本低,但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用(必须为每个线程分配独立的Jedis连接) lettuce 基于Netty实现,支持同步、异步和…...
Java中Filter和Interceptor的区别
概述 本文阐述Java中Filter和Interceptor的区别。 执行顺序不同 FIlter->Servlet->Interceptor->Controller 配置方式不同 FIlter在web.xml中配置 Interceptor在spring中的配置文件中、使用注解 是否依赖servlet Filter依赖servlet,而Interceptor不…...
记一次 pdfplumber 内存泄漏导致的服务器宕机
有一个项目需求,要在每天凌晨5点的时候执行一个任务,获取一系列的PDF文件并解析。 后端是Django框架,定时任务用Celery来实现的。 本地跑没什么问题,但是一放到服务器上跑就会宕机,而且是毫无征兆的宕机,…...
SpringBoot单元测试剖析
SpringBoot作为一种流行的Java框架,其单元测试的重要性不言而喻。在这篇博客中,我们将深入剖析SpringBoot单元测试的底层原理。 单元测试的概念 单元测试是软件开发过程中的一个重要环节,它是对软件中的最小可测试单元进行检查和验证。对于…...
【华为OD机试C++】计算某字符出现次数
文章目录 描述输入描述输出描述示例代码 描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母) 数据范围: 1 \le n \le 1000 …...
ORA-01779 BYPASS_UJVC 11.2后废弃了
有这么个update语句 update A t set status 1 where exists (select 1 from B B where B.code A.code) 因性能问题需要修改写法。 在oracle10G这么update是没问题的: update( select …...
验证码demo(简单实现)
前言 我们注意到我们登录网站的时候经常会用到网络验证码,今天我们就简单实现一个验证码的前后端交互问题,做一个小demo 准备 我们这里并不需要依靠原生的java来实现,而是只需要引入一个maven依赖,使用现成的封装好的即可,这是我使用的是hutool工具包 网址:Hutool🍬…...
C#面:虚函数和抽象函数的区别
C#中的虚函数和抽象函数都是实现多态性的重要概念,但它们有一些区别。 定义方式: 虚函数:在基类中使用 virtual 关键字定义,可以在派生类中被重写。抽象函数:在抽象类或接口中使用abstract 关键字定义,必…...
Vidmore Video Fix for Mac 视频修复工具
Vidmore Video Fix for Mac是一款功能强大且易于使用的视频修复工具,专为Mac用户设计。它凭借先进的视频修复技术,能够帮助用户解决各种视频问题,如视频文件损坏、无法播放、格式不支持等。 软件下载:Vidmore Video Fix for Mac v…...
Docker容器与虚拟化技术:OpenEuler 部署 Docker UI
目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose-ui 2.OpenEuler 部署 docker ui 3.使用cpolar内网穿透 二、问题 1.docker run -w 的作用 一、实验 1.环境 (1)主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168…...
328——二维矩阵值变为1最小操作次数 next、nextInt、nextLine
一、next、nextInt、nextLine区别 1.next() next()不光是接收键盘输入的内容,而且还进行分割。例如默认分隔符为空格 Scanner sc new Scanner(System.in);while (true){String str sc.next();System.out.println(str "A");}// 输出结果 input&#…...
HarmonyOS 应用开发之同步任务开发指导 (TaskPool和Worker)
同步任务是指在多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行,例如使用锁来防止数据竞争。 同步任务的实现需要考虑多个线程之间的协作和同步,以确保数据的正确性和程序的正确执行。 由于TaskPool偏向于单个独…...
基于MiniExcel的三种常用导出Excel方法(固定列导出、动态列导出、按模板导出)
为了方便代码编写和测试,把很多代码都放在一个class里面,实际开发根据需要放到对应的目录下即可。 1.使用nuget下载安装miniexcel; 2.编写对应的测试接口,具体代码如下: using Microsoft.AspNetCore.Authorization; using Micr…...
MATLAB科研绘图与学术图表绘制从入门到精通
💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…...
C++核心高级编程 --- 1、内存分区模型 2、引用
文章目录 第一章:1.内存分区模型1.1 程序运行前1.2 程序运行后1.3 new操作符 第二章:2.引用2.1 使用2.2 注意事项2.3 做函数参数2.4 做函数返回值2.5 本质2.6 常量引用 第一章: 1.内存分区模型 4个区域: 代码区:存放…...
winform日历控件_进度条控件
在 Windows Forms 应用程序中使用日历控件 (如 MonthCalendar 或 DateTimePicker) 和进度条控件 (如 ProgressBar) 是一个很好的练习,以了解这些控件的工作方式。以下是一些基本的步骤来实践这些控件: 日历控件: 添加 MonthCalendar 控件&am…...
Java进阶-反射的详解与应用
本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力,包括在运行时动态获取类信息、操作对象字段和方法的能力。随后,通过具体代码示例,展示了如何利用反射进行字段访问、方法…...
蓝桥杯算法题——暴力枚举法
先估算这个数小于3的50次方 cnt0 for i in range(50):for j in range(50):for k in range(50):a3**ib5**jc7**kif a*b*c<59084709587505:cnt1 print(cnt-1)#当ijk都为0时,a*b*c1不是幸运数字所以要减去...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
