【js逆向实战】某讯漫画网站图片逆向

写在前面

本来想更安全开发系列,想着复现一下长亭的rad。里面涉及到好多js逆向的知识,正好学习了一波,本身js逆向也是一个大坑,说不定也能完善好多以前的爬虫项目。

学了也有一段时间了,来练练手吧

涉及到具体的隐私链接会脱敏处理,主要分享技术思路。

或许你有小疑问

以一个图片链接为例,它是存在服务器上的资源,普通爬虫技术,可以请求网址得到响应,得到图片的链接,js逆向通过解密可以得到资源的请求地址,这两种方式都得到了图片的链接,它们的区别是什么呢,各自的优缺点又是什么呢?

普通爬虫技术:只需要发送HTTP请求,然后从响应中提取出图片链接即可。这种方式的优点是简单易用。缺点是如果图片链接是通过JavaScript动态生成的,或者需要用户进行一些特定操作才能获取的,那么这种方式就无法获取到图片链接。

JS逆向:这种方式的优点是可以突破一些复杂的反爬机制,获取到普通爬虫技术无法获取的图片链接。

或许你会想,如果我使用selenium直接模拟浏览器不是也能获得吗?但那样的速度也就更慢了。从爬虫角度来说,你可以粗暴地理解js逆向是更加精准的爬虫,从接口下手的。

开始

主页如下,随便打开一个
在这里插入图片描述

F12分析

找到图片的获取链接

在这里插入图片描述


发现都是在往一个URL发出批量的请求,先搜索看看这个url指纹,并没有找到东西(图中显示为图片请求地址)

在这里插入图片描述


查看该请求的调用堆栈
在这里插入图片描述
在这里插入图片描述


跟进这个调用点,看起来像是从一个数组中获取到链接,打下断点,看看调用值
在这里插入图片描述

这里查看到这个数组就是图片的请求链接(可以单独请求一个验证看看)
在这里插入图片描述

那么再跟进这个数组是如何生成的,搜索一下,找到了初始化的地方,一个一个查看一下
在这里插入图片描述

找到这个地方,这里非常像循环装载这个数组的地方
在这里插入图片描述

打断点,重新刷新,如果前面猜测没错,数组肯定是先装载再使用,应该会先停下。果然停下来了,查看值发现也没问题,装载URL的地方就是这里,它是等于_o的属性,现在追_o
在这里插入图片描述

它就在上面一行,_o是由imgobj的一个数组元素装载的,查看发现就是这几页漫画的详细信息。
在这里插入图片描述

那么再追imgobj的出处,搜索看到imgobj是由一个PICTURE来的,继续跟进
在这里插入图片描述

搜索找到是由_v来的
在这里插入图片描述

搜索查看,找到这个地方,非常明显的eval混淆,大概率核心的_v生成算法就在这里
在这里插入图片描述
在这里插入图片描述
使用解密脚本,或者解密网站在线解eval混淆,得到结果如下
(注:在线eval解密网站推荐如下https://www.dejs.vip/2eval

function Base(){_keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";this.decode=function(c){var a="",b,d,h,f,g,e=0;for(c=c.replace(/[^A-Za-z0-9\+\/\=]/g,"");e<c.length;)b=_keyStr.indexOf(c.charAt(e++)),d=_keyStr.indexOf(c.charAt(e++)),f=_keyStr.indexOf(c.charAt(e++)),g=_keyStr.indexOf(c.charAt(e++)),b=b<<2|d>>4,d=(d&15)<<4|f>>2,h=(f&3)<<6|g,a+=String.fromCharCode(b),64!=f&&(a+=String.fromCharCode(d)),64!=g&&(a+=String.fromCharCode(h));return a=_utf8_decode(a)};_utf8_decode=function(c){for(var a="",b=0,d=c1=c2=0;b<c.length;)d=c.charCodeAt(b),128>d?(a+=String.fromCharCode(d),b++):191<d&&224>d?(c2=c.charCodeAt(b+1),a+=String.fromCharCode((d&31)<<6|c2&63),b+=2):(c2=c.charCodeAt(b+1),c3=c.charCodeAt(b+2),a+=String.fromCharCode((d&15)<<12|(c2&63)<<6|c3&63),b+=3);return a}
}
var B=new Base(),T=W['DA'+'TA'].split(''),N=W['n'+'onc'+'e'],len,locate,str;
N=N.match(/\d+[a-zA-Z]+/g);
len=N.length;
while(len--){locate=parseInt(N[len])&255;str=N[len].replace(/\d+/g,'');T.splice(locate,str.length)
}
T=T.join('');
_v=JSON.parse(B.decode(T));

这就是核心加密了,拿到本地环境测试一下,它还需要W的两个属性
在这里插入图片描述
在控制台上打印一下W,发现它其实就是window
在这里插入图片描述

里面也有我们需要的属性
在这里插入图片描述
查找一下来源,这个DATA就是页面本身自带的
在这里插入图片描述
nonce有一个覆盖写,用了一个特定算法,把它粘到你的脚本上去,所有的要素就齐全了,本地即可复现这个算法。
在这里插入图片描述
效果如下:
在这里插入图片描述

进一步利用

现在这个接口已经破解完毕了,你可以进一步写爬虫,DATAnonce都在主页,记得先取一下。
在这里插入图片描述
在这里插入图片描述
现在就可以做到,给出一个url,返回一个json的下载链接了。

备注

后续实战发现,nonce经常会变换算法,但是思路是不变的,找到再贴上去就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142246.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

service

title: “Service” createTime: 2022-02-11T11:23:2008:00 updateTime: 2022-02-11T11:23:2008:00 draft: false author: “name” tags: [“service”] categories: [“linux”] description: “测试的” linux的Service之旅 1.service 服务权限 systemd有系统和用户区分&…

2023年9月26日,历史上的今天大事件早读

1620年9月26日大明皇帝朱常洛驾崩 1815年9月26日俄、普、奥三国在巴黎发表缔结“神圣同盟” 1841年9月26日清代思想家、诗人龚自珍逝世 1849年9月26日“生理学之父”巴甫洛夫诞生 1909年9月26日云南陆军讲武堂创办 1953年9月26日画家徐悲鸿逝世 1980年9月26日国际宇航联合…

【C++】构造函数和析构函数第一部分(构造函数和析构函数的作用)--- 2023.9.25

目录 前言初始化和清理的概念构造函数和析构函数的作用构造函数的作用析构函数的作用 使用构造函数和析构函数的注意事项默认的构造函数和析构函数结束语 前言 在使用c语言开发的项目场景中&#xff0c;我们往往会遇到申请空间的需求&#xff0c;同时也肯定遇到过程序运行一段…

phpstudy2016 RCE漏洞验证

文章目录 漏洞描述漏洞验证 漏洞描述 PHPStudyRCE&#xff08;Remote Code Execution&#xff09;&#xff0c;也称为phpstudy_backdoor漏洞&#xff0c;是指PHPStudy软件中存在的一个远程代码执行漏洞。 漏洞验证 打开phpstudy2016&#xff0c;用bp自带的浏览器访问www目录下…

【Verilog 教程】4.8Verilog 过程连续赋值

关键词&#xff1a;deassign&#xff0c;force&#xff0c;release 过程连续赋值是过程赋值的一种。这种赋值语句能够替换其他所有 wire 或 reg 的赋值&#xff0c;改写了 wire 或 reg 型变量的当前值。 与过程赋值不同的是&#xff0c;过程连续赋值的表达式能被连续的驱动到 …

大数据Flink(八十六):DML:Group 聚合和Over 聚合

文章目录 DML:Group 聚合和Over 聚合 一、DML:Group 聚合

Spring面试题23:Spring支持哪些事务管理类型?Spring框架的事务管理有哪些优点?你更倾向用哪种事务管理类型?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持哪些事务管理类型? Spring 支持以下几种事务管理类型: 编程式事务管理:通过在代码中显式地使用事务管理 API(如 TransactionTempla…

Python+Django前后端分离

程序示例精选 PythonDjango前后端分离 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjango前后端分离》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

第3章-指标体系与数据可视化-3.1.2-Seaborn绘图库

目录 3.1.2 Seaborn绘图库 1. 带核密度估计的直方图 2. 二元分布图 一维正态分布 联合分布函数 二元边际分布函数 二维正态分布 3. 热力图 附录 参考 3.1.2 Seaborn绘图库 Seaborn和Matplotlib类似&#xff0c;也是Python数据可视化库。不过&#xff0c;它是基于Matpl…

mlc-llm 推理优化和大语言模型搭建解析

0x0. 前言 本文解析一下mlc-llm&#xff08;https://github.com/mlc-ai/mlc-llm&#xff09;对大模型推理的流程以及使用的图优化&#xff0c;算子优化策略。mlc-llm的模型部署流程可以查看官方文档&#xff1a;https://mlc.ai/mlc-llm/docs/ &#xff0c;也可以参考我前段时间…

如何计算3种卷积之后的尺寸(普通卷积,转置卷积,空洞卷积)

文章目录 前言一、普通卷积二、转置卷积三、空洞卷积 前言 三种卷积之后的feature map的尺寸如何计算。包括普通卷积&#xff0c;转置卷积&#xff0c;空洞卷积。可以在下面这个链接看到三种卷积的动态图。 卷积动态图 一、普通卷积 普通卷积比较简单了&#xff0c;其计算方式…

IEEE802.2之LLC(逻辑链路控制)

一、概念 IEEE 802.2 是一种用于局域网&#xff08;LAN&#xff09;和都会区域网&#xff08;MAN&#xff09;的数据链路层逻辑链路控制&#xff08;LLC&#xff09;的标准。它是 IEEE 802 系列标准中的一个组成部分&#xff0c;专门用于定义如何在数据链路层内进行帧的多路复用…

Edge 浏览器『版本回退』和『关闭更新』

前言 最近 Edge 浏览器又更新了&#xff0c;给整体浏览器页面布局进行大改动&#xff0c;之前苗条的标签页和收藏夹栏瞬间变得臃肿了&#xff0c;我实在无法忍受这种布局&#xff0c;所以我索性直接进行版本回退和设置永久关闭更新&#xff0c;详细步骤请看下文 Edge 浏览器版…

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项

目录 1、求字符串长度函数 1.1、strlen 2、字符串拷贝(cpy)、拼接(cat)、比较(cmp)函数 2.1、长度不受限制的字符串函数 2.1.1、strcpy 2.1.2、strcat 2.1.3、strcmp 2.2、长度受限制的字符串函数 2.2.1、strncpy 2.2.2、strncat 2.2.3、strncmp 3、字符串查找函数…

20230919在WIN10下使用python3将PDF文档转为DOCX格式的WORD文档

20230919在WIN10下使用python3将PDF文档转为DOCX格式的WORD文档 2023/9/19 11:20 python pdf word https://blog.csdn.net/u013185349/article/details/130059657 Python实现PDF转Word文档 AcceptedLin 已于 2023-04-10 14:45:17 修改 1243 收藏 1 文章标签&#xff1a; pd…

RocketMQ —消费进度管理

Apache RocketMQ 通过消费位点管理消费进度&#xff0c;本文为您介绍 Apache RocketMQ 的消费进度管理机制。 背景信息​ Apache RocketMQ 的生产者和消费者在进行消息收发时&#xff0c;必然会涉及以下场景&#xff0c;消息先生产后订阅或先订阅后生产。这两种场景下&#x…

SpringBoot 学习(一)自动装配

本系列文章为【狂神说 Java 】视频的课堂笔记&#xff0c;若有需要可配套视频学习。 1.1 pom.xml (1) 父工程&#xff08; spring-boot-starter-parent &#xff09; 核心依赖&#xff0c;静态资源过滤等配置。编写或导入 springboot 依赖时不需要指定版本号&#xff0c;继承…

MySQL中explain各字段详解及举例

MySQL版本&#xff1a;8.0.33 建表语句&#xff1a; DROP TABLE IF EXISTS actor; CREATE TABLE actor (id int(11) NOT NULL,name varchar(45) DEFAULT NULL,update_time datetime DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;INSERT INTO actor (i…

【Linux】网络原理

文章目录 &#x1f4d6; 前言1. 计算机内部的交流1.1 计算机之间的交流&#xff1a; 2. 协议2.1 网络分层&#xff1a;2.2 以打电话为例&#xff1a;2.3 OSI七层模型&#xff1a;2.4 TCP/IP&#xff1a; 3. 操作系统与网络的关系4. 报头与解包4.1 报头的作用&#xff1a; 5. 局…

从中序遍历和后序遍历构建二叉树

题目描述 106. 从中序与后序遍历序列构造二叉树 中等 1.1K 相关企业 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1…