目标网站:aHR0cCUzQS8vdG9vbC5saXVtaW5neWUuY24vbXVzaWMv
点击搜索,打开开发者工具,搜索一个关键词,发现我们此次的目标--data参数
接下里就是寻找参数data的生成过程,这里记录下常用的搜索参数的方法
如何搜索参数
-
使用浏览器全局搜索参数名或者url中特殊参数部分
比如这个案例,由于data参数名过于平凡,搜索会得到很多结果,我们可以尝试搜索url参数部分
data的寻找
没有找到,尝试其他方法
-
查看 search 请求的 initiator(发起者)
3.png
通过该面板,我们可以知道该请求的起源过程,点击源文件,通过搜索url关键词,发现惊喜
4.png
于是我们在data这一行下断点 - 下xhr断点,由于已经找到,这里不再尝试
js调试过程
该参数的加密过程比较明显,是通过一个encode函数,我们直接把函数抠出来,放到本地运行,缺什么再补什么。如果你也是刚开始学习逆向,要多一些耐心,调试可能会有很多问题
5.png在调试的过程中,可能会遇到以下的错误
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
// this['zIYQbj'] = function() {
// return 'newState'
// };
//FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
this['zIYQbj'] = function() {return 'newState'};
该代码段在浏览器脚本中是一行,经过本地代码格式化,变成多行
一般情况下,调试遇到内存溢出或者提示堆栈空间不足,都可以先通过全局搜索 function ()
,修改格式异常的代码段
- 提示md5不存在,可以通过下面代码解决,crypto-js是我们常用的一个加密库,里面封装了常见的加密函数。
var cryptoJs = require('crypto-js');
var md5 = function (a) {
return cryptoJs.MD5(a).toString();
};
- 提示 location 不存在,因为失去了浏览器环境,在逆向调试中,很容易遇到一些浏览器参数缺失。像 window或者document,一般情况下,我们可以这么定义
var window = {} 或者window = global
,而location可以直接复制浏览器的location。打开console,输入copy(location)
,即可复制location对象。这里为什么这么做,因为有些代码需要读取location对象的属性值,location对象拥有的属性方法比较少,直接复制浏览器的省事。
爬虫脚本的编写
这是写该篇文章的主要目的,使用node开发api接口,供爬虫使用
- node express开发接口
var express = require('express');
var app = express();
var getData = require('./22.js');
app.get('/music', function(req, res) {
// let text = JSON.stringify(req.query);
let keyword = req.param('keyword');
let text = 'text='+keyword+'&page=1&type=migu'
data = getData.encode(text);
res.send(data);
});
app.listen(3000);
- 前面抠出的代码,需要导出encode方法,供express脚本调用。在抠出的代码后面加上
// 导出方法
module.exports = {
encode
};
- 爬虫脚本的编写,比较简单
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36',
}
def getParam(keyword):
url = 'http://127.0.0.1:3000/music?keyword='+keyword
res = requests.get(url)
print('js参数:',res.text)
return res.text
def search(keyWord):
url = 'http://tool.liumingye.cn/music/api/search'
param = getParam(keyWord)
data = {
'data':param.replace('data=','').replace('&v=2',''),
'v':2,
}
res = requests.post(url,headers=headers,data=data)
print(res.json())
if __name__ == '__main__':
search('清明雨上')
网友评论