js逆向-某东h5st

news2024/12/24 8:32:10

声明

本文仅供学习参考,如有侵权可私信本人删除,请勿用于其他途径,违者后果自负!

如果觉得文章对你有所帮助,可以给博主点击关注和收藏哦!

文章标题

      • 声明
      • 前言
      • 参数分析
      • 扣代码
      • 算法还原

前言

目标网站:aHR0cHM6Ly9pdGVtLmpkLmNvbS8xMDAwNDc2MTIwNjAuaHRtbCNjb21tZW50

目标参数: h5st

参数分析

做爬虫最重要的事就是抓包,抓到想要的包之后发现某东新增了两个参数。
在这里插入图片描述
经过测试发现x-api-eid-token不是非必须校验参数,有兴趣得小伙伴可以自行分析。

接着看目标参数,可以看见该参数组成部分非常得多,肉眼可见的有时间戳得格式化日期和时间戳,其他的暂时不知。

全局搜索h5st发现意义不大,在这里主要采用xhr断点。
在这里插入图片描述

我这里选择的是getDataColor处打下断点,重新刷新页面后断点就断下了。
在这里插入图片描述
此时发现h5st已经生成了,向上跟栈查看哪里调用了该函数。
在这里插入图片描述
在这里插入图片描述
向上追了一层调用栈后发现此处出现了目标参数,依旧是打下断点进行分析。

跳到断点处,首先是将n进行json进行序列化和反序列化以便后续操作,然后进行sha256处理,看到then就知道是一个异步处理。

如果猜的不错的话,加密逻辑应该是放在了这个异步中,完成加密后赋值给n对象,此时就完成了参数的组装。

分析完成后分别看一下n、a.body是什么。
在这里插入图片描述
n是请求参数的一部分,body是哈希后的值,在后面生成h5st需要用到。

扣代码

分析完成后,就是扣代码了。对于异步的逻辑在跟值得时候经常后跟丢,在这里讲一个小技巧,遇到异步标识时使用F9去步入,这样可以有效的进入每一层,能够少走很多冤枉路。

单步进入发现在此处强行更改了this的指向,此处比较可疑。在这里插入图片描述

再观察一下arguments的值。
在这里插入图片描述
可以看到出现了加密后的body值,在这里就要打起十二分的精神了。此处绝对有问题!
this中的__genKey函数追进去,发现是一个字符串的拼接然后进行sha256的加密处理(此时的算法可能会有不同),通过函数名称可以得知生成了一个key,至于有什么用,暂时不得而知。
在这里插入图片描述
其中tk、fp、ts、ai、algo这五个值的由来分别是:接口处返回、浏览器指纹、格式化的时间戳、appid、加密库。

在这里插入图片描述
tk和fp可以写死,ts可以通过python处理。

继续跟栈,知道出现下图。

在这里插入图片描述
也就是h5st中的关键参数。
在这里插入图片描述
实际上核心逻辑在这里,还原后的结果如下:

s = rr['HmacSHA256'](a, n).toString();

在这里插入图片描述
a是之前的对象做了处理,body已经知道是sha256后结果,中间一串固定,最后是一个当前时间戳。
n就是之前__genKey的结果。

其实在这里要进行加密处理的是a,盐是n。

那么现在就清晰了,借用一下大佬的文章,里面说的很清楚。
链接: 2023年最新某东web端h5st算法分析

在这里插入图片描述

剩下的就是还原了,因为比较简单可以直接使用python去还原。

算法还原

代码不能直接使用,请自行修改。

# -*- encoding: utf-8 -*-
import datetime
import time
import hashlib
from hashlib import sha256
import hmac


class GenerateEncryptParams:
    def __init__(self):
        pass

    def get_key(self, date):
        """
        生成hmac256 盐值
        """
        str_ = f'tk03wc95a1c9d18nRYzC脱敏VWv5BmG2jYiq脱敏PWLit66JWj4ltExEI2b-wkXMyCLrv2b脱敏hvcMKYq脱敏脱敏4k9_yZl58380087754683脱敏{date}fb5dfpJxfS7yU脱敏脱敏'
        md5 = hashlib.md5(str_.encode())
        key = md5.hexdigest()
        return key

    def get_sign(self, data, key):
        key = key.encode('utf-8')
        message = data.encode('utf-8')
        sign = hmac.new(key, message, digestmod=sha256).hexdigest()
        return sign

    def get_encrypt_body(self, body,t):
        """
        加密params信息
        """
        sha256_ = hashlib.sha256(body.encode())
        encrypt_body = sha256_.hexdigest()
        data = f'appid:pc-item-soa&body:{encrypt_body}&client:pc&clientVersion:1.0.0&functionId:pc_detailpage_wareBusiness&t:{t}'
        return data

    def get_encrypt_info(self, body):
        t = int(time.time() * 1000)
        timestamp = t / 1000.0  # 将时间戳除以1000,转换为秒
        dt = datetime.datetime.fromtimestamp(timestamp)
        formatted_date = dt.strftime('%Y%m%d%H%M%S%f')[:-3]  # 格式化日期字符串,去掉最后三位微秒数
        key = self.get_key(formatted_date)
        data = self.get_encrypt_body(body,t)
        h5st = self.get_sign(data, key)
        return t, formatted_date, h5st


if __name__ == '__main__':
    g = GenerateEncryptParams()
    a ="{\"skuId\":脱敏脱敏脱敏,\"cat\":\"脱敏脱敏\",\"area\":\"7_549_558_34702\",\"shopId\":\"脱敏脱敏\",\"venderId\":脱敏脱敏,\"paramJson\":\"{\\\"platform2\\\":\\\"1\\\",\\\"specialAttrStr\\\":\\\"p0pppppppppp1ppppppppppppp\\\",\\\"skuMarkStr\\\":\\\"00\\\"}\",\"num\":1}"
    t, formatted_date, h5st = g.get_encrypt_info(a)
    print(t, formatted_date, h5st)

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

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

相关文章

SpringCloud项目实例3--通信服务负载均衡

只是在pom.xml文件中添加了spring-cloud-starter-loadbalancer依赖并且在RestTemplate类中添加了一个LoadBalance的注解。这就是另外一种负载均衡的实现方案 Spring Cloud LoadBalancer 介绍 这种方案有什么优点呢? 减少整个系统的复杂度,不需要额外部…

BDD行为驱动开发+Python案例解析

简介:BDD(Behavior-Driven Development,行为驱动开发)是一种敏捷软件开发方法,它强调软件应该按照预期的行为来开发。BDD的核心理念是使用自然语言编写的可读性强、易于理解的用户故事(User Stories&#x…

【前端三剑客之CSS】

目录 1.CSS1.1什么是CSS1.2 引入方式1.2.1内部样式1.2.2 行内样式表1.2.3 外部样式 2.选择器2.1 基础选择器2.1.1 标签选择器2.1.2 类选择器2.1.3 id选择器2.1.4 通配符选择器 2.2 基础选择器小结2.3 复合选择器2.3.1 后代选择器 3.元素属性3.1 字体元素3.2 文本属性3.3 背景属…

滨海县一中学被指为苏醒全国感恩教育巡回演讲营销搭台

梦想与爱同行—苏醒全国感恩教育巡回演讲活动今天下午一点半在滨海西湖路一中操场举行,数千学生和家长参加。 苏醒全国感恩教育巡回演讲开始,苏醒先生先用一口流利的英语做自我介绍,然后又用中文向前来参加的学生和学生家长介绍说&#xff0…

FS4055B是一款3.2V最高3.6V磷酸铁锂充电IC

FS4055B是一款3.2V最高3.6V磷酸铁锂充电IC,输入电源正负极反接保护的单芯片,兼容大小 REV_1.0 是一款完整的单节锂电池充电器,电池正负极反接保护、 3mA-500mA 充电电流。采用涓流、 恒流、恒压控制,SOT23-5 封装与较少的外部元件…

【MySqL】 表的创建,查看,删除

目录 一.使用Cmd命令执行操作 1.使用( mysql -uroot -p)命令进入数据库 2.创建表之前先要使用数据库 3.创建表之前要先确定表的名称,列名,以及每一列的数据类型及属性 4.创建表 注意: 5.查看所有已创建的表 6.查看单表 …

H3C防火墙单机旁路部署(网关在防火墙)

防火墙旁路部署在核心交换机上,内网有三个网段vlan 10:172.16.10.1/24、vlan 20:172.16.20.1/24、vlan30:172.16.30.1。要求内网网关在防火墙设备上,由防火墙作为DHCP服务器给终端下发地址,同时由防火墙来控…

算法笔记Day1 | 时间复杂度和空间复杂度的七七八八

文章目录 时间空间复杂度1. 时间空间复杂度的重要性(作用)2. 时间复杂度和大O表示法1)算法图解2)代码随想录3)王道《数据结构》 3. 大O指的是最糟的情形和一般的情形1)大O表示的是一般情况,并不是严格的上界2&#xff…

海量请求下,高并发接口的设计思路

1. 背 景 虽然现在很多人,动不动就提什么高并发、请求量多大,数据量多少多少,但我可以很认真地说,那都是他妈的在吹牛! 生产环境,真正有大请求量的,就那么几个业务场景,而且多是面…

应急物流 | 灾后早期阶段多目标选址路径问题的混合元启发式算法

解读作者:李奡,闫同仁 A hybrid meta-heuristic algorithm for the multi-objective location-routing problem in the early post-disaster stage Tongren Yan, Fuqiang Lu, Suxin Wang, Leizhen Wang, Hualing Bi Journal of industrial and managem…

云原生应用架构

本博客地址:https://security.blog.csdn.net/article/details/130566883 一、什么是云原生应用架构 成为云原生应用至少需要满足下面几个特点: ● 使用微服务架构对业务进行拆分。单个微服务是个自治的服务领域,对这个领域内的业务实体能够…

Nature | 通用医学人工智能基础模型

编译 | 李汭璨 审稿 | 王建民 今天为大家介绍的是来自Eric J. Topol和 Pranav Rajpurkar研究团队的一篇医学人工智能的综述论文。高度灵活、可重复使用的人工智能模型的极快发展可能会为医学带来新的能力。作者提出了医学人工智能的新范式,称为通用医学人工智能&…

磁盘和文件系统管理

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…

Deepnlp EquationGPT公式搜索引擎搜Latex源码和论文

公式搜索引擎常用功能 DeepNLP的EquationGPT用的比较多功能: 网址:EquationGPT Largest Equation Database & Engine powered by GPT 1. 公式搜索引擎,输入公式搜索数学公式的Latex代码和相应论文。 2. 目前覆盖了计算机(机器学习/AI)/ 数学/物理…

【设计模式】总结篇

【C语言部分】总结篇 【操作系统】总结篇 【数据库】总结篇 【计算机网络】总结篇 本文目录 1. 说说什么是单例设计模式,如何实现2. 简述一下单例设计模式的懒汉式和饿汉式,如何保证线程安全3. 说说工厂设计模式,如何实现,以及它的…

判断无穷积分是绝对收敛还是条件收敛---练习题

本篇文章重点讨论一般无穷积敛散性的判别。(即被积函数在所积区间符号不定,既有正的,也有负的) 不论是绝对收敛还是条件收敛,它本身一定是 收敛的。 狄利克雷判别法: 例题: 首先,将…

(4)Qt——基本组件

目录 1. Designer 设计师** 2. Layout 布局*** 3. 基本组件 3.1 QWidget** 3.2 ui指针 3.3 QLabel 标签** 3.4 QAbstractButton 按钮类** 3.5 QLineEdit 单行文本输入框** 3.6 QComboBox 组合框** 3.7 一组与数值相关的组件* 1. Designer 设计师** Designer是一款独立的用于设计…

【Java】进程通信(共享内存)

🎈博客主页:🌈我的主页🌈 🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏 🎈本文由 【泠青沼~】 原创,首发于 CSDN🚩&#x1f…

PyQt5桌面应用开发(12):QFile与线程安全

本文目录 PyQt5桌面应用系列segment faultgdb backtraceopen & readQFile总结 PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQt5桌面应用开发(2):事件循环 PyQt5桌面应用开发(3&…

怎么恢复回收站?分享4个宝藏方法!

案例:怎么恢复回收站 【请问大家怎么恢复误删的文件呀?如果回收站被清空了,又应该怎么恢复呢?】 电脑回收站是我们存储被删除文件的地方。但是有时候,我们会不小心把一些重要的文件或者照片误删了。这时候&#xff0…