背景介绍

最近比较悠闲,于是没事研究了一下某东的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('')

{
"magic": "tk",
"version": "02",
"platform": "w",
'adler32': "其它参数的校验",
"expires": "41",
"producer": "l",
"expr": "类似3+3+3+2x2的base64编码,生成sign会用到"
"cipher": "HmacSHA256结果,跟fp有关"
}

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加密

原始字符串参考:

{
"sua": "Macintosh; Intel Mac OS X 10_15_7",
"pp": {},
"extend": {"wd": 0, "l": 0, "ls": 5, "wk": 0, "bu1": "0.1.9", "bu2": -1, "bu3": 43, "bu4": 0},
"random": "27_CACK7qU5",
"v": "h5_file_v4.3.3",
"fp": "xxx",
"bu1": "0.2.0"
}


测试过程

好不容易研究完准备验收

发现jd的所有接口都不验证这个参数

所以研究就到此为止了~


研究总结

最大的心得就是:费脑、头晕、掉发

但研究的过程中,就像玩一个悬疑游戏一样,很容易沉迷;

随着谜底一点点解开,又会给人一种成就感,同时学到各种混淆加密js的方法。

(PS:之前的4.2甚至更老的版本,我没看过,从网上其它小伙伴的截图来看,感觉代码难度差别挺大的)

h5st 4.3版本代码研究的更多相关文章

  1. Ningx代码研究.

    概述 研究计划 参与人员 研究文档 学习emiller的文章 熟悉nginx的基本数据结构 nginx 代码的目录结构 nginx简单的数据类型的表示 nginx字符串的数据类型的表示 内存分配相关 ...

  2. [转载]iOS6新特征:UICollectionView官方使用示例代码研究

    原文地址:iOS6新特征:UICollectionView官方使用示例代码研究作者:浪友dans 注:这里是iOS6新特征汇总贴链接 iOS6新特征:参考资料和示例汇总 这个链接可以学习到UIColl ...

  3. dedecms代码研究二

    dedecms代码研究(2)从index开始现在继续,今天讲的主要是dedecms的入口代码.先打开index.PHP看看里面是什么吧.打开根目录下的index.php嗯映入眼帘的是一个if语句.检查 ...

  4. OpenGL10-骨骼动画原理篇(3)-Shader版本代码已经上传

    视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 接上一个例程OpenGL10-骨骼动画原理篇(2),对骨骼动画 ...

  5. 一段markdown编辑器代码研究

    一段markdown编辑器代码研究 说明 代码在 https://github.com/dukeofharen/markdown-editor 之所以选择这个来分析是一方面是因为它的代码结构比较简单, ...

  6. (转)GitHub Desktop 拉取 GitHub上 Tag 版本代码

    转自:GitHub Desktop 拉取 GitHub上 Tag 版本代码 一直在使用 GitHub Desktop 图形化 git 管理工具,统一项目框架版本时需要切换到ThinkPHP Tag 分 ...

  7. *DataSet序列化,这段代码研究

    DataSet序列化,这段代码研究研究.学习学习. using System; using System.Collections.Generic; using System.Linq; using S ...

  8. Gradle 如何打包 Spring Boot 如何不添加版本代码

    在 Gradle 中如何在打包的 Jar 中不包含版本代码? 在 bootJar 中,使用下面的代码进行打包不包含版本代码. archiveFileName = "${archiveBase ...

  9. CWMP开源代码研究——git代码工程

    原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...

  10. faster RCNN(keras版本)代码讲解(3)-训练流程详情

    转载:https://blog.csdn.net/u011311291/article/details/81121519 https://blog.csdn.net/qq_34564612/artic ...

随机推荐

  1. 2019年第十届蓝桥杯国赛C++B组

    部分题目示意图来自网络,所以会带水印 最后编辑时间: 2021年5月12日 统一声明 如果不写默认带有常用头文件 如果不表明主函数默认表示在 void solve(){} 默认使用 using nam ...

  2. 第十二届蓝桥杯C++B组 A~H题题解

    本次题解格式参考 墨羽魂韶 本文所用的试题: 第十二届蓝桥杯大赛软件赛省赛_CB.pdf 最后编辑时间 2021年4月29日 21:27:46 2022 年 4月 8号 15点13分 填空题答案速览 ...

  3. vue学习笔记 二、环境搭建+项目创建

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...

  4. java进阶(28)--Map集合

    一.Map简介: 1.Map与collection没有继承关系 2.Map集合以key与value的方式存储数据   二.常用方法: 1.void clear():清空Map集合

  5. Redis 中bitMap使用及实现访问量

    1. Bitmap 是什么 Bitmap(也称为位数组或者位向量等)是一种实现对位的操作的'数据结构',在数据结构加引号主要因为: Bitmap 本身不是一种数据结构,底层实际上是字符串,可以借助字符 ...

  6. Vue之使用elementUI的upload上传组件导入csv文件

    最近干活的时候有个需求,需要将csv文件导入到mysql数据库中,前后端框架用的springboot+Vue,组件用的elementUI,下面将分步骤记录实现过程. 1.导入按钮部分: <el- ...

  7. js - 元素 scrollTop 设置无效的原因 及 解决办法

    原因 :  元素 display : flex ; 解决方法 : display : block;

  8. [转帖]Kubernetes 1.23:IPv4/IPv6 双协议栈网络达到 GA

    https://kubernetes.io/zh-cn/blog/2021/12/08/dual-stack-networking-ga/#:~:text=Kubernetes%201.23%EF%B ...

  9. [转帖]Nginx Rewrite重写功能

    目录 一.rewrite的概述 1.1.概述 1.2 跳转场景 1.3 跳转实现 1.4 Rewrite实际场景 二.常用的nginx正则表达式 三.rewrite命令 3.1 rewrite的语法格 ...

  10. [转帖]Jmeter学习笔记(二十一)——Concurrency Thread Group阶梯式加压测试

    https://www.cnblogs.com/pachongshangdexuebi/p/11739064.html 一.先安装jmeter的插件管理工具 1.下载地址:jmeter-plugins ...