当前位置: 首页 > news >正文

temu登录接口逆向分析(含Py纯算)

文章目录

  • 1. 写在前面
  • 2. 接口分析
  • 3. 算法还原

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

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

1. 写在前面

  爬虫业务中自动登录获取Cookie的操作,之前作者提到也出过相关的文章。采集业务场景中很常见、也较为重要!一些第三方的网站定期或者持续抓取Cookie都是有时效性的。那么想要保障爬虫稳定的运行就需要定期更新Cookie信息,手动更新肯定是不现实的!自动更新的话采用浏览器自动化的方案也是不可取的,有条件的都采用接口协议的方式自动登录更新Cookie信息

在这里插入图片描述


分析目标

aHR0cHM6Ly9zZWxsZXIua3VhamluZ21haWh1by5jb20vbG9naW4/cmVkaXJlY3RVcmw9aHR0cHMlM0ElMkYlMkZzZWxsZXIua3VhamluZ21haWh1by5jb20lMkZzZXR0bGUlMkZtYWxsLWluZm8tZW50cnk=

2. 接口分析

打开网站查看登录入口,随便输入一个手机号密码查看一下发包情况,如下所示:

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

可以看到login接口中除了提交参数中的密码是经过加密的还有请求头中有一个参数也是加密的Anti-Content,所以要解决自动登录的就需要先逆向分析这两个参数的加密,还原出来!

这篇文章主要针对encryptPassword参数的加密进行分析,请求头的验签在以往的文章中有写过,这里就不再赘述,感兴趣的翻看之前的文章

3. 算法还原

这个我们全局搜索一下encryptPassword就能定位到相关的加密位置,如下所示:

在这里插入图片描述

看下面JS,接受一个明文密码,一个公钥。然后new g.a在这里创建了一个加密对象的实例,如下所示:

在这里插入图片描述

g.a即下面JS中的ut里面封装了公钥、私钥管理及其相关操作,构造函数t初始化了默认配置(密钥的默认大小、公钥的默认指数-一般为01000165537),setKey初始化密钥,还有一堆管理RSA密钥的,比如那个ot

分析重点,调用d(this.getKey().encrypt(t))使用密钥对待加密数据进行加密,d方法再对加密结果进行Base64编码,如下所示:

ut = function() {function t(t) {void 0 === t && (t = {}),t = t || {},this.default_key_size = t.default_key_size ? parseInt(t.default_key_size, 10) : 1024,this.default_public_exponent = t.default_public_exponent || "010001",this.log = t.log || !1,this.key = null}return t.prototype.setKey = function(t) {this.log && this.key && console.warn("A key was already set, overriding existing."),this.key = new ot(t)},t.prototype.setPrivateKey = function(t) {this.setKey(t)},t.prototype.setPublicKey = function(t) {this.setKey(t)},t.prototype.decrypt = function(t) {try {return this.getKey().decrypt(g(t))} catch (e) {return !1}},t.prototype.encrypt = function(t) {try {return d(this.getKey().encrypt(t))} catch (e) {return !1}},t.prototype.sign = function(t, e, r) {try {return d(this.getKey().sign(t, e, r))} catch (n) {return !1}},t.prototype.verify = function(t, e, r) {try {return this.getKey().verify(t, g(e), r)} catch (n) {return !1}},t.prototype.getKey = function(t) {if (!this.key) {if (this.key = new ot,t && "[object Function]" === {}.toString.call(t))return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, t);this.key.generate(this.default_key_size, this.default_public_exponent)}return this.key},t.prototype.getPrivateKey = function() {return this.getKey().getPrivateKey()},t.prototype.getPrivateKeyB64 = function() {return this.getKey().getPrivateBaseKeyB64()},t.prototype.getPublicKey = function() {return this.getKey().getPublicKey()},t.prototype.getPublicKeyB64 = function() {return this.getKey().getPublicBaseKeyB64()},t.version = st.version,t}();

如果想扣JS代码的话可以从上面开始扣了,把那几个缺失的都扣全。然后把加密方法导出即可!

在这里插入图片描述

继续往下进入到RSA加密处理的里面,来分析这段JS,可以看到它主要实现了一个针对publicKeyBase64解码器。纯算还原这段方法类似Python中的base64.b64decode,如下所示:

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

在闭包内的变量中存储了Base64字符映射表,标准的字符集!通过处理后返回一个解码字节的数组,如下所示:

在这里插入图片描述

JS算法中主要通过使用RSA公钥加密对密码进行加密实现,这里我们使用Python对加密算法进行还原实现,如下所示:

import base64
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashesdef encrypt_password(public_key: str, password: str) -> str:public_key_bytes = base64.b64decode(public_key)public_key_obj = serialization.load_der_public_key(public_key_bytes)encrypted = public_key_obj.encrypt(password.encode(),padding.PKCS1v15())return base64.b64encode(encrypted).decode()public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJpaLPONg3qWfi2kdwauqOT3L7AEK6lrMZqKYZv0ikWPZtzTqnVLMeolsE7x3Sc4UxS6ews+WS0ijwIEU8GAbhr2aJh0F+o6bpYQgWosHBts4lMW/IdtKg45DSGgBWg8gWDTK7K+T+zWfTjEQGwEgNHsZ2NbQBtTEZ35CDWUP7iQIDAQAB"
password = "test123"
encrypted_password = encrypt_password(public_key, password)

serialization.load_der_public_key将DER格式的公钥字节数据加载为可用的公钥对象(可以自行去了解一下RSA的相关知识~),转换的目的即加密操作需要的是一个公钥对象,而不是字符串或字节数据!而上面的方法则可以将DER格式的公钥转换为Py的公钥对象

为什么选择使用PKCS#1 v1.5的填充方式,可以查看setPublicKey设置公钥,另一个就是JS加密中并没有使用到OAEP填充模式,所以大概率就是使用的默认的PKCS#1 v1.5

相关文章:

temu登录接口逆向分析(含Py纯算)

文章目录 1. 写在前面2. 接口分析3. 算法还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…...

Java ArrayList 详解

Java ArrayList 详解 ArrayList 是 Java 集合框架(Collection Framework)中最常用的类之一,是一种基于动态数组的数据结构,属于 List 接口的实现类。它允许存储重复的元素,有序,支持随机访问,且…...

CTF之密码学(仓颉编码)

一、仓颉码(用于建立中文索引) 定义与目标: 仓颉码是为了建立中文的索引观念而设计的一种编码方式。其主要目标是方便对中文资料或程式进行索引功能的处理。 工作原理: 仓颉码的索引以ASCII的字符码为基准,但在内部会转…...

OpenCV的圆形检测‌HoughCircles

HoughCircles 函数是 OpenCV 库中用于在灰度图像中检测圆的函数,它基于霍夫变换(Hough Transform)的一种变体——梯度霍夫变换(HOUGH_GRADIENT)函数原型如下: void HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,double …...

Latex 英文双栏排版时,摘要和引言之间的距离

目标:解决这个间隔 打开“cas-common.sty" 搜索“\NewDocumentCommand \dashrule" 本来是两个 m m 变成 m m m然后是增加下面这个代码,其他地方不动 \skip_vertical:n {#4} 搜索”MaketitleBox“和“LongMaketitleBox ” 本来的代码应该…...

AD学习笔记·空白工程的创建

编写不易,禁止搬运,仅供学习,感谢理解 序言 本文参考B站,凡亿教育,连接放在最后。 创建工程文件 在使用AD这个软件的电路板设计中,有很多的地方跟嘉立创eda还是有不一样的地方,其中一个地方就…...

非球面加工领域的佼佼者:倚光科技

在光学领域,非球面加工技术宛如一颗璀璨的明珠,以其独特的优势和广泛的应用,引领着光学元件制造的新潮流。 非球面透镜,其表面曲率半径从中心到边缘是变化的,这使得它在光学系统中具有诸多显著优势。首先,…...

Git分布式版本控制工具 Git基本概念、Git工作流程、Git常用命令、Git远程仓库、IDEA操作Git

目录 ​​​​​​ 1.Git基本概念 1.1 概述 1.1.1 开发中的实际场景 1.1.2 版本控制器的方式 1.1.2.1 集中式版本控制工具(SVN) 1.1.2.2 分布式版本控制工具(Git) 2.概述git工作流程 3.Git常用命令 3.1 Git环境配置 3.1.1 下载与安装 3.1.2 基本配置 3.1.3 为常用指令配置别名&…...

Spring 容器管理 Bean

Bean是什么 Bean 是指 Java 中的可重用软件组件,容器会根据提供的元数据来创建和管理这些 Bean,也包括它们之间的依赖关系。Spring 容器对 Bean 并没有太多的要求,无须实现特定接口或依赖特定库,只要是最普通的 Java 对象即可,这类对象也被称为 POJO(Plain Old Java Obj…...

Spring 容器 详解

Spring 容器详解 Spring 容器 是 Spring 框架的核心组件之一,它负责创建和管理应用程序中的 Bean(对象)以及处理它们之间的依赖关系。容器通过控制反转(IoC)和依赖注入(DI)实现对象的生命周期管…...

ubuntu环境下安装electron环境,并快速打包

1.配置镜像源 关闭防火墙,命令:sudo ufw disable 1.1配置国内镜像源: vim /etc/apt/source.list deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb-src https://mirrors.aliyun.com/ubuntu/ jammy main…...

Yeeco成长型一体化数智赋能平台:科技矩阵重塑企业数字生态

随着科技的飞速发展,我们正在步入一个被称为“数智化时代”的新时代。在这个时代中,数据处理和分析的能力被提升到一个前所未有的高度,而这种变化背后的重要推动力量就是各种新兴的技术趋势。 为了在激烈的市场竞争中脱颖而出,Yee…...

DP、CP、Mn是什么?有什么关系?双径节齿轮又是什么?

有一些刚刚接触齿轮的小伙伴们,经常听到和齿轮相关的是Mn这个代号,有时候拿到图纸会碰到DP和CP的图纸,今天就简单数一数他们三个的关系: 径节DP 齿轮的节距定义为两个相邻齿轮齿上两个相同点之间的距离。在理想情况下&#xff0c…...

Python 中的生成器是什么?

生成器(Generator)是Python中一种特殊的迭代器,它允许你逐步生成一系列值,而不是一次性创建整个列表或集合。 这在处理大型数据集或流式数据时特别有用,因为你可以逐个处理元素,而不需要将所有元素加载到内…...

如何参加华为欧拉考试?

华为欧拉考试主要针对的是华为欧拉(EulerOS/openEuler)操作系统的认证考试,这一认证体系旨在培养和认证具备基于欧拉操作系统进行企业级应用运行基础环境搭建、管理和调测能力的工程师以及云计算架构师。以下是对华为欧拉考试的详细介绍&…...

基于STM32设计的智能家居控制系统(华为云IOT)_275

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】设计意义【5】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 参考文献1.6 系统框架图1.7 系统原理图1.8 实物图1.9…...

2024年第七届传智杯程序设计挑战赛第一场初赛题解

文章目录 2024年第七届传智杯程序设计挑战赛初赛第一场A-吃糖果(B组、C组)B-汤姆和杰瑞(A组、C组)C-游游的重组偶数(A组、B组、C组)D-开心还是难过(B组、C组)E-小欧的平面连线(A组、B组、C组)F-小红的四子棋(A组、B组、C组)G-小红的数组操作(A组、B组)H-游游的不相邻取数(A组) …...

iOS视图控制器的生命周期及各阶段的作用

iOS视图控制器(UIViewController)的生命周期是指从它被创建到最终被销毁的过程中所经历的一系列阶段。每个阶段都有其特定的作用和执行时机,这些阶段和作用对于开发高效、稳定的iOS应用至关重要。以下是iOS视图控制器的生命周期及其各个阶段的…...

stm32上电不能启动什么原因

STM32上电不能启动可能由多种原因造成,以下是一些常见的原因及解决方法: 一、软件原因 程序错误: 程序可能存在死循环、堆栈溢出、指针指向不允许的内存空间等问题。 解决方法:使用调试工具进行调试,检查程序流程,定位并修复错误。 时钟问题: 时钟切换失败或外部时钟源…...

【后端面试总结】golang channel深入理解

在Go语言中,Channel是一种用于在goroutine之间进行通信和同步的重要机制。它提供了一种安全、类型安全的方式来传递数据,使得并发编程变得更加直观和简单。本文将详细介绍Golang中Channel的基本概念、创建与关闭、发送与接收操作,以及相关的使…...

lobeChat安装

一、安装Node.js version > v18.17.0 二、下载 cd F:\AITOOLS\LobeChat git clone https://github.com/lobehub/lobe-chat.git (下载要是失败就手动下:https://codeload.github.com/lobehub/lobe-chat/zip/refs/heads/main) npm install …...

OpenCV 简介与安装方法

大家好啊,我是董董灿。 如果你在做计算机视觉相关的工作,肯定少不了使用 OpenCV 库。 在《计算机视觉专栏》的传统计算机视觉部分,我曾经使用 OpenCV 进行了很多图像的处理,比如边缘检测。 刚好最近在整理一份文稿,…...

力扣刷题TOP101:14.BM16 删除有序链表中重复的元素-II

目录: 目的 思路 复杂度 记忆秘诀 python代码 目的 1→1→2→3→3 删除重复后变成2。 思路 这个任务是删除链表里重复的节点包含本身。可以看成是一个抽奖活动的系统升级。某人通过多种方式报名(节点不同),后台数据检测到这些…...

Hadoop生态圈框架部署 伪集群版(四)- Zookeeper单机部署

文章目录 前言一、Zookeeper单机部署(手动部署)1. 下载Zookeeper安装包到Linux2. 解压zookeeper安装包3. 配置zookeeper配置文件4. 配置Zookeeper系统环境变量5. 启动Zookeeper6. 停止Zookeeper在这里插入图片描述 注意 前言 本文将详细介绍Zookeeper的…...

【Linux】文件

声明:以下内容均学习自《Linux就该这么学》一书 1、文件权限及归属 对目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;“可执行”表示能够进入该目录。 文件类型区分 -普通…...

仿真键盘输入遇到Edge环境不识别 回车符如何处理

这个问题我也是最近才遇到,可能现在大家都喜欢用新架构,基于网页来写应用管理软件。 当遇到Edge环境下,文本框不识别回车符如何处理,根据笔者经验可通过配置Edge 基于键盘管理设置来解决这个事情。如图 即在Edge浏览器环境下&…...

Python 列表操作详解

Python 列表操作详解 在 Python 中,列表(list)是一种用于存储有序集合的数据结构。列表可以包含各种类型的数据,如整数、浮点数、字符串等,甚至可以包含其他列表(这称为嵌套列表)。 示例列表 …...

Git操作学习2

1.使用git rm删除文件 查看文件夹的内容 ls -lr 删除文件rm 文件名 但是此时只删了工作区的文件,仓库还没有删 可以再使用git add更新提交给仓库 也可以直接通过git rm 删除仓库里面的文件 工作区也删除了 暂存区也删除了 最后记得提交 否则删除的文件在版本库还…...

Spring Event 监听与异步设置:深入解析与应用场景

在开发中,事件驱动编程(Event-Driven Programming)是一种常见的编程模式,Spring 提供了强大的事件机制,使得我们可以通过 EventListener 或 ApplicationListener 来监听和处理应用中的各种事件。这种机制不仅使得应用架…...

百度木木浆测试

本程序测试识别图片的文字 import cv2 from paddleocr import PaddleOCR, draw_ocr from matplotlib import pyplot as plt # 加载PaddleOCR模型,这里你可以根据需要选择语言和模型路径 ocr PaddleOCR(use_gpuFalse, langch) # 假设我们识别中文字符&#xff0c…...

视频监控集中管理方案设计:Liveweb视频汇聚方案技术特点与应用

随着科技的发展,视频监控平台在各个领域的应用越来越广泛。然而,当前的视频监控平台仍存在一些问题,如视频质量不高、监控范围有限、智能化程度不够等。这些问题不仅影响了监控效果,也制约了视频监控平台的发展。 为了解决这些问…...

剑指offer(专项突破)---字符串

总目录:剑指offer(专项突破)---目录-CSDN博客 1.字符串的基本知识 C语言中: 函数名功能描述strcpy(s1, s2)将字符串s2复制到字符串s1中,包括结束符\0,要求s1有足够空间容纳s2的内容。strncpy(s1, s2, n)…...

Zygote启动流程(AndroidV)

一:背景 众所周知,Android应用及system_server基本都是由zygote fork出来的,那么zygote是如何启动的、又是如何接收fork进程的请求,接下来一步步揭秘。 二:启动流程 init进程是Android系统启动时,启动的第一…...

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智行无忧停车场管理系统(前后端源码 + 数据库 sql 脚本)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 项目介绍 1.1 项目功能 2.0 用户登录功能 3.0 首页界面 4.0 车辆信息管理功能 5.0 停车位管理功能 6.0 入场登记管理功能 7.0 预约管理功能 8.0 收费规则功能 9.0…...

岩体力学的材质-力学等属性的自动划分.

#背景: 在力学求解过程中,我们往往会对目标物体进行网格划分, 那么如何做到自动完成这个过程呢? 这里使用岩体力学中的地下岩层进行举例,这里只是简单的导入了4种界面, 复杂的可以一次性导入几十种界面,都可以计算(你能分多细,这个计算方式就可以帮你分层多细) 这里我只是导…...

注解 实现原理 详解

Java 注解实现原理详解 注解(Annotation)是 Java 提供的一种元数据机制,用于为代码元素(类、方法、字段、参数等)添加额外的信息。注解不会直接影响程序逻辑,但可以通过 工具(如编译器、运行时…...

第4章 陷入与系统调用

有三种类型的事件会让CPU停止正常执行的指令,强制切换到指定的代码,处理这些事件。一种是系统调用,当用户程序执行ecall指令来让内核为它做一些事。另一种是异常:一个指令(用户或内核)做了一些非法的事&…...

项目基于oshi库快速搭建一个cpu监控面板

后端&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-…...

力扣C语言刷题记录 (二)移除元素

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#xff1a; 更改…...

多模态大语言模型的对比

简介 文章主要对比了包括 VideoLLaMA 2 、CogVLM2-video 、MiniCPM-V等模型 目前主流的多模态视觉问答大模型&#xff0c;大部分采用视觉编码器、大语言模型、图像到文本特征的投影模块 目录 简介1. VideoLLaMA 21.1 网络结构1.2 STC connector具体的架构 2. MiniCPM-V 2.62.…...

关于最近od机考中--树

题目 树按照层级遍历获取非叶子结点&#xff0c;然后将非叶子结点以后序遍历打印。 eg 图解 只需要将1&#xff0c;3&#xff0c;4&#xff0c;2进行后序遍历打印&#xff1a;既左-右-中方式打印 最后结果如&#xff1a;2&#xff0c;3&#xff0c;4&#xff0c;1。 思路&a…...

基数排序(代码+注释)

#include <stdio.h> #include <stdlib.h>// 获取数组中的最大值 int GetMax(int* a, int n) {int max a[0];for (int i 1; i < n; i) {if (a[i] > max) {max a[i];}}return max; }// 对数组按照某个位数进行计数排序 void CountingSortForRadix(int* a, i…...

NLP 相关知识的构成

自然语言处理&#xff08;Natural Language Processing, NLP&#xff09; 自然语言处理相关知识 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;什么是自然语言处理&#xff1f;自然语言处理的构成1. 基本术语1.1 分词&#xff08;Segmentation&#x…...

算力100问☞第20问:GPU算力的影响因素有哪些?

影响因素1&#xff1a;核心数量 GPU中的计算核心数量是决定其算力的关键因素之一。更多的计算核心意味着可以同时处理更多的数据和任务&#xff0c;从而提高整体的计算效率。例如&#xff0c;GPU里面的计算核心就好像是工厂里的工人。工人数量越多&#xff0c;同时干活儿的也就…...

C语言柔性数组

在C语言中&#xff0c;结构体定义数组指定长度0&#xff0c;sizeof时候不计入占用&#xff0c;实际分配时候占用为准&#xff01; 也许你从来没有听说过柔性数组的概念&#xff0c;但其确实存在。C99规定&#xff1a;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就…...

TensorFlow与PyTorch对比:哪个更适合初学者?

小贴士: 不必着急,慢慢消化每一部分。有问题就查阅示例,实践是最好的老师!别忘了,选择合适的框架才是王道!💻🔍 本文全面对比了 TensorFlow 与 PyTorch 两大深度学习框架,详细分析了它们的特点、优势及适用场景,帮助初学者做出框架选择。内容包含框架背景、代码示例…...

Windows 11 如何配置node.js

一&#xff0c;官网下载 官网首页 下载最新LTS版本&#xff0c;比较稳定&#xff0c;如果想探索更新的版本去探索新的nodejs功能。 1. 下载完成后&#xff0c;双击运行程序&#xff0c;点击next 2. 勾选接受协议&#xff0c;点击next 3. 选择自己的安装路径&#xff08;默认是…...

std::reverse_iterator

std::reverse_iterator 是 C 标准库中的一个迭代器适配器&#xff08;iterator adapter&#xff09;&#xff0c;它允许你以反向顺序遍历容器或序列。这个适配器通过封装一个基础迭代器&#xff08;通常是正向迭代器&#xff09;并提供反向的递增&#xff08;&#xff09;和递减…...

On-Chip-Network之router微架构的物理实现

Low-Power Microarchitecture 自20世纪90年代以来&#xff0c;功耗一直是嵌入式芯片和高性能芯片面临的一个挑战。自2000年代中期以来&#xff0c;它已经成为大多数设计的主要约束。多核解决了功耗问题&#xff0c;由此产生的communication substrate&#xff0c;namely the on…...

学习threejs,使用canvas更新纹理

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Texture 贴图 二、&#x1…...