从这一篇开始,我准备跳一个大坑--JS逆向,自学很难,自己给自己打气,日拱一卒,终有所成。学JS逆向需要有Python爬虫基础、js语法基础、浏览器使用基础。Python爬虫基础可以参考我之前的爬虫系列Python爬虫自学笔记(一)爬虫基础知识_爬虫某个属性时,有该属性的爬取,无该属性时-CSDN博客Python爬虫自学笔记(二)静态网页爬取_逆向解析法是用于静态网页数据的基本爬取-CSDN博客Python爬虫自学笔记(三)动态网页爬取_python爬取动态网页数据-CSDN博客
第四篇手机APP内容爬取一直有敏感词发不出来我也不知道为啥,挺郁闷的。
Python爬虫自学笔记(五)Scrapy框架_from scrapy.cmdline import execute-CSDN博客d
工欲善其事必先利其器,在准备开始js逆向之前,我们先准备好几个工具。
1、Python调用JS代码的工具库
既然是js逆向,那就要去解锁网页上的js代码,而我们用的爬虫工具是Python语言,所以准备几个用Python调用JS代码的工具必不可少。
现在常见的Python调用JS代码的库有这些:
PyV8 Js2Py PyExecJs PyminiRacer Selenium Pyppeteer
#PyV8 不推荐使用,比较老的库了,很久没有维护,还有内存泄漏问题,所以不推荐使用
#Js2Py 不推荐使用 是一个纯Python实现的js解释器。 性能不高,存在一些Bug,也不太推荐
#PyMiniRacer 可以使用 同样是V8引擎的包装,和 PyV8效果一样, 比较新。
#PyExecJs 推荐使用 最早诞生于Ruby,后来移植到Python。较新,有多个引擎可选,一般选择 NodeJs作为引擎执行代码
1.1 PyExecJS库
安装就是 pip 安装,这个没啥的
引入的时候注意是 import execjs,不要去引入 pyexecjs那会报错
使用的话一般是把js中的函数写成一个字符串赋值给一个变量,然后用 execjs.compile去编译,再用call来调用。
jstext = "function hello(str){return str;}" #把js函数作为一个字符串赋值给一个变量
ctx = execjs.compile(jstext) #用compile方法编译
a = ctx.call("hello","Hello Tony") #用call方法调用函数,第一个参数是函数名hello,第二个参数是该函数的参数,如果有多个参数,用逗号隔开
print(a)
运行后显示:
Hello Tony
1.2 Selenium 和 Pyppeteer
这两个都是自动化的工具,也可以拿来运行JS代码
Selenium之前说过,就不再重复了,Pyppeteer 和 Selenium 类似,但是执行效率更高,不同之处是 Pyppeteer 是一个异步的库,要和asyncio搭配使用,下面是一个用 Pyppeteer打开百度网页的示例:
import asyncio
from pyppeteer import launch
async def main():
options = {
"executablePath": r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
"headless": False,
"defaultViewport": {"width": 1920, "height": 1080},
"autoClose": True,
"dumpio": True,
"args": [
'--disable-infobars',
'--no-sandbox',
'--start-maximized',
],
}
browser = await launch(**options)
page = await browser.newPage()
await page.goto('https://www.baidu.com')
await asyncio.sleep(2)
page_text = await page.content() # 页面内容
print(page_text)
await browser.close()
if __name__ == '__main__':
# loop = asyncio.get_event_loop()
# loop.run_until_complete(main())
asyncio.run(main()) # python3.7以上版本使用
2、使用NodeJS直接执行JS
这里有两个方案:
方案A: 用Google出品的gRPC框架
就是先写一个简单的RPC服务接口,然后就可以通过Python函数调用nodeJS开放这个RPC服务拿到想要的结果
方案B:使用NodeJS的Express框架来实现
用HTTP API方式 这就相当于写后端接口,简单说就是提供一个可以执行JS的HTTP API,然后通过调用这个API来执行JS并获取想要的结果。
我们先准备一个js的函数 sum.js
function add(a, b) {
return a + b;
}
module.exports = {
add: add
};
然后用Express搭建一个服务器:
//Express
const express = require('express')
const app = express()
const sum = require('./sum')
var bodyParser = require('body-parser');
app.use(bodyParser());
app.post('/getSum', function (req, res) {
let result = req.body
console.log("result=", result)
let a = parseInt(result.a)
let b = parseInt(result.b)
result = sum.add(a, b)
res.send(result.toString());
})
app.listen(5555, () => {
console.log("开启服务,端口号为5555")
})
然后再用Python调用这个API
import requests
url = "http://127.0.0.1:5555/getSum"
data = {
"a":6,
"b":5,
}
req = requests.post(url,data)
print(req.text)
运行得到结果
PS C:\coding\js逆向> & C:/Users/admin/anaconda3/python.exe c:/coding/js逆向/qingqiu.py
11
3、抓包工具Charles
一个HTTP抓包工具,支持 windows Linux Mac
官网:www.charlesproxy.com
下载对应版本:
Charles 设置HTTPS代理抓包方法及原理
PC设置https代理抓包
第一步:电脑端安装 Charles 的 CA 证书(必须)
在Charles的菜单栏上选择“Help”->“SSL Proxying”->"Install Charles Root Certificact",
出现证书安装页面,点击“安装证书(I)...”,进入证书导入向导,下一步...完成安装
第二步:电脑上charles的SSL抓取设置(必须)
charles并不是默认抓取ssl的,所以即使你安装完证书之后,Charles 默认也并不截取 Https的信息,你需要在SSL proxy里设置需要抓的域名,因为charles的location配置都是支持通配符的,所以在HOST里设置一个”*”就可以了,port不写;
Charles 手机抓包HTTPS设置以及证书安装
手机抓包的原理,和PC类似
第一步:设置charles为允许状态,并设置好接入端口;
在Charles的菜单栏上选择“Proxy”->“Proxy Settings”,填入代理端口8888(注意,这个端口不一定填写8888,也可以写别的端口,但是需要记住这个端口,因为这里设置的允许接入的端口,手机端配置的时候需要用到),并且勾上”Enable transparent HTTP proxying” 就完成了在Charles上的设置。如下图
需要找到charles的本机IP;点击HTLP -> local IP Address 可以看到当前的本机IP地址;
charles允许手机接入的IP和端口是10.36.198.189:8888 在浏览器输入 这个HOST会发现charles会提示一个窗口问你是否允许接入;点击Allow,即可接入代理
第二步:把手机按照charles的IP和端口进行配置;
手机链接wifi,wifi的HTTP代理选择手动那项(安卓类似)
在iPhone的 “设置”->“无线局域网“中,可以看到当前连接的wifi名,通过点击右边的详情键,可以看到当前连接上的wifi的详细信息,包括IP地址,子网掩码等信息。在其最底部有“HTTP代理”一项,我们将其切换成手动,然后填上Charles运行所在的电脑的IP,以及端口号8888
第三步,手机配对成功后,charles弹窗询问是否允许;
设置好之后,我们打开iPhone上的任意需要网络通讯的程序,就可以看到Charles弹出iPhone请求连接的确认菜单
如上图的弹窗,点击Allow即可;此时已经配对成功,开始愉快的抓包吧;
如果您的charles没有配置过,是抓取不到HTTPS这种加密协议的内容的;
如果需要抓取HTTPS网站的资源,请查看 Charles的HTTPS抓包方法及原理
注意:需要明白一个可能存在的弊端,如果你把手机的上网相关事情委托给了charles,那么当charles出错或者没有开启的时候,此时手机必定没有办法正常上网;这个一定要了解,因为很多人把手机的IP委托给charles进行代理后,第二天早晨上本的时候,手机wifi会默认链接你常用的高清度wifi;而此时的wifi的设置里面可能已经委托给charles了,但是此时电脑刚没有开charles或者重启后ip变动等;造成charles无法正常使用;由此而导致了无法上网的问题;
注意charles此种捕获方式,只能捕获发出请求的资源,如果是APP里,内部的代码和资源,因为没有向服务器发情请求,所以这是抓不到的;
判断是不是调用内部资源,你可以把手机的网络给断了,如果此时还可以正常的显示,说明该资源是写在APP内部的,通过代理的方式是抓不到的;
手机抓取https
手机安装SSL证书(如果你需要抓取手机访问的HTTPS网站,需要做此设置,但如果你不需要手机抓取HTTPS,就没有必要安装了)
和上面类似,也是HTLP下面的 SSL Proxying,选择”Install Charles Root Certificate on a Mobile Device or remote Browser” (在移动设备或远程浏览器上安装SSL证书)
然后会看到一个弹窗,提示你该怎么操作
configure your device to use charles as its HTTP proxy on 10.36.198.189.8888,then browse to chls.pro/ssl to download and install the certificate
大概的意思是让你把手机上的wifi信息设置了 HTTP代理,内容是10.36.198.189.8888;然后用浏览器浏览chls.pro/ssl就可以下载并安装证书了
手机安装证书:在浏览器中输入:chls.pro/ssl 下载安装证书即可(安卓建议不要用手机自带浏览器下载,可能会出现安装不上的情况,如果安装不上,找到设置->安全与隐私->加密和凭证->从存储设备安装(安卓下载证书或安装证书有问题建议使用其他浏览器下载)。Ios手机:1.设置->通用->描述文件与设备管理,安装证书;2.通用->关于本机->证书信任设置-开启)
Charles常见操作
过滤域名
方法一:直接过滤域名;
在主界面的中部的 Filter 栏中填入需要过滤出来的关键字。
方法二:修改Include的域名和端口
在 Charles 的菜单栏选择 “Proxy”->”Recording Settings”,
然后选择 Include 栏,选择添加一个项目,然后填入需要监控的协议,主机地址,端口号。
这样就可以只截取目标网站的封包了;
通常情况下,我们使用方法一做封包过滤,方法二做一些唯一的域名抓包,正常情况下,不推荐这种设置方法;
因为这种方法,你的charles只能抓你配置的域名;
如果某天早晨,你的charles一切正常,访问也正常,而且在active commections里也看到了某个域名的请求信息,但是在主界面死活看到获取到的信息;
不用着急,非常有可能是因为你设置了include的指定域名;
而且是设置后你忘记解除了,导致你一脸懵逼;
这种方法非常不推荐,太粗暴了,除非你这半个月都只看某个HOST下的信息,否则千万千万别这么搞,很容易在以后使用时候的忘记解除;
如果你只是为了更清楚的查看某个域名下的请求和响应信息,推荐使用结构视图模式下的焦点域名设置;那种模式比这种方法更好,下面是过滤焦点域名后在序列模式下的调用方法;
方法三:过滤焦点域名
①点击fillter后面的focused来筛选你的做的focus标记文件
②在目标的网络请求上右键,选中focus(此时,该域名已经被设置为一个焦点标记了;
你设置的焦点域名在"View"->”focused Hosts”里面可以查看和管理
结构视图,这种模式下的展现更加人性化;
当你设置某个域名为焦点域名的时候,会把当前域名单独显示在上面,
而其它的非焦点域名,都会在other Hosts里显示;
4、Chrome插件 EditThisCookie
Chrome浏览器的一个插件,可以方便管理、操作 cookie.
也可以直接用Chrome浏览器扩展安装
EditThisCookie是一个cookie管理器。您可以添加,删除,编辑,搜索,锁定和屏蔽cookies!
针对Google Chrome浏览器的第一个也是最棒的cookie管理器。
★ 编辑cookies
★ 删除cookies
★ 添加一个新的cookie
★ 创建cookies
★ 搜索cookies
★ 保护cookies (只读cookies)
★ 拦截cookies (cookie 过滤器)
★ 导出cookies为JSON, Netscape cookie 文档 (非常适合wget及curl), Perl::LPW
★ 导入JSON格式cookies
★ 限制任何cookie的最大有效期
★ 改进性能,移除旧的cookies
★ 导入cookies.txt
功能介绍
cookie 属性
打开控制面板 -> EditThisCookie 就可以很方便的编辑当前页面的cookie
name字段:一个cookie的名称
value字段:一个cookie的值
domain字段:可以访问此cookie的域名
path字段:可以访问此cookie的页面路径
Size字段:此cookie大小
http字段:cookie的httponly属性,若此属性为True,则只有在http请求头中会有此cookie信息,而不能通过document.cookie来访问此cookie。
secure字段:设置是否只能通过https来传递此条cookie。
expires/Max-Age字段:设置cookie超时时间。如果设置的值为一个时间,则当到达该时间时此cookie失效。不设置的话默认是session,意思是cookie会和session一起失效,当浏览器关闭(并不是浏览器标签关闭,而是整个浏览器关闭)后,cookie失效。
host-only:在Cookie中不包含Domain属性,或者Domain属性为空,或者Domain属性不合法(不等于页面url中的Domain部分、也不是页面Domain的大域)时为true。此时,我们把这个Cookie称之为HostOnly Cookie
编辑cookie
示例HttpOnly:
这里我HttpOnly 全部设置为 True,这是js就获取不到cookie
这里 勾选了_device_id 的 HttpOnly属性,这时js就可以获取到该cookie。
其他的属性可以自行设置,自行尝试。
5 Chrome插件 Tampermonkey
安装:可以从Google商店里面安装
油猴插件是一款用于管理用户脚本的插件,它本身没有什么功能,真正起作用的是它所管理的那些用户脚本。你可以根据需求,利用油猴插件来安装某些特定的用户脚本,从而实现定制化的功能。
安装:
油猴插件是一款用于管理用户脚本的插件,它本身没有什么功能,真正起作用的是它所管理的那些用户脚本。你可以根据需求,利用油猴插件来安装某些特定的用户脚本,从而实现定制化的功能。
用户脚本的安装
以上只是完成了油猴插件的安装,接下来讲述如何将用户脚本集成到油猴插件中。
在扩展程序中选择“篡改猴”以显示其图标,在图标上左键单击,选择“获取新脚本”。
弹出的页面如下,我们一般选择GreasyFork(比较受欢迎的缘故)。
然后在弹出的界面里输入想要的脚本,比如“网盘智能识别助手”。点击某个搜索结果,然后选择“安装此脚本”,完成安装即可。
这个被集成到油猴插件中的脚本,在某种场景下会自动地运行。比如将“网盘智能识别助手”集成到油猴插件中后,当你在某个网页中选中一段带有网盘链接和提取码的文字时,会智能识别选中文字中的网盘链接和提取码,并打开网盘链接并自动填写提取码,省去手动复制提取码再输入的烦恼。
6、注意事项
6.1 window对象
NodeJS中是没有window对象的,如果使用window对象需要自己创建一个或者指向global,使用jsdom之类的库,自己定义window document screen等对象
var window = {}
var document = {}
document = {"location":{"href":"https://bbs.nightteam.cn/member.php?mod=register"}}
var screen = {"width":900,"height":1200}
console.log(screen.width)
6.2 Base64
window.btoa在nodejs中不存在,所以要使用 Buffer.from('Tony').toString('base64')这样的方式