某东h5st 4.7 分析
声明
本文章中所有内容仅供学习参考,全源于作者的思路理解,不提供完整代码,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关
目标
目标:某东 h5st 4.7 分析
网址:aHR0cHM6Ly93d3cuamQuY29tLw==
流程分析
h5st后缀
首先找加密位置,可以用关键词搜索
发现通过window.PSign.sign异步生成了h5st
我们先处理colorParamSign的body
SHA256通过测试发现是标准的,所有我们可以直接用node的crypto-js模块
const CryptoJS = require("crypto-js");
CryptoJS.SHA256(JSON.stringify(colorParam.body)).toString()
body解完后我们回到window.PSign.sign继续调试
这是异步的写法,主要通过var u = S(e, t, r);里执行,我们继续调试
发现进入了控制流,那我们去分析这个控制流,像push、p[p.length - 1]、p.pop()这些的就直接过,看见有调用call方法的,我们打上断点调试
我们调试到case 98的时候f.call(p[p.length - 2], p[p.length - 1])生成了h5st的后缀
那我们步入调试,发现还是控制流,继续找call方法下断点,调试发现生成了一段明文,里面random是随机生成的,其他均可写死.
random怎么生成的?,我们可能跳步骤多了,所有需要重新调试(random也是在这个控制流中生成的)
可以发现在这个地方生成的
我们进入s方法,发现除random以外的也都在这生成的,主要就是环境的检测,这里我们就不继续分析了
那我们继续往下调试,发现进行了数据格式的转换,把字符串变成WordArray 对象,你可以用node的crypto-js模块转换
("_M6Y?dvfN40VMF[X"和"0102030405060708"写死)
const CryptoJS = require("crypto-js");
CryptoJS.enc.Utf8.parse("_M6Y?dvfN40VMF[X")
我们也可以扣方法,这样可以省去一大堆麻烦
我们继续调试,到这一块,发现生成的格式很像对称加密,这就是h5st后缀WordArray生成的地方,但这个是魔改了的,我们可以直接扣方法
我们折叠代码与调试,发现这些方法最终是在HS里面,我们可以直接去扣他的代码,这里我就跳过了
如果你能把HS扣下来,h5st你也算是完成一大半了,后面就是调用这些方法执行
那我们继续往下走还要通过魔改的base64编码转换WordArray得到最终的h5st后缀,这个encode方法也在HS里,直接调用即可
h5st后缀拿到手我们就可以跳出这个方法了,回到上一个控制流继续调试
h5st的拼接
调试到这发现h5st在这生成,我们步入,发现又进入了控制流,还是找call方法打断点调试
这里生成了时间戳我们直接补上,继续往下走
这里生产了h5st的前缀,带上时间戳和"yyyyMMddhhmmssSSS"拿到前缀,这里我们可以直接扣这个format方法("yyyyMMddhhmmssSSS"写死)
继续走来到test方法
这里的前缀加了’07’,不知道大家发现没
其中token、fp、appid都是接口返回的,token会变,你可以尝试去找这个接口
这个test方法也是接口返回的,他的加密算法会变,也是魔改的,当然也在HS里,你直接调用即可(可以先写死一套)
继续往下,这里携带了test的密文,我们步入进去又是一个控制流,我们继续断点
走到这里又调用的HS的方法对test密文和params进行的二次加密,我们拿到这个密文就可以跳出当前函数,回到上个控制流
二次密文结果是
最后我们继续往下走,走到这里把我们前面的拼接一下h5st就成功得到了
结尾
h5st主要的还是扣HS,其他都是调用HS生成,祝大家顺利拿到结果