[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

一、背景

最近脑子瓦特了,无法专心学习,只能写写逆向了。记得前端时间也有人问过我关于某条_signature参数问题,现在就写篇文章叭。

该文章主要提供交流学习使用,请勿利用其进行不当行为!

如本篇文章侵犯了贵公司的隐私,请联系我马上删除!

如因滥用解密技术而产生的风险与本人无关! 

 备注:本文仅仅分析短_signature参数,长_signature参数下次再解析。

二、正文

1、找到_signature位置[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

打断点分析:

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

调试器调试

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

很明显_signature参数通过j函数生成,进去看下j函数详情并断点调试:

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

分析后发现,真正生成_signature参数的函数:

n = window.byted_acrawler
a = n.sign
a.call(n, o)

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

o的值为:

{url:'xxxxxxxxxxxx'}

 byted_acrawler是什么?全局搜索一下:

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

上面我们发现两个东西:

1、

<script src="//sf1-cdn-tos.toutiaostatic.com/obj/rc-web-sdk/acrawler.js" crossorigin="anonymous"></script>

2、

<script>
            window.byted_acrawler && window.byted_acrawler.init({
                aid: 24,
                dfp: !0
            })
        </script>

那么我们先模拟一下浏览器生成_signature参数

2、模拟生成_signature参数

<script src="//sf1-cdn-tos.toutiaostatic.com/obj/rc-web-sdk/acrawler.js" crossorigin="anonymous"></script>
<script>
    window.byted_acrawler && window.byted_acrawler.init({
        aid: 24,
        dfp: !0
    })
    var i = {url:''}
    var a = window.byted_acrawler;
    var r = a.sign;
    var c = r.call(a,i);
    document.write(c);
</script>

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

可以正常生成!!!

3、逻辑&扣代码

3.1扣代码

将整一个acrawler.js直接扣下来,通过node运行:

 [007]爬虫系列 | 某条加密参数_signature(短)逆向解析

报错!补代码

3.2补代码 

既然浏览器可以正常运行,但是通过node无法运行,那么肯定就是环境问题,既然涉及浏览器环境,那么就肯定和window属性有关!补window属性!

var window = global;

不存在referrer属性?百度一下referrer属性在哪!?

 [007]爬虫系列 | 某条加密参数_signature(短)逆向解析

在 window.document里面。那么我们直接去浏览器调试调试,看看里面的referrer里面到底是什么!

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

 补上之后,再运行,发现并没有报错了!补完之后如下:

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

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函数:

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

 我们打印一下window看看,并不存在byted_acrawler:

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

依然还是原本的解析:既然浏览器可以生成,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分别调试一下里面的值:

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

很明显就是这里的问题了!将其改为:

[, , 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

改完之后依然还是存在报错:

 [007]爬虫系列 | 某条加密参数_signature(短)逆向解析

 还是和上面一样的解析:既然浏览器可以生成,node不可以,那么就是环境的问题。补window属性值!

 [007]爬虫系列 | 某条加密参数_signature(短)逆向解析

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

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:"
}

补完之后依然报错:

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

继续补:

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"
}

 终于终于!!!最后可以生成了!

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

 三、代码

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函数没了?

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

 原因:加了那个init函数之后会报错!

[007]爬虫系列 | 某条加密参数_signature(短)逆向解析

 至于怎么解决此报错呢?!又改如何生成长_signature参数呢?!

不好意思!要去吃饭了!下篇文章再说叭!

上一篇:PYTHON 100days学习笔记007-3:字符串和常用数据结构


下一篇:python__007内置函数