样品网址:aHR0cHM6Ly93d3cuemhpaHUuY29tLw==
js分析
在搜索的时候,请求头中会存在一个x-zse-96的参数,这个参数是加密的,本篇文章主要分析这个参数是如何生成的
直接在全局中搜索
发现只有两处地方引用到,那么直接打上断点刷新
此时发现参数已经生成,前面的【2.0_】是固定值,后面的【y】是前面的【O.signature】
继续往前看【O】,这是由一个自执行函数生成的,在里面也下一个断点
这里有三个参数,第一个【e】是请求的地址,第二个【t】是请求体,第三个【n】是一个对象,里面又有三个值,其中【zse93】是另一个请求头的值,是一个定值,【dc0】是cookie中的【d_c0】的值,还有一个【xZst81】是空的,可以不用管
接着的参数【s】就是过滤掉布尔值为false的值然后进行拼接,所以实际【s】就是【{x_zse_93}+{path}+{d_c0}】
然后我们需要的参数【signature】就是【s】经过两个函数生成的,那么首先来看看【f】函数
看到返回值是一个长度32的字符串,猜测这个函数很有可能是一个md5的计算,从在线网站计算一下对比,发现这个就是一个标准的md5算法
接着就是【u】函数
这个就是我们需要的结果,跟进去看看
接着在单步调试的时候,发现会在各个函数之间反复横跳。看到这个前面有一个很长的字符串【AxjgB5MAnACoAJwBpAAAABAAIAKcAqgAM*****】,这种很有可能就是jsvmp。
jsvmp分析
jsvmp就是将js源代码首先编译为字节码,得到的这种字节码就变成只有操作码(opcode)和操作数(Operands),这是其中一个前端代码的保护技术。
整体架构流程是服务器端通过对JavaScript代码词法分析 -> 语法分析 -> 语法树->生成AST->生成私有指令->生成对应私有解释器,将私有指令加密与私有解释器发送给浏览器,就开始一边解释,一边执行。
在客户端中,通过特定的解释器,不断执行一条一条的指令
既然是jsvmp,那么肯定会有vmp的一些特征
这里的【G】就是vm初始化,这里有几个参数需要特别注意
[table]
[tr]
[td]参数[/td]
[td]映射意义[/td]
[/tr]
[tr]
[td]this.r