h5st 4.3版本代码研究
背景介绍
最近比较悠闲,于是没事研究了一下某东的h5st代码,2024年新鲜出炉的前端加密代码;
最大的惊喜并不是算法的复杂,在逆向破解代码的过程中,对js加密混淆有了新的认识;
于是心血来潮,回到这里,写一份研究总结,供技术交流分享。
代码分析
拿到的代码是h5st的4.3版本
使用开发者工具,显示的风格是这样的:
直接搜索关键字"h5st",整份文件里面就出现了2次,所以这里很容易找到出口。(PS:如果还有4.4版本,建议把这个关键字也加密,加大破解难度)
注意看10787行这个switch语法,在研究的过程中,这个语法出现概率非常高,它的作用就是把串行的代码用switch改变了代码的书写顺序,例如:
var a = 1;
var b = a+1;
var alert(b)j
加密之后就变成了:
var config = '3|1|2';
var lines = config.split('|');
var i = 0;
switch(lines[i++]){
case 1:
var b = a+1;
break;
case 2:
return alert(b);
case 3:
var a = 1;
break;
}
还有就是变量的混淆,总体上分为两类:
// 原始代码
alert('hi'); // 加密后
function a1(t,r){
return t(r)
}
function b1(t,r){
return ['','hi'][t-r];
}
a1(alert,b1(699,698));
整个研究过程中,这些加密顶多是费点时间,要说最痛苦的,莫过于这一段:
function Hv(t, r, n, e, o, i, u) {
try {
var a = t[i](u)
, c = a.value
} catch (t) {
return void n(t)
}
a.done ? r(c) : Kv.resolve(c).then(e, o)
}
这种不是串行的代码,类似无限递归的函数,理解起来最为费劲;
所以算法里面,最让人头痛的也是第8个关键参数,因为很难找到加密的原始字符串来源是什么。
庆幸的是,如果不是要求很高,那么可以按照它的格式,自己撰写一个,不需要去研究具体来源;
PS:如果想研究每个字段的计算过程,那么参考搜索的代码是"switch (t[kn(741, 0, p)] = t.next) "
算法总结
位置 | 字段名 | 说明 | 值格式 | 说明 |
1 | time | 时间字符串 | 20240131103354895 | 当前时间 |
2 | fingerPrint | 指纹 | hnmy1t6fytuu1kt7 | 自定义算法,就是随机字符串删删减减,固定字符池:kl9i1uct6d |
3 | appId | 应用编号 | 95cb4 | 业务页面的appId |
4 | token | 令牌 | tk02wad0d1bee41lMiszWWgySTRKO.. | 下面这个对象的值.join('')
{ |
5 | sgin | 签名 | c40d194fb4... |
对请求参数进行HmacSHA256加密 加密使用的key生成算法 最初原始字符串:token + fp + timestamp + "22" + appid + "Z=<J_2"; 从token中获取签名算法字符串,类似:3+3+3+2x2 数字表示用第一套加密,运算符,表示是拼接还是多种加密 |
6 | version | 算法版本 | 4.3 | 固定值 |
7 | timestamp | 毫秒时间戳 | 1706668434895 | 当前时间 |
8 | sent | 环境数据 | bb7ef745bba685... |
AES-128-CBC加密 原始字符串参考: { |
测试过程
好不容易研究完准备验收
发现jd的所有接口都不验证这个参数
所以研究就到此为止了~
研究总结
最大的心得就是:费脑、头晕、掉发
但研究的过程中,就像玩一个悬疑游戏一样,很容易沉迷;
随着谜底一点点解开,又会给人一种成就感,同时学到各种混淆加密js的方法。
(PS:之前的4.2甚至更老的版本,我没看过,从网上其它小伙伴的截图来看,感觉代码难度差别挺大的)
h5st 4.3版本代码研究的更多相关文章
- Ningx代码研究.
概述 研究计划 参与人员 研究文档 学习emiller的文章 熟悉nginx的基本数据结构 nginx 代码的目录结构 nginx简单的数据类型的表示 nginx字符串的数据类型的表示 内存分配相关 ...
- [转载]iOS6新特征:UICollectionView官方使用示例代码研究
原文地址:iOS6新特征:UICollectionView官方使用示例代码研究作者:浪友dans 注:这里是iOS6新特征汇总贴链接 iOS6新特征:参考资料和示例汇总 这个链接可以学习到UIColl ...
- dedecms代码研究二
dedecms代码研究(2)从index开始现在继续,今天讲的主要是dedecms的入口代码.先打开index.PHP看看里面是什么吧.打开根目录下的index.php嗯映入眼帘的是一个if语句.检查 ...
- OpenGL10-骨骼动画原理篇(3)-Shader版本代码已经上传
视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 接上一个例程OpenGL10-骨骼动画原理篇(2),对骨骼动画 ...
- 一段markdown编辑器代码研究
一段markdown编辑器代码研究 说明 代码在 https://github.com/dukeofharen/markdown-editor 之所以选择这个来分析是一方面是因为它的代码结构比较简单, ...
- (转)GitHub Desktop 拉取 GitHub上 Tag 版本代码
转自:GitHub Desktop 拉取 GitHub上 Tag 版本代码 一直在使用 GitHub Desktop 图形化 git 管理工具,统一项目框架版本时需要切换到ThinkPHP Tag 分 ...
- *DataSet序列化,这段代码研究
DataSet序列化,这段代码研究研究.学习学习. using System; using System.Collections.Generic; using System.Linq; using S ...
- Gradle 如何打包 Spring Boot 如何不添加版本代码
在 Gradle 中如何在打包的 Jar 中不包含版本代码? 在 bootJar 中,使用下面的代码进行打包不包含版本代码. archiveFileName = "${archiveBase ...
- CWMP开源代码研究——git代码工程
原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...
- faster RCNN(keras版本)代码讲解(3)-训练流程详情
转载:https://blog.csdn.net/u011311291/article/details/81121519 https://blog.csdn.net/qq_34564612/artic ...
随机推荐
- 技术文档 | OpenSCA技术原理之composer依赖解析
OpenSCA知识小课堂开课了! 今天主要介绍基于composer包管理器的组件成分解析原理. composer介绍 composer是PHP的依赖管理工具. 开发者受到Node.js的npm及Rub ...
- java进阶(27)--HashSet与TreeSet
一.HashSet: 1.特点:无序不可重复,实际上为放入HashMap中的key部分. 2.举例说明:
- 【日常踩坑】解决 kex_exchange_identification 报错
目录 踩坑 原因分析 解决办法 1. 临时关闭代理 2. 修改代理软件配置,22 端口走直连 3. 改用 HTTPS 协议,走 443 端口 参考资料 踩坑 最近在使用 git 时,发现 git pu ...
- 01-Linux命令和C语言基础
1 Linux开发环境搭建 1.1 虚拟机安装 1.安装VM Ware 2.安装ubuntu 分区 -- Linux没有盘符的概念 / -- 5000M /boot -- 系统启动过程中读取的重要文件 ...
- Oracle数据库期末考试--学堂在线
1.单选题 (2分) 在Oracle数据库中,下面哪类索引最适合SQL范围查找? 2.单选题 (2分) 在创建Oracle数据库表时,下面哪个元素不出现在CREATE TABLE语句中? 3.单选题 ...
- 【Altium Designer】五颜六色标识的PCB布板(增强PCB可视化特性)
出现上图中五颜六色的网络标识,对比各个网络会更加清晰,实现步骤如下 打开或关闭 View--->Net Color Override Active 快捷键 F5 设置 displa ...
- [转帖]TIDB - TIDB集群的扩容和缩容及TIUP指令说明
一.TIUP工具简介 前面介绍了使用TIUP搭建TIDB集群,本篇文章详细介绍下使用TIUP对集群进行扩容和缩容. 在面对双十一这种流量突峰的场景,我们平常的TIDB集群有可能承受不住,因此需要提前进 ...
- [转帖]KingbaseES 服务器运行参数分类
https://www.cnblogs.com/kingbase/p/16969149.html Kingbase 服务器运行参数分类 说明: KingbaseES 数据库中,服务器运行参数分为多种类 ...
- [转帖]Linux IO调度之队列、队列深度
有关数据结构 请求队列:struct request_queue 请求描述符:struct request 队列深度 可以在端口队列中等待IO请求数量: 具体代表其值的是request_queue的成 ...
- [转帖]SPEC测试arm服务器性能,SPECJVM2008测试处理器性能_服务器评测与技术-中关村在线...
首先,我们使用SPECJVM2008测试最新至强E5处理器的虚拟化性能. SPECJVM2008是一种通用的多线程Java基准测试工具,它能够反映JRE(Java Runtime Environmen ...