【Js逆向】某头条 jsvmp '_signature' 值

jsvmp 特点

jsvmp 有一个最大的特点,就是有一长串字符串._$jsvmprt(...),算法代码的具体细节都在 这个一节长字符串里,所有在算法的扣取上就很不友好,本案例采取补环境的方式实现。

(glb = "undefined" == typeof window ? global : window)._$jsvmprt(.....)

mark

逻辑分析

定位加密入口

添加 XHR 断点,然后向下滑动,断点短住

mark

搜索 _signature,在关键位置下断点,然后在刷新页面

mark

断点位置 r 变量,来自于 S(n,e) 函数计算,该 S函数就是入口函数

mark

分析加密得值逻辑

进入 S 函数,分析这一段逻辑,其实调用的就是

// o 是 {'url':'xxxx'}
window.byted_acrawler.sign(o)

mark

进入 window.byted_acrawler.sign 函数,来到 acrawler.js 文件,也就是 jsvmp 的 Js 文件

mark

补环境

acrawler.js 文件全部复制下来,代码起始有一句(var glb; glb = "undefined" == typeof window ? global : window) ,这是检查当前是什么环境的,是 node 还是 浏览器

有两种处理办法

  • 使用 jsdom 补充 window
  • 使用 window = global

当然还有其他更好的方式,这里采用第二次

mark

这样就和浏览器一样了

mark

加上一个输出,尝试使用 node浏览器 执行,查看两者的区别

浏览器正常得值,node 报错,说明 node 缺少一些条件

mark

在浏览器添加 条件断点,查看 referrer 是什么

// referrer 来自于 document,继续 添加环境

document = {
    referrer: ''
}

mark

node 继续执行,发现没有 sign ,说明 node 还被检查着

mark

经过分析,发现这些代码,exportsmodule,这是 node 才存在的东西,直接改成 undefined

当然也有更好的方式直接过滤这些特征

// node true  浏览器 false
"undefined" != typeof exports

// node true  浏览器 false
"undefined" != typeof module

mark

继续执行,缺少 href ,就根据浏览器的插装 输出 补充就好了

mark

然后是 缺少 ‘protocol’

location = {
    href:'',
    protocol:'https:'
}

mark

然后是 缺少 userAgent

navigator = {
    userAgent:'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}

mark

再次执行,出现结果

mark

因为校验的不严格,所以这个 短Cookie也是可以过的,长 Cookie 需要添加一些 Cookie 才行

mark

长 Cookie 需要加上其他的Cookie,这个 cookie 位置需要靠后,不然会被清空

如果是自己写的环境框架,就不需要担心 cookie 的位置

mark

为了稳定,请求头部还需要带一个随机 Cookie

mark

完整结构

mark

发表评论 / Comment

用心评论~