一个在IT行业摸爬打滚的程序猿

0%

爬虫js解密分析:某某猫小说

前言:本教程仅供学习,不得非法破坏网站。如用于其他暴力等用途,后果自负。如侵权您的网站请留言我,我立刻删除,感谢。
本次来学习一下简单的js逆向教程

为了不直接贴出网站链接,下面是已经经过某种常见的、可逆的加密方式进行加密

1
2
3
4
5
6
7
8
9
10

##### 0x01、查看接口返回的数据
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191209173206462.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70)

看到接口返回的数据有点可疑,看到这种```chapter_access_key```字眼,顾名思义就是章节访问key,先记着有这么一个字眼先,继续观察

![在这里插入图片描述](https://img-blog.csdnimg.cn/20191209173232914.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70)
这次又来一个字眼:encrypt,而且数据是加密的,联想上一步,进而得知,可能是:拿chapter_access_key去解密当前的加密数据

##### 0x02、全局搜索```encryt_keys

在这里插入图片描述
这就搜索到两处encryt_keys
点进去看看呗

发现两处的地方还是有点不一样,但是怎么区分这个呢?

到这里,你是否还记得上一步的截图当中出现过的接口和当前截图里面有点一样呢?

给你再看清楚一下呗:
在这里插入图片描述
那么解决思路就来了:先看这个函数,看看debug出什么来;不行的话,再看另外那个函数

打上断点,重新加载,调试发现最终的解密函数入口是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
myDecrypt: function(f) {
var g = new b([]);
return g.decrypt(f)
}

// 再具体一点就是函数:g.decrypt(f)
// 即是下面这个函数:
decrypt: function(g) {
巴拉巴拉
巴拉巴拉
#¥%@!~%……&*()&
#¥%@!~%……&*()&
.
.
.
}

0x03、找到了,那扣它啊!

通过将myDecrypt: function(f)扣出来之后,进行本地调试,然后就是缺啥补啥

ps: 懵懂的我一开始还不知道缺啥补啥是怎么解决,直到问了一些大佬才知道就是:如果不知道怎么解决的话,那就跟着浏览器,然后debug,一步一步看,看它调用了哪些变量/常量/函数!

如果还是不知道怎么看的话,就是将鼠标放在正在变量/函数那里,它会显示蓝色的调用栈,然后点击进去看它,即可得到解决思路。
需要导入:CryptoJS

1
2
3
4
5
6
7
8
var CryptoJS = require("C:/Users/Administrator/AppData/Roaming/npm/node_modules/crypto-js");
// var CryptoJS = require("crypto-js"); // 运行报错 Error: Cannot find module 'crypto-js',因此需要指定路径进行导入这个依赖
// console.log(module.paths); // 上面的报错信息可以使用这个来查看导入的模块路径有哪些
// 然后查看安装路径:
// $ npm prefix -g # node安装路径
// /Users/xxx/.nvm/versions/node/v10.16.0
// $ npm -g root # 查看依赖安装路径
// /Users/xxx/.nvm/versions/node/v10.16.0/lib/node_modules // 然后将这里的路径复制到上面导入的路径处

0x04、踩坑的过程痛苦并快乐着

-[x] 已掉坑:

1
2
3
n = d.base64.decode(n);
^
ReferenceError: d is not defined

调试的时候,看到这个未定义,以为看到base64就是转换为nodejs里面的base64的对应使用就可以了,发现最后没报错但也没有结果!!!

你知道这是很可怕的事情吗,一个没有bug的程序,而且得出的结果不是预期的
鄙人还是太菜了,我哭了,你呢?

然后反复在浏览器进行debug,一个个排除,最终将问题定位到:

1
n = d.base64.decode(n);

定位到这一行代码的时候,我进去看看这个decode/encode,发现并不是通过转换为nodejs的base64的decode/encode,
这是网址自己封装的加解密方式啊!!!
跪了跪了 ○| ̄|_

跪完还得继续干啊,兄嘚,继续扣相关的js呗!!!

0x05、扣完这些js之后,舒服啊,解密完毕

看一下解密的最终函数代码粗略截图:
在这里插入图片描述

运行结果截图:
在这里插入图片描述

小结:

本次收获到了调试技巧、及大概悉知网站存在偷换的概念/执行方式的可能

点击我进行了解引用来源

至此本文教程写完了,希望能够帮助到各位在爬虫路上的小伙伴们,觉得不错点个赞呗
感谢认真读完这篇教程的您

先别走呗,这里有可能有你需要的干货文章:

爬虫:js逆向目前遇到的知识点集合;
个人总结-js逆向解析思路;
CSS字体反爬实战,10分钟就能学会;
woff字体反爬实战,10分钟就能学会;
爬虫js解密分析:某某云文学;