自学Python爬虫js逆向(一)准备好一些工具

本文介绍了JavaScript逆向工程的学习路径,包括Python爬虫基础知识,如PyExecJS、Selenium和Pyppeteer的使用,以及如何通过NodeJS执行JS代码和抓包工具如Charles的配置。还提到了Chrome插件EditThisCookie和Tampermonkey在相关领域的应用。
摘要由CSDN通过智能技术生成

        从这一篇开始,我准备跳一个大坑--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.

官网:EditThisCookie

也可以直接用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')这样的方式

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值