(没时间的可以直接看“算法总结”)

背景介绍

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

算法总结

在这里插入图片描述

测试过程

好不容易研究完准备验收
发现jd的所有接口都不验证这个参数
所以研究就到此为止了~ 😄

研究总结

最大的心得就是:费脑、头晕、掉发
但研究的过程中,就像玩一个悬疑游戏一样,很容易沉迷;
随着谜底一点点解开,又会给人一种成就感,同时学到各种混淆加密js的方法。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐