【JavaScript 逆向】今日头条 jsvmp,_signature 参数分析

article/2025/9/19 1:55:10

前言

现在一些网站对 JavaScript 代码采取了一定的保护措施,比如变量名混淆、执行逻辑混淆、反调试、核心逻辑加密等,有的还对数据接口进行了加密,这次案例是通过补环境过 jsvmp。

声明

本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!

案例分析

目标网址:

aHR0cHM6Ly93d3cudG91dGlhby5jb20v

数据接口:

aHR0cHM6Ly93d3cudG91dGlhby5jb20vYXBpL3BjL2xpc3QvZmVlZD9jaGFubmVsX2lkPTA=

以上均做了脱敏处理,Base64 编码及解码方式:

import base64
# 编码
# result = base64.b64encode('待编码字符串'.encode('utf-8'))
# 解码
result = base64.b64decode('待解码字符串'.encode('utf-8'))
print(result)

常规 JavaScript 逆向思路

一般情况下,JavaScript 逆向分为三步:

  • 寻找入口:逆向在大部分情况下就是找一些加密参数到底是怎么来的,关键逻辑可能写在某个关键的方法或者隐藏在某个关键的变量里,一个网站可能加载了很多 JavaScript 文件,如何从这么多的 JavaScript 文件的代码行中找到关键的位置,很重要;
  • 调试分析:找到入口后,我们定位到某个参数可能是在某个方法中执行的了,那么里面的逻辑是怎么样的,调用了多少加密算法,经过了多少赋值变换,需要把整体思路整理清楚,以便于断点或反混淆工具等进行调试分析;
  • 模拟执行:经过调试分析后,差不多弄清了逻辑,就需要对加密过程进行逻辑复现,以拿到最后我们想要的数据

接下来开始正式进行案例分析:

寻找入口

进入到头条首页,能看到一些推荐新闻,右键查看网页源代码,ctrl + f 能搜到这部分内容,证明在 HTML 页面的原始文档中,所以一开始的这些新闻标题加 url 是能直接通过 requests + xpath 获取到的:

但是接着往下滑,页面在未刷新的情况下加载出了新的新闻, 且在网页源代码中搜索不到这些标题,证明这些新闻是同过 ajax 加载的,需要先通过抓包到数据接口再进行分析,F12 打开开发者人员工具,切换到 network 查看网络抓包请求,ajax 加载有特殊的请求类型 xhr,筛选栏中选择 xhr 寻找接口,接口为 feed?channel_id=XXX:

请求链接中有个加密参数 _signature:

逆向分析

通过 Fiddler 对其进行 Hook,当然也可以直接 ctrl + shift + f 全局搜索 _signature 定位:

(function () {var open = window.XMLHttpRequest.prototype.open;window.XMLHttpRequest.prototype.open = function (method, url, async) {if (url.indexOf("_signature") != -1) {debugger;}return open.apply(this, arguments);};
})();

断住后向上跟栈:

跟到 index.5fd0992e.js 文件中,点击左下角 { } 对其进行格式化操作,ctrl + f 局部搜索 _signature,寻到其定义生成的位置,有六个结果,在第 13263 行打下断点调试分析:

n 即为加密后的 _signature 值,向上找参数 n 的定义位置,在第 13262 行:

var n = I(F.getUri(e), e);
  • e:Object 对象
  • F.getUri(e):传入一些链接,如热搜词、推荐新闻等

所以需要跟进到 I 函数中,其定义在第 13128 行,第 13141 行是个三目表达式:

(null === (n = window.byted_acrawler) || void 0 === n || null === (a = n.sign) || void 0 === a ? void 0 : a.call(n, o)) || ""

在该行打下断点调试分析: 

a.call(n, o) 即 _signature 的值,n 为对象,c 为参数,是一个链接,所以跟进到 a 中:

在 acrawler.js 文件的第 213 行,同样进行格式化操作,这个文件就是头条的 jsvmp,这里通过补环境解决,将整段 js 文件扣下来,保存到 node 环境下运行:

补环境推荐:Web technology for developers | MDN

报错显示 referrer 未定义:

document.referrer:获取前一页面的URL地址,在控制台打印一下相关内容然后补进去;

var document = {referrer: "https://www.toutiao.com/",
}

或者直接引入 jsdom 库:jsdom - npm

// 安装
npm i jsdom -g
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
var document = dom.window.document;

报错显示 window 未定义:

// node 环境下为 global,浏览器环境下为 this
window = global;

报错显示 sign 属性未定义:

该 js 文件最后有如下部分,进行了环境检测,将红框部分删掉即可:

报错显示 href 未定义:

控制台打印后补上:

var location = {href: "https://www.toutiao.com/?wid=1657855126033",
}

报错显示 userAgent 未定义:

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

报错显示 length 未定义:

经调试,length 检测的是 location.protocol 属性,即当前 url 的协议部分,将其补上即可:

var location = {href: "https://www.toutiao.com/?wid=1657855126033",protocol: "https:",
}

以上环境补充完毕,成功获取到加密数据:

注意:url 不要填错了,否则会得不到数据

会发现得到的结果比我们之前看到的 _signature 参数的值要短上许多,经过测试也能成功获取到数据,没有影响,原来的 _signature 参数长是因为加入了 cookie 校验,加上如下代码即可,需要使用到 jsdom 库:

const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = global;
var document = dom.window.document;
var params = {location:{href: "https://www.toutiao.com/?wid=1657855126033",protocol: "https:",},navigator:{userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",},
};Object.assign(window, params);function setCookie(name, value, seconds) {seconds = seconds || 0;var expires = "";if (seconds != 0 ) {expires = "; expires=" + (new Date((new Date).getTime() + 18E5)).toGMTString() + "; path=/;";}document.cookie = name + "=" + escape(value) + expires + "; path=/";
}cookies = "__ac_nonce=063313d37006f1a60b85d; __ac_signature=_02B4Z6wo00f01.CCQXQAAIDCJ0RsDRVvDHfwokXAAJ8bce; tt_webid=7147561357562660360; local_city_cache=%E6%AD%A6%E6%B1%89; csrftoken=116ac569546e65b98b3e6b1dd0489a97; ttcid=76c0e549d78e474ea9ae750a76cffd6216; s_v_web_id=verify_l8icmxyc_x8LU4OkA_w4tw_4uNo_96iI_H6cI4tjj0FTA; _tea_utm_cache_24=undefined; ttwid=1%7C-l6HuqfxspAYL7U-ypbDWFDV9IYiTyl4V046gr_qs9c%7C1664171529%7Cab8aad75e3dc5f2a3eb2b0551828f577dcff3ebedf23f06ec1141ceb27945092; MONITOR_WEB_ID=17890c79-d9c7-4dc5-b9d6-8b589425a66c; tt_scid=ajUodQQe3i2zo1fSD.Gn2MbGg2z9jD6ARI0pRExxhEFdXSuPtLsYpjiHN9oqECUB12c6; msToken=dVl_W1W6M6Gd7oZ-8N8ELKYOEZWFnZteIh1eiaHnU8I3eNLxczIKeoEBMKxQ5iIOhXLJJvOK6exnqRNwM9K0tS4Hul9aACaVux3GEPFgc_U=";// 格式化 cookies ---> json
for(let cookie of cookies.split(";")){tmp = cookie.split("=");setCookie(tmp[0], tmp[1], 1800);
}

以下为长度对比:

与抓包到的  _signature 参数对比,长度一样:

运行结果:


http://chatgpt.dhexx.cn/article/HPb8mGI8.shtml

相关文章

【JavaScript 逆向】拼多多 anti_content 参数逆向解析

前言 现在一些网站对 JavaScript 代码采取了一定的保护措施&#xff0c;比如变量名混淆、执行逻辑混淆、反调试、核心逻辑加密等&#xff0c;有的还对数据接口进行了加密&#xff0c;这次案例是通过补环境过加密。 声明 本文章中所有内容仅供学习交流&#xff0c;相关链接做…

CTF逆向基础

更多资源请进入&#xff1a;https://github.com/SycloverTeam/SycRevLearn 查看。 1 IDA定位main函数 运行T1.exe。 将可执行程序放入IDA中&#xff0c;并查找字符。 双击。 按F5&#xff0c;进入代码。 可以对函数进行重新命名&#xff0c;此时也已经得到了flag。 2 …

[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

您可能之前看到过我写的类似文章&#xff0c;为什么还要重复撰写呢&#xff1f;只是想更好地帮助初学者了解病毒逆向分析和系统安全&#xff0c;更加成体系且不破坏之前的系列。因此&#xff0c;我重新开设了这个专栏&#xff0c;准备系统整理和深入学习系统安全、逆向分析和恶…

逆向--基础知识篇

基础知识 可执行文件 计算机中可以被直接执行的程序被称之为可执行文件&#xff0c;可执行文件中是由指定操作系统的可执行文件格式规范与当前CPU机器指令码组成。不同的操作系统、不同的CPU之间的可执行文件都可能存在或多或少的差异。本篇主要以Windows操作系统、x86架构的…

逆向入门到入土

第一章 概述 学了几个月的逆向&#xff0c;记得10月份国庆节刚开始学的时候 感觉找flag蛮有意思&#xff0c;看着一个up主的视频&#xff0c;那时候c语言也没怎么学&#xff0c;所以就单纯他怎么做&#xff0c;我自己怎么做&#xff0c;后面去一些ctf靶场做了几道题&#xff0…

BNU1064:人品问题

“人品既不能被创生&#xff0c;也不能被消灭。只能从一个人转移到另一个人&#xff0c;从一个层面转化到另一个层面&#xff0c;而在转移和转化的过程当中&#xff0c;人品的总和保持不变。” 至此引出人品学(Characterics)三定律&#xff1a; 第一定律&#xff1a;即人品守恒…

开发者的人品问题

程序员都知道&#xff1a;绝大多数编程中的问题&#xff0c;最终都是自己的人品问题。当遇到奇怪的问题时&#xff0c;我们总是喜欢怀疑系统、怀疑编译器、怀疑网络、怀疑硬件……就是不愿意怀疑自己的人品。熬过几个不眠之夜后&#xff0c;最终还是发现自己的代码存在人品问题…

A. 人品问题

A. 人品问题 Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: Main Submit Status PID: 1064 Font Size: - “人品既不能被创生&#xff0c;也不能被消灭。只能从一个人转移到另一个人&#xff0c;从…

BNU 1082 人品问题

这个题我是1A 突然觉得自己好叼 #include<bits/stdc.h> int main() {printf("25\n");return 0; }

人品问题

Description 网上出现了一种高科技产品——人品测试器。只要你把你的真实姓名输入进去&#xff0c;系统将自动输出你的人品指数。yzx不相信自己的人品为0。经过了许多研究后&#xff0c;yzx得出了一个更为科学的人品计算方法。这种方法的理论依据是一个非常重要的结论&#xff…

人品差的人,开口闭口都是这些话,一定不要深交!

说话之道&#xff0c;也是为人之道。 言语是思想的发声&#xff0c;从一个人的话里&#xff0c;往往可以听出其内心的声音。 从而初步判断出一个人的人品如何&#xff0c;是否值得交往。 那些人品差的人&#xff0c;开口闭口都离不开以下三种话&#xff0c;身边若有此类人&a…

adb logcat 命令行用法

本文为转载。 作者 :万境绝尘 转载请著名出处 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入 adb logcat --help 命令, 就可以显示该命令的帮助信息; [plain] view plain copy octopusoctopus:~$ ad…

java logcat_logcat -- 基本用法

1.Log类是一个日志类&#xff0c;我们可以在代码中使用logcat打印出消息 常见的日志记录方法有&#xff1a; v(String,String) --verbose 显示全部信息 d(String,String) -- debug 显示调试信息 i(String,String) -- information 显示一般信息 w(String,String) -- warning 显…

Logcat使用

目录 一、Logcat窗口 二、过滤 logcat 消息 三、Logcat的日志级别 四、设置日志信息颜色 一、Logcat窗口 Logcat在哪里&#xff1f;我都是直接点击工具栏中的Logcat图标。 Logcat窗口是用来查看应用日志的啦&#xff0c;我把每个部分标注了一下。 二、过滤 logcat 消息 一…

[Android]Logcat调试

Android采用Log(android.util.log)工具打印日志&#xff0c;它将各类日志划分为五个等级。 Log.e 打印错误信息 Log.w 打印警告信息 Log.i 打印一般信息 Log.d 打印调试信息 Log.v 打印冗余信息 不同等级的日志信息&#xff0c;在日志栏中会以不同颜色和等级(E、W、…

java logcat_使用 Logcat 写入和查看日志

Android Studio 中的 Logcat 窗口会显示系统消息,例如在进行垃圾回收时显示的消息,以及使用 Log 类添加到应用的消息。此窗口可以实时显示消息,也可以保留历史记录,因此您可以查看较早的消息。 要仅显示感兴趣的信息,您可以创建过滤器、修改消息中显示的信息量、设置优先级…

adb 抓取logcat 日志

&#xff08;1&#xff09;确保计算机里面有以下三个文件&#xff0c;才能抓取logcat日志&#xff08;只需要这三个文件就可以了&#xff09;。如果你的计算机有android sdk&#xff0c;以下三个文件会在你的sdk下的platform-tools文件夹里面。如果需要打印logcat日志的计算机没…

新版logcat最全使用指南

前言&#xff1a; 俗话说&#xff0c;工欲善其事&#xff0c;必先利其器。logcat是我们通过日志排查bug的重要武器之一。从某个版本开始&#xff0c;logcat改版了&#xff0c;改版之后&#xff0c;也许某些人觉得不太习惯&#xff0c;但是如果稍微学习下之后&#xff0c;就发现…

logcat命令介绍

1.android log系统 2.logcat介绍 logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息 log类是一个日志类&#xff0c;可以在代码中使用logcat打印出消息 常见的日志纪录方法包括&#xff1a; 方法 描述 v(String,String) (vervbose)显示全部信息d(Stri…

logcat命令总结

一、logcat命令介绍 1.android log系统 2.logcat介绍 logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息 log类是一个日志类&#xff0c;可以在代码中使用logcat打印出消息 常见的日志纪录方法包括&#xff1a; 方法 描述 v(String,String) (verv…