一、背景最近脑子瓦特了,无法专心学习,只能写写逆向了。记得前端时间也有人问过我关于某条_signature参数问题,现在就写篇文章叭。该文章主要提供交流学习使用,请勿利用其进行不当
一、背景
最近脑子瓦特了,无法专心学习,只能写写逆向了。记得前端时间也有人问过我关于某条_signature参数问题,现在就写篇文章叭。
该文章主要提供交流学习使用,请勿利用其进行不当行为!
如本篇文章侵犯了贵公司的隐私,请联系我马上删除!
如因滥用解密技术而产生的风险与本人无关!
备注:本文仅仅分析短_signature参数,长_signature参数下次再解析。
二、正文
1、找到_signature位置
打断点分析:
调试器调试
很明显_signature参数通过j函数生成,进去看下j函数详情并断点调试:
分析后发现,真正生成_signature参数的函数:
n = window.byted_acrawler
a = n.sign
a.call(n, o)
o的值为:
{url:'xxxxxxxxxxxx'}
byted_acrawler是什么?全局搜索一下:
上面我们发现两个东西:
1、
2、
那么我们先模拟一下浏览器生成_signature参数
2、模拟生成_signature参数
可以正常生成!!!
3、逻辑&扣代码
3.1扣代码
将整一个acrawler.js直接扣下来,通过node运行:
报错!补代码
3.2补代码
既然浏览器可以正常运行,但是通过node无法运行,那么肯定就是环境问题,既然涉及浏览器环境,那么就肯定和window属性有关!补window属性!
var window = global;
不存在referrer属性?百度一下referrer属性在哪!?
在 window.document里面。那么我们直接去浏览器调试调试,看看里面的referrer里面到底是什么!
补上之后,再运行,发现并没有报错了!补完之后如下:
3.3补上逻辑,生成_signature参数
var i = {url:'xxxxxx'}
var a = window.byted_acrawler;
var r = a.sign;
var c = r.call(a,i);
console.log(c)
补完之后发现并不存在a.sign函数:
我们打印一下window看看,并不存在byted_acrawler:
依然还是原本的解析:既然浏览器可以生成,node不可以,那么就是环境的问题。似乎好像都没啥问题了,后来发现了一个传入参数e里面存在三目运算符,很有可能就是这里存在问题:
[, , "undefined" != typeof exports ? exports : void 0, "undefined" != typeof module ? module : void 0, "undefined" != typeof define ? define : void 0, "undefined" != typeof Object ? Object : void 0, void 0, "undefined" != typeof TypeError ? TypeError : void 0, "undefined" != typeof document ? document : void 0, "undefined" != typeof InstallTrigger ? InstallTrigger : void 0, "undefined" != typeof safari ? safari : void 0, "undefined" != typeof Date ? Date : void 0, "undefined" != typeof Math ? Math : void 0, "undefined" != typeof navigator ? navigator : void 0, "undefined" != typeof location ? location : void 0, "undefined" != typeof history ? history : void 0, "undefined" != typeof Image ? Image : void 0, "undefined" != typeof console ? console : void 0, "undefined" != typeof PluginArray ? PluginArray : void 0, "undefined" != typeof indexedDB ? indexedDB : void 0, "undefined" != typeof DOMException ? DOMException : void 0, "undefined" != typeof parseInt ? parseInt : void 0, "undefined" != typeof String ? String : void 0, "undefined" != typeof Array ? Array : void 0, "undefined" != typeof Error ? Error : void 0, "undefined" != typeof JSON ? JSON : void 0, "undefined" != typeof Promise ? Promise : void 0, "undefined" != typeof WebSocket ? WebSocket : void 0, "undefined" != typeof eval ? eval : void 0, "undefined" != typeof setTimeout ? setTimeout : void 0, "undefined" != typeof encodeURIComponent ? encodeURIComponent : void 0, "undefined" != typeof encodeURI ? encodeURI : void 0, "undefined" != typeof Request ? Request : void 0, "undefined" != typeof Headers ? Headers : void 0, "undefined" != typeof decodeURIComponent ? decodeURIComponent : void 0, "undefined" != typeof RegExp ? RegExp : void 0]
直接浏览器和node分别调试一下里面的值:
很明显就是这里的问题了!将其改为:
[, , void 0, void 0, "undefined" != typeof define ? define : void 0, "undefined" != typeof Object ? Object : void 0, void 0, "undefined" != typeof TypeError ? TypeError : void 0, "undefined" != typeof document ? document : void 0, "undefined" != typeof InstallTrigger ? InstallTrigger : void 0, "undefined" != typeof safari ? safari : void 0, "undefined" != typeof Date ? Date : void 0, "undefined" != typeof Math ? Math : void 0, "undefined" != typeof navigator ? navigator : void 0, "undefined" != typeof location ? location : void 0, "undefined" != typeof history ? history : void 0, "undefined" != typeof Image ? Image : void 0, "undefined" != typeof console ? console : void 0, "undefined" != typeof PluginArray ? PluginArray : void 0, "undefined" != typeof indexedDB ? indexedDB : void 0, "undefined" != typeof DOMException ? DOMException : void 0, "undefined" != typeof parseInt ? parseInt : void 0, "undefined" != typeof String ? String : void 0, "undefined" != typeof Array ? Array : void 0, "undefined" != typeof Error ? Error : void 0, "undefined" != typeof JSON ? JSON : void 0, "undefined" != typeof Promise ? Promise : void 0, "undefined" != typeof WebSocket ? WebSocket : void 0, "undefined" != typeof eval ? eval : void 0, "undefined" != typeof setTimeout ? setTimeout : void 0, "undefined" != typeof encodeURIComponent ? encodeURIComponent : void 0, "undefined" != typeof encodeURI ? encodeURI : void 0, "undefined" != typeof Request ? Request : void 0, "undefined" != typeof Headers ? Headers : void 0, "undefined" != typeof decodeURIComponent ? decodeURIComponent : void 0, "undefined" != typeof RegExp ? RegExp : void 0]
即:
"undefined" != typeof exports ? exports : void 0, "undefined" != typeof module ? module : void 0
改为
void 0, void0
改完之后依然还是存在报错:
还是和上面一样的解析:既然浏览器可以生成,node不可以,那么就是环境的问题。补window属性值!
window.location = {
hash: "",
host: "www.toutiao.com",
hostname: "www.toutiao.com",
href: "https://www.toutiao.com/",
origin: "https://www.toutiao.com",
pathname: "/",
port: "",
protocol: "https:"
}
补完之后依然报错:
继续补:
window.navigator = {
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
终于终于!!!最后可以生成了!
三、代码
var window = global;
window.document = {
referrer:"https://so.toutiao.com/"
}
window.location = {
hash: "",
host: "www.toutiao.com",
hostname: "www.toutiao.com",
href: "https://www.toutiao.com/",
origin: "https://www.toutiao.com",
pathname: "/",
port: "",
protocol: "https:"
}
window.navigator = {
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
// 此部分和acrawler.js一样 =========
var glb;
(glb = "undefined" == typeof window ? global : window)._$jsvmprt = function(b, e, f) {
//...................省略
,
(glb = "undefined" == typeof window ? global : window)._$jsvmprt("484e4f4a403f5243000d2d1aea78184c36c3d671000000000000ab440200
//...........................省略
, "undefined" != typeof RegExp ? RegExp : void 0]);
// =============
var i = {url:'xxxxxx'}
var a = window.byted_acrawler;
var r = a.sign;
var c = r.call(a,i);
console.log(c)
四、说明
上面的结果很明显和浏览器显示的_signature参数短很多,如果有详细看上文的话,会发现为什么那个init函数没了?
原因:加了那个init函数之后会报错!
至于怎么解决此报错呢?!又改如何生成长_signature参数呢?!
不好意思!要去吃饭了!下篇文章再说叭!