• 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('')

    {
    "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=

    从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甚至更老的版本,我没看过,从网上其它小伙伴的截图来看,感觉代码难度差别挺大的)

  • 相关阅读:
    ElasticSearch系列——Kibana,核心概念
    力扣202-快乐数——哈希集合
    创建一个servlet处理用户登录请求,如果正确将用户名保存在session中,并跳转到主页面。要求,主页面要有登录权限。
    sql注入--通过修改数据完成注入--一文详细讲解
    freemarker导出word、word转pdf,带附件、图片等比缩放
    Maven历史版本下载
    Reactor的Publisher与Subscriber
    Ubuntu系统之管理文件权限一
    2022 年杭电多校第六场补题记录
    期货价值计算方法(期货的价值怎么计算)
  • 原文地址:https://www.cnblogs.com/wslcn/p/18002592