欢迎大家提供高效方法与工具
工具
油猴插件
油猴插件,可以把它理解为一个脚本,相当于给浏览器添加一些新功能。在逆向时我一般会用它来hook逆向参数位置,大家可以直接在浏览器应用商城搜索下载,或者进入官网下载,具体使用文档可以参考此文章
最强浏览器插件:油猴脚本的安装及使用教程
SwitchyOmega
SwitchyOmega是一款在Google Chrome 浏览器上的一个代理扩展程序,可以轻松快捷地管理和切换多个代理设置。在逆向时我一般会通过它来设置浏览器的代理,这样就不需要对本机设置代理,而且通过它也能方便与Fiddler联动下载链接
Reres
reres是一款Chrome插件,当碰到想替换的js、css、html时想要替换,这个时候就可以使用reres来进行解决。如果只需要hook参数或者cookie生成位置啥的,我们可以直接使用油猴插件快速实现,但是如果我们需要将网站的文件替换成本地文件,那这个插件能快速实现。下载链接
它支持正则匹配网址链接,注意本地文件指定需要file:///
开头
Fiddler插件编程猫
编程猫插件是针对Fiddler开发的一款插件,它提供了js调试工具、注入hook和内存漫游等功能,能有效提高逆向效率。下载链接
奇淫技巧
selenium
Options常用参数
options.add_argument('--headless') # 开启无界面模式
options.add_argument("--disable-gpu") # 禁用gpu
options.add_argument('--user-agent=Mozilla/5.0 HAHA') # 配置对象添加替换User-Agent的命令
options.add_argument('--window-size=1366,768') # 设置浏览器分辨率(窗口大小)
options.add_argument('--start-maximized') # 最大化运行(全屏窗口),不设置,取元素会报错
options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示
options.add_argument('--incognito') # 隐身模式(无痕模式)
options.add_argument('--disable-javascript') # 禁用javascript
options.add_argument(f"--proxy-server=http://ip:port") # 使用代理
options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度
# 其它
--user-data-dir=”[PATH]” 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区。
--disk-cache-dir=”[PATH]“ 指定缓存Cache路径
--disk-cache-size= 指定Cache大小,单位Byte
--first run 重置到初始状态,第一次运行
--incognito 隐身模式启动
--disable-javascript 禁用Javascript
--omnibox-popup-count="num" 将地址栏弹出的提示菜单数量改为num个。我都改为15个了。
--user-agent="xxxxxxxx" 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果
--disable-plugins 禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果
--disable-javascript 禁用JavaScript,如果觉得速度慢在加上这个
--disable-java 禁用java
--start-maximized 启动就最大化
--no-sandbox 取消沙盒模式
--single-process 单进程运行
--process-per-tab 每个标签使用单独进程
--process-per-site 每个站点使用单独进程
--in-process-plugins 插件不启用单独进程
--disable-popup-blocking 禁用弹出拦截
--disable-plugins 禁用插件
--disable-images 禁用图像
--incognito 启动进入隐身模式
--allow-outdated-plugins 不停用过期的插件。
--disable-accelerated-2d-canvas 停用 GPU 加速二维画布。
--disable-accelerated-video 停用 GPU 加速视频。
--disable-dart 停用 Dart。
--disable-desktop-notifications 禁用桌面通知,在 Windows 中桌面通知默认是启用的。
--disable-extensions 禁用拓展。
--disable-file-system 停用 FileSystem API
--disable-java 停用 Java。
--disable-local-storage 禁用 LocalStorage。
--proxy-server 使用给定的代理服务器,这个参数只对 http 和 https 有效。
--user-agent 使用给定的 User-Agent 字符串。
防检测
将浏览器navigator.webdriver重置为False
chrome.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => false
})
"""
})
stealth.min.js解决常见的指纹检测
with open('stealth.min.js') as f:
js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": js
})
浏览器worker完美解决检测
创建有端口的浏览器
chrome.exe --remote-debugging-port=9222 --user-data-dir=“D:\chrometemp”
使用selenium控制该端口浏览器
options=webdriver.ChromeOptions()
options.debugger_address='127.0.0.1:9222'
driver=webdriver.Chrome(options=options)
SSLError OR JA3
最近遇到一个网站,用scrapy和request请求一直报SSLError,用postman可以正常请求,折腾了好久也没定位到问题所在,网上资料基本都试过,verify,headers,urllib3不报错,https改成http都不行,可能降低版本可以(项目原因不敢降低版本)
仔细思考一下,风控能够做到这一步,且有SSLError,大概率是ja3检测,后面使用Pyhttpx库能正常拿到数据
三方库使用具体可以参考蔡老板这篇博客
好库推荐|两个解决ja3检测的Python库,强烈推荐
小试牛刀
chrome开发者工具设置中文
打开开发者模式
,点击右侧设置
按钮
在偏好设置
中找到语言
下拉项即可
调试代码如何友好格式化
在偏好设置
中把这四个勾上即可
采集小难题
scrapy禁用SSL证书验证
custom_settings = {
'DOWNLOADER_CLIENTCONTEXTFACTORY' : 'scrapy.core.downloader.contextfactory.ScrapyClientContextFactory',
'DOWNLOADER_CLIENTCONTEXTFACTORY_CLASS' : 'scrapy.core.downloader.contextfactory.ScrapyClientContextFactory',
'DOWNLOADER_CLIENTCONTEXTFACTORY_KWARGS' : {'ssl_version': ssl.PROTOCOL_TLSv1, }
}
scrapy修改ja3指纹算法
这里只简单介绍,更详细更具体的方案可以参考这篇文章
# 1. 在配置文件中使用
DOWNLOADER_CLIENT_TLS_CIPHERS = 'RSA+AES:RSA+3DES:RSA+AESGCM:ECDH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:ECDH+HIGH:DH+HIGH:DH+3DES:RSA+HIGH:DH+AES:ECDH+3DES:!aNULL:!eNULL:!MD5'
# 2. 在爬虫文件中使用
custom_settings = {
'DOWNLOADER_CLIENT_TLS_CIPHERS': 'RSA+AES:RSA+3DES:RSA+AESGCM:ECDH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:ECDH+HIGH:DH+HIGH:DH+3DES:RSA+HIGH:DH+AES:ECDH+3DES:!aNULL:!eNULL:!MD5',
}
# 注意,指纹算法不同网站可能检测不一样,比如我遇到一个用上面的指纹就不行,还是用下面的才行
custom_settings = {
'DOWNLOADER_CLIENT_TLS_CIPHERS': 'DH+AES:RSA+AES',
}
execjs Cannot find module ‘xxx’
cwd指定node_modules目录位置
with open(js_path, 'r', encoding='utf-8') as fr:
str_data = fr.read()
self.js_code = execjs.compile(str_data, cwd=os.path.join(os.path.join(getRootDir(), 'nodejs'), 'node_modules'))
html乱码样例解码
样例:%3Cli%20class%3D%22active%22%3E%0D%0A%3Ca%20href%3D%22
这种样例包含url编码的链接、html标签和一些unicode转义字符(实际上是UTF-8编码的Unicode字符,但在HTML中以%u的形式出现,需要进行两次转码操作
import re
from urllib.parse import unquote
def decode_unicode_escape(match):
hex_str = match.group(1)
return chr(int(hex_str, 16))
html_fragment = "样例文本"
html_decoded = re.sub(r'%u([0-9A-Fa-f]{4})', decode_unicode_escape, html_fragment)
print(unquote(html_decoded))