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

news2025/1/15 7:23:10

文章目录

  • 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, hashes

def 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python中什么叫做脚本

Python一种面向对象的动态类型语言,是一种脚本语言,常用于各种服务器的维护和自动化运行。它具有丰富和强大的库。它常被称为胶水语言,因为它能够把用其他语言制作的各种模块很轻松地联结在一起。 以.py 结尾的文件就是Python脚本&#xff0…

全面解析 Transformer:改变深度学习格局的神经网络架构

目录 一、什么是 Transformer? 二、Transformer 的结构解析 1. 编码器(Encoder) 2. 解码器(Decoder) 3. Transformer 模型结构图 三、核心技术:注意力机制与多头注意力 1. 注意力机制 2. 多头注意力&…

虚幻引擎---材质篇

一、基础知识 虚幻引擎中的材质(Materials) 定义了场景中对象的表面属性,包括颜色、金属度、粗糙度、透明度等等;可以在材质编辑器中可视化地创建和编辑材质;虚幻引擎的渲染管线的着色器是用高级着色语言(…

基于Matlab计算机视觉的车道线识别与前车检测系统研究

随着自动驾驶技术的发展,车道线识别和前车检测成为智能驾驶系统中的核心技术之一。本实训报告围绕基于计算机视觉的车道线识别与前车检测系统展开,旨在通过处理交通视频数据,实时检测车辆所在车道及其与前车的相对位置,从而为车道…

vue.js学习(day 19)

自定义创建项目 ESlint 代码规范 代码规范错误 手动修正 自动修正 settings.json {"emmet.triggerExpansionOnTab": true,"editor.fontSize": 25,// 当保存的时候,eslint自动帮我们修复错误"editor.codeActionsOnSave": {&qu…

物联网——WatchDog(监听器)

看门狗简介 独立看门狗框图 看门狗原理:定时器溢出,产生系统复位信号;若定时‘喂狗’则不产生系统复位信号 定时中断基本结构(对比) IWDG键寄存器 独立看门狗超时时间 WWDG(窗口看门狗) WWDG特性 WWDG超时时间 由于…

医疗挂号|基于springBoot的医疗挂号管理设计与实现(附项目源码+论文+数据库)

目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存…

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 …

电子应用设计方案-38:智能语音系统方案设计

智能语音系统方案设计 一、引言 智能语音系统作为一种便捷、自然的人机交互方式,正逐渐在各个领域得到广泛应用。本方案旨在设计一个高效、准确、功能丰富的智能语音系统。 二、系统概述 1. 系统目标 - 实现高准确率的语音识别和自然流畅的语音合成。 - 支持多种语…

AWS创建ec2实例并连接成功

aws创建ec2实例并连接 aws创建ec2并连接 1.ec2创建前准备 首先创建一个VPC隔离云资源并且有公有子网 2.创建EC2实例 1.启动新实例或者创建实例 2.创建实例名 3.选择AMI使用linux(HVM) 4.选择实例类型 5.创建密钥对下载到本地并填入密钥对名称 6.选择自己创建的VPC和公有子网…

数字逻辑——二进制

目录 1 信息与编码 1.1 什么是信息? 1.2 什么是编码? 2 数制和码制 2.1 数制 3 一些基本概念 3.1 位(bit) 3.2 字节(byte) 3.3 数据量的大小表示符号 4 二进制 4.1 二进制简介 4.2 二进制的…

初识TCP(编写回显服务器)

目录 初识TCP(编写回显服务器)TCP相关的API服务器代码实现客户端代码实现部分代码解释注意事项效果展示 初识TCP(编写回显服务器) TCP相关的API ServerSocket : 这是socket类,对应到网卡,但是…

ElasticSearch7.x入门教程之全文搜索聚合分析(十)

文章目录 前言一、指标聚合1、统计最大值:Max Aggregation2、统计最小值:Min Aggregation3、统计平均值:Avg Aggregation4、求和:Sum Aggregation5、Cardinality Aggregation6、基本统计:Stats Aggregation7、高级统计…

【Linux】DNS服务配置

DNS DNS是什么 DNS是Domain Name System的缩写,即域名系统。它是一种用来将域名转化为IP地址的系统。在互联网中,每个网站都有一个唯一的IP地址,但是人们更习惯使用简单易记的域名来访问网站。DNS的作用就是将这些域名转化为对应的IP地址,使得人们可以通过域名来访问网站…

第31天:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

时间轴: 演示案例: 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 打包器-WebPack-使用&安全 参考:https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一个模块打包器。在 Webpack 中会将前端的所有资源…

开发者如何使用GCC提升开发效率Opencv操作

看此篇前请先阅读 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144216351?spm=1001…

使用PaddlePaddle实现线性回归模型

目录 ​编辑 引言 PaddlePaddle简介 线性回归模型的构建 1. 准备数据 2. 定义模型 3. 准备数据加载器 4. 定义损失函数和优化器 5. 训练模型 6. 评估模型 7. 预测 结论 引言 线性回归是统计学和机器学习中一个经典的算法,用于预测一个因变量&#xff0…

图像处理网络中的模型水印

论文信息:Jie Zhang、Han Fang、Weiming Zhang、Wenbo Zhou、Hao Cui、Hao Cui、Nenghai Yu:Model Watermarking for Image Processing Networks 本文首次提出了图像处理网络中深度水印问题,将知识产权问题引入图像处理模型 提出了第一个深…

全面UI组件库Telerik 2024 Q4全新发布——官方宣布支持.NET 9

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供最完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Ken…

计算机毕业设计hadoop+spark民宿推荐系统 民宿数据分析可视化大屏 民宿爬虫 民宿大数据 知识图谱 机器学习 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…