当前位置: 首页 > news >正文

JS加密反爬实战全解:从参数定位到请求模拟的完整破解流程


在当今的网络爬虫领域,JS加密已经成为网站最常用的反爬手段之一。从简单的MD5哈希到复杂的AES对称加密,再到高度混淆的自定义算法,网站开发者们不断升级加密技术来保护数据安全。对于爬虫工程师而言,掌握JS加密的破解方法已经成为一项必备技能。本文将带你从原理到实战,系统地学习如何分析、破解JS参数加密,并实现稳定的请求模拟。

一、JS加密反爬的核心原理与常见类型

1.1 为什么网站使用JS加密反爬

传统的反爬手段如User-Agent检测、IP限制、Cookie验证等,已经被爬虫工程师们研究得非常透彻,很容易被绕过。而JS加密反爬则将关键的参数生成逻辑放在客户端执行,服务器只验证加密后的结果,这大大增加了爬虫的难度。

具体来说,JS加密反爬的优势在于:

  • 加密逻辑动态变化,难以一次性破解
  • 每个请求都需要生成唯一的加密参数
  • 可以结合时间戳、随机数等防止重放攻击
  • 混淆后的JS代码可读性极差,增加分析成本

1.2 常见的JS加密类型

目前主流的JS加密可以分为以下几类:

加密类型代表算法特点常见应用场景
哈希加密MD5、SHA1、SHA256单向不可逆,相同输入产生相同输出生成签名、校验数据完整性
对称加密AES、DES、3DES加密解密使用相同密钥,速度快加密请求体、响应体
非对称加密RSA公钥加密私钥解密,安全性高传输对称密钥、登录密码加密
自定义加密网站自行实现的算法无标准可循,破解难度最大生成关键请求参数如sign、token

二、JS参数加密破解的完整流程

破解JS参数加密是一个系统性的过程,需要遵循一定的步骤和方法。下面是我总结的通用破解流程:

抓包分析请求

识别加密参数

搜索关键词定位JS文件

断点调试找到加密函数

分析加密逻辑

提取加密代码

测试加密函数

复现加密逻辑

构造请求参数

模拟请求获取数据

2.1 抓包分析与参数识别

破解的第一步是使用抓包工具分析网站的请求。推荐使用Chrome浏览器自带的开发者工具(F12),它功能强大且使用方便。

具体操作步骤:

  1. 打开Chrome开发者工具,切换到"Network"面板
  2. 勾选"Preserve log"选项,防止页面刷新时日志丢失
  3. 刷新页面或触发目标操作
  4. 找到对应的API请求,查看"Request Headers"和"Form Data"
  5. 识别出哪些参数是加密的,通常命名为sign、token、signature、_sign等

关键技巧:对比多次请求的参数,找出变化的参数。不变的参数通常不需要处理,而变化的参数就是我们需要破解的目标。

2.2 定位加密函数位置

找到加密参数后,下一步就是定位生成这些参数的JS函数。常用的方法有:

方法一:全局搜索关键词

在Chrome开发者工具的"Sources"面板中,使用快捷键Ctrl+Shift+F打开全局搜索,搜索加密参数的名称。例如,如果加密参数是"sign",就搜索"sign="、“sign:”、"sign("等。

方法二:XHR断点

如果加密参数是在AJAX请求中发送的,可以使用XHR断点来定位。在"Sources"面板的"XHR/fetch Breakpoints"中添加断点,输入API请求的部分URL。当请求发送时,代码会在发送前中断,此时可以查看调用栈,找到加密函数的位置。

方法三:事件断点

如果加密参数是在点击按钮等事件触发时生成的,可以使用事件断点。在"Sources"面板的"Event Listener Breakpoints"中展开"Mouse",勾选"click"。当点击按钮时,代码会中断,然后逐步调试找到加密函数。

2.3 分析加密逻辑与提取代码

找到加密函数后,就需要分析它的逻辑。这是整个破解过程中最困难的部分,尤其是当JS代码被混淆时。

常用的调试技巧

  • 在加密函数的入口处设置断点
  • 逐步执行代码(F10),观察变量的变化
  • 使用"Watch"面板监控关键变量的值
  • 使用"Call Stack"面板查看函数调用关系
  • 使用"Scope"面板查看当前作用域的变量

如果JS代码被混淆了,可以使用一些工具进行反混淆,比如js-beautify、deobfuscator等。但需要注意的是,有些混淆技术非常复杂,反混淆工具可能无法完全还原代码,这时候就需要耐心地手动分析。

2.4 复现加密逻辑

分析完加密逻辑后,就需要在我们的爬虫代码中复现这个过程。有两种常用的方法:

方法一:使用Python直接复现

如果加密逻辑比较简单,比如只是MD5哈希或者简单的字符串拼接,可以直接用Python代码复现。这种方法执行速度快,不需要依赖外部环境。

方法二:使用Node.js调用原JS代码

如果加密逻辑比较复杂,或者使用了一些JS特有的函数,直接用Python复现会非常困难。这时候可以使用Node.js来执行原JS代码,然后通过Python调用Node.js获取加密结果。

三、实战案例:破解某电商网站的sign参数

为了让大家更好地理解整个过程,下面我将以一个实际的电商网站为例,详细演示如何破解sign参数加密。

3.1 抓包分析

首先,我们打开目标网站,使用Chrome开发者工具抓包。找到商品列表的API请求,查看请求参数:

https://api.example.com/goods/list ?page=1 &size=20 &timestamp=1650000000000 &nonce=abcdef123456 &sign=7b2c8a9d0e1f3b5c7e9a2b4d6f8c0a1e

可以看到,请求参数中有timestamp(时间戳)、nonce(随机数)和sign(签名)三个动态参数。我们的目标就是破解sign参数的生成逻辑。

3.2 定位加密函数

我们使用全局搜索功能搜索"sign=",很快就找到了相关的JS代码:

functiongenerateSign(params){varkeys=Object.keys(params).sort();varstr='';for(vari=0;i<keys.length;i++){str+=keys[i]+'='+params[keys[i]]+'&';}str=str.substring(0,str.length-1);str+='secret_key=abcdefghijklmnopqrstuvwxyz123456';returnmd5(str).toUpperCase();}

3.3 分析加密逻辑

通过分析代码,我们可以看出sign参数的生成逻辑是:

  1. 将所有请求参数按键名排序
  2. 按照"key=value&"的格式拼接成字符串
  3. 在字符串末尾拼接上固定的密钥"secret_key=abcdefghijklmnopqrstuvwxyz123456"
  4. 对拼接后的字符串进行MD5哈希
  5. 将结果转换为大写

3.4 Python复现加密逻辑

现在我们可以用Python代码来复现这个加密逻辑:

importhashlibimporttimeimportrandomimportstringdefgenerate_sign(params,secret_key):# 按键名排序sorted_keys=sorted(params.keys())# 拼接参数str_list=[]forkeyinsorted_keys:str_list.append(f"{key}={params[key]}")sign_str='&'.join(str_list)# 拼接密钥sign_str+=f'&secret_key={secret_key}'# MD5哈希并转大写md5=hashlib.md5()md5.update(sign_str.encode('utf-8'))returnmd5.hexdigest().upper()# 生成随机noncedefgenerate_nonce(length=12):return''.join(random.choices(string.ascii_letters+string.digits,k=length))# 生成时间戳defgenerate_timestamp():returnstr(int(time.time()*1000))# 测试if__name__=='__main__':params={'page':'1','size':'20','timestamp':generate_timestamp(),'nonce':generate_nonce()}secret_key='abcdefghijklmnopqrstuvwxyz123456'sign=generate_sign(params,secret_key)params['sign']=signprint(params)

3.5 模拟请求

有了加密参数的生成方法,我们就可以模拟请求获取数据了:

importrequestsdefget_goods_list(page=1,size=20):base_url='https://api.example.com/goods/list'params={'page':str(page),'size':str(size),'timestamp':generate_timestamp(),'nonce':generate_nonce()}secret_key='abcdefghijklmnopqrstuvwxyz123456'params['sign']=generate_sign(params,secret_key)headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36','Referer':'https://www.example.com/','Accept':'application/json, text/plain, */*'}response=requests.get(base_url,params=params,headers=headers)ifresponse.status_code==200:returnresponse.json()else:print(f"请求失败,状态码:{response.status_code}")returnNone# 测试if__name__=='__main__':goods_list=get_goods_list(page=1,size=20)ifgoods_list:print(goods_list)

四、高级技巧与常见问题解决

4.1 处理混淆的JS代码

很多网站会对JS代码进行混淆,使其变得难以阅读。常见的混淆技术包括:

  • 变量名和函数名替换为无意义的字符
  • 字符串加密
  • 控制流扁平化
  • 死代码注入

对于混淆的JS代码,我们可以使用以下方法处理:

  1. 使用反混淆工具进行初步处理
  2. 逐步调试,理解关键部分的逻辑
  3. 提取核心加密函数,忽略无关的混淆代码
  4. 使用AST(抽象语法树)分析工具辅助分析

4.2 处理动态生成的JS代码

有些网站会动态生成JS代码,每次请求都会返回不同的代码。这时候我们需要:

  1. 每次请求都获取最新的JS代码
  2. 分析JS代码的生成规律,找出不变的部分
  3. 使用正则表达式提取关键的加密逻辑
  4. 使用Node.js的vm模块动态执行JS代码

4.3 处理反调试技术

为了防止开发者调试JS代码,很多网站会加入反调试技术,比如:

  • 检测开发者工具是否打开
  • 无限debugger
  • 检测断点

应对方法:

  1. 使用浏览器插件禁用反调试
  2. 在代码中找到反调试的部分,手动删除或修改
  3. 使用无头浏览器如Puppeteer、Playwright来绕过反调试

4.4 处理RSA非对称加密

如果网站使用RSA非对称加密,我们需要:

  1. 找到网站使用的公钥
  2. 使用Python的rsa库或pycryptodome库进行加密
  3. 注意公钥的格式,通常是PEM格式或PKCS#8格式

五、注意事项与法律风险

在进行爬虫开发时,我们必须遵守法律法规和道德规范:

  1. 不要爬取敏感信息和个人隐私数据
  2. 遵守网站的robots.txt协议
  3. 控制爬取频率,避免对服务器造成过大压力
  4. 不要将爬取的数据用于商业用途
  5. 如果网站明确禁止爬虫,就不要强行爬取

六、总结

JS加密反爬是爬虫领域的一个重要课题,需要我们不断学习和实践。本文介绍了JS加密的常见类型、破解流程和实战案例,希望能帮助大家掌握这项技能。

需要注意的是,网站的反爬技术也在不断升级,没有一劳永逸的破解方法。作为爬虫工程师,我们需要保持学习的热情,不断提升自己的技术水平,同时也要遵守法律法规,做一个负责任的开发者。


👉 点击我的头像进入主页,关注专栏第一时间收到更新提醒,有问题评论区交流,看到都会回。

http://www.jsqmd.com/news/830627/

相关文章:

  • 蘑菇品种识别及可食用检测-目标检测数据集
  • 手把手教你改造Ant Design Vue + JeecgBoot的菜单布局:实现顶部一级、左侧二三级导航
  • 深度解析网络性能监控工具:NetQuality完整实践指南
  • windows环境下安装Docker
  • 如何在5分钟内掌握Unity GLTF导入:GLTFUtility完整使用指南
  • CEF嵌入式浏览器插件的3大核心技术:从直播工具到企业级Web集成引擎
  • MAA明日方舟自动化助手:3大核心功能让你告别重复劳动
  • QT6开发笔记
  • 终极指南:如何通过PowerShell一键安装Windows包管理器winget
  • Taotoken模型广场在技术选型与对比测试中的价值
  • GPT4All-Chat本地部署与性能优化深度解析
  • PyTorch KernelAgent 源码解读 ---(3)--- orchestrator
  • 3个步骤开启AI助手:UI-TARS桌面版让电脑听懂你的话
  • D3KeyHelper暗黑3鼠标宏工具:从新手到高手的完整指南
  • 鸿蒙微内核架构解析:从IPC优化到形式化验证的安全设计
  • 书匠策AI毕业论文功能全拆解:一个教论文写作的博主,居然被它种草了
  • NDVI计算
  • BLE AT指令实战:从GAP广播到GATT服务构建的嵌入式蓝牙开发指南
  • 第四章:TTM分析: 4.6.2 ttm_tt 的设计与核心原理分析
  • 如何零代码玩转taskt:Windows自动化办公的终极指南
  • 使用Taotoken为Hermes Agent配置自定义模型提供方详细步骤
  • 终极ModEngine2指南:从零开始掌握魂类游戏模组引擎
  • 告别Matlab!用C++ Armadillo库在Visual Studio 2022上实现矩阵运算(附完整配置流程)
  • 智能风扇(有完整资料)
  • 边缘计算在结构健康监测中的实践与优化
  • 树莓派GPIO排针焊接与外壳组装全攻略:从焊接技巧到机械装配
  • Unreal 5 MetaHuman实战:从零到一构建高保真数字人
  • M9A:重返未来1999终极自动化助手,彻底告别重复刷图烦恼
  • 让缠论技术分析变得简单:ChanlunX通达信插件终极指南
  • 终极AI助手集成平台:如何用ChatALL一键同时对话ChatGPT、文心一言、Claude等20+主流AI