Python JS逆向实战:混淆代码还原+加密算法抠取全流程
做过网页爬虫的同学都懂现在的网站反爬80%的核心壁垒都在JS加密——请求参数里的sign、token、encryptData全是前端JS生成的加密串抓包能看到结果但死活猜不到规则。更头疼的是这些JS代码还被刻意混淆变量名是a1b2c3、代码被压缩成一行、甚至加了控制流平坦化连看懂都难更别说抠取算法了。我经手过电商、金融、资讯类网站的JS逆向项目踩过最典型的坑花半天还原了混淆代码结果抠出来的加密函数跑不起来依赖window对象好不容易跑起来了和前端生成的sign对不上漏了隐藏的参数甚至用execjs调用时因为JS版本兼容问题本地运行正常线上直接报错。这篇文章不搞理论堆砌全是生产环境验证过的实战流程从Chrome调试定位加密入口到混淆代码还原再到加密算法抠取、环境补全最后用Python调用实现自动化爬取。全程手把手哪怕你是JS逆向新手也能跟着搞定90%的前端加密场景。一、先搞懂JS逆向的核心壁垒动手前先理清JS逆向的三大核心难题否则全是瞎忙活代码混淆前端为了防逆向会对JS代码做压缩、变量名混淆、控制流平坦化、死代码插入直接看就是“乱码”环境依赖加密函数依赖浏览器环境如window、navigator、document抠出来直接跑会报错算法隐藏加密逻辑分散在多个函数里甚至动态生成单纯搜“AES”“RSA”找不到核心入口。核心结论JS逆向的本质是“还原清晰代码→定位加密入口→抠取核心算法→补全运行环境→Python调用”五步缺一不可。二、前置工具准备新手也能配工具不在多够用就好以下是我实测的最简配置避免新手眼花缭乱工具作用安装/使用要点Chrome开发者工具调试JS、打断点、定位加密函数按F12打开重点用Sources面板Node.js运行抠取的JS代码补全环境安装LTS版本验证node -vjsbeautifier格式化混淆代码浏览器插件/在线工具https://beautifier.io/AST Explorer进阶AST反混淆在线工具https://astexplorer.net/Python3.8最终调用加密算法安装execjs/py_mini_racer二选一油猴插件辅助调试禁用网站反调试安装反调试脚本避免调试时JS闪退快速验证环境# Python依赖安装二选一py_mini_racer性能更优pipinstallPyExecJS# 简单但性能一般pipinstallpy_mini_racer# 推荐基于V8引擎# Node.js验证node-econsole.log(Node环境正常)三、第一步定位加密入口最关键的第一步逆向的核心是“找对入口”否则再怎么还原代码都是白费。以下是我总结的“秒定位”技巧3.1 抓包锁定加密参数先用Chrome开发者工具Network面板抓目标请求找到加密参数如sign记录哪个请求包含该参数如https://api.target.com/v1/data参数生成的时机请求发送前。3.2 调试定位加密函数步骤1开启XHR断点Sources面板 → XHR/fetch Breakpoints → 点击“” → 输入目标接口的关键词如/v1/data→ 刷新页面代码会在请求发送前断住。步骤2回溯调用栈断住后看右侧Call Stack调用栈从下往上找包含“sign”“encrypt”等关键词的函数点击进入这就是加密函数的入口。步骤3验证核心函数在可疑函数处打“行断点”点击代码行号刷新页面执行到断点时通过Console面板打印变量值验证是否是生成加密参数的核心函数。实战示例假设断住后找到核心函数// 混淆前的核心函数示例functiongenerateSign(data){varkeyabc123;varstrJSON.stringify(data)key;returnmd5(str);}但实际看到的是混淆后的代码functiona(b){varcabc123;vardJSON.stringify(b)c;returne(d)}这就是我们需要还原的混淆代码。四、第二步混淆代码还原从乱码到可读拿到混淆代码后先还原成可读格式否则连变量、函数的逻辑都看不懂。4.1 基础还原格式化去压缩步骤1复制混淆代码在Sources面板中找到混淆的JS文件右键→Save→保存到本地如encrypt.js。步骤2在线格式化打开https://beautifier.io/粘贴混淆代码点击“Beautify JS”得到格式化后的代码至少能看清函数结构。效果对比混淆前一行乱码function a(b){var cabc123;var dJSON.stringify(b)c;return e(d)}格式化后functiona(b){varcabc123;vardJSON.stringify(b)c;returne(d);}4.2 进阶还原去变量混淆控制流平坦化如果遇到更复杂的混淆如变量名是_0x123456、控制流绕来绕去需要做进阶还原技巧1替换混淆变量名格式化后先把无意义的变量名a/b/c/_0x123456替换成有意义的名字如generateSign/data/key方便理解逻辑。技巧2去除死代码混淆代码里会插入大量无用的if(true)、for(;;)等死代码直接删除不影响核心逻辑的部分。技巧3AST反混淆进阶对于控制流平坦化的混淆用AST Explorer解析JS的抽象语法树批量修改语法结构还原正常的控制流。打开AST Explorer选择JS→babel粘贴混淆代码编写简单的AST转换脚本去除无用节点、还原控制流导出还原后的代码。实战还原示例原始混淆代码控制流平坦化functiona(b){varc[function(d){returnJSON.stringify(d);},function(d){returnmd5(d);}];vardabc123;varec[0](b)d;returnc[1](e);}还原后functiongenerateSign(data){varkeyabc123;varrawStrJSON.stringify(data)key;returnmd5(rawStr);}4.3 验证还原结果还原后在Chrome Console面板中运行还原后的函数传入测试参数看是否和前端生成的加密结果一致验证还原是否正确。五、第三步加密算法抠取环境补全核心难点还原代码后下一步是把加密函数“抠出来”并解决环境依赖问题否则直接跑会报错。5.1 抠取核心代码步骤1提取最小依赖只复制加密相关的核心函数不要复制整个JS文件冗余代码会导致运行报错。比如上面的示例需要抠取generateSign函数依赖的md5函数如果是自定义的md5也要一起抠。步骤2处理外部依赖如果加密函数依赖第三方库如crypto-js需要把对应的库代码一起抠取或在Node.js中安装对应库。5.2 补全运行环境解决“window is not defined”前端JS依赖浏览器环境window、navigator等抠出来在Node.js/Python中运行时会报错需要补全环境实战示例补全环境代码新建encrypt_core.js写入抠取的代码环境补全// 第一步补全Node.js缺少的浏览器环境if(typeofwindowundefined){global.window{};global.navigator{userAgent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0};}// 第二步抠取的md5函数示例实际以网站为准functionmd5(str){// 此处省略md5核心实现从前端抠取varcryptorequire(crypto);// Node.js内置crypto库替代前端md5returncrypto.createHash(md5).update(str).digest(hex);}// 第三步核心加密函数还原后的functiongenerateSign(data){varkeyabc123;varrawStrJSON.stringify(data)key;returnmd5(rawStr);}// 第四步暴露函数方便Python调用if(typeofmodule!undefined){module.exports{generateSign:generateSign};}5.3 验证抠取的代码Node.js中测试在本地运行Node.js验证加密函数是否正常# 进入代码目录cd/path/to/js/file# 运行Node.js交互模式node在Node控制台中执行// 导入抠取的函数varencryptrequire(./encrypt_core.js);// 测试参数vartestData{page:1,pageSize:20};// 生成signvarsignencrypt.generateSign(testData);console.log(生成的sign,sign);如果输出的sign和前端抓包的一致说明抠取和环境补全成功。六、第四步Python调用加密函数最终落地验证JS代码正常后用Python调用该函数实现自动化爬取。推荐用py_mini_racer性能比execjs好无Node.js版本兼容问题。6.1 完整Python爬取代码生产级importrequestsimportjsonfrompy_mini_racerimportMiniRacerimporttimeimportrandom# 配置项 classConfig:# 目标接口TARGET_URLhttps://api.target.com/v1/data# JS加密文件路径JS_FILE_PATH./encrypt_core.js# 请求头从抓包复制HEADERS{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36,Content-Type:application/json,Referer:https://www.target.com/}# 初始化JS运行环境 definit_js_context():初始化MiniRacer加载加密JStry:# 创建JS上下文ctxMiniRacer()# 读取并执行JS文件withopen(Config.JS_FILE_PATH,r,encodingutf-8)asf:js_codef.read()ctx.eval(js_code)returnctxexceptExceptionase:print(fJS环境初始化失败{str(e)})returnNone# 生成加密参数 defgenerate_encrypt_params(data:dict,ctx)-dict:调用JS函数生成加密参数try:# 将Python字典转为JS字符串data_strjson.dumps(data)# 调用JS的generateSign函数signctx.call(generateSign,data_str)# 构造最终请求参数params{**data,sign:sign,timestamp:str(int(time.time()*1000))# 按需添加时间戳}returnparamsexceptExceptionase:print(f生成加密参数失败{str(e)})return{}# 核心爬取函数 defcrawl_data(page:int,ctx)-dict:爬取单页数据# 1. 构造原始参数raw_data{page:page,pageSize:20}# 2. 生成加密参数encrypt_paramsgenerate_encrypt_params(raw_data,ctx)ifnotencrypt_params:return{}try:# 3. 发起请求responserequests.post(urlConfig.TARGET_URL,headersConfig.HEADERS,jsonencrypt_params,timeout10)# 4. 处理响应ifresponse.status_code200:resultresponse.json()print(f爬取第{page}页成功数据量{len(result.get(data,[]))})returnresultelse:print(f爬取失败状态码{response.status_code}响应{response.text})return{}exceptExceptionase:print(f爬取出错{str(e)})return{}# 批量爬取 defbatch_crawl(start_page:int,end_page:int):批量爬取多页数据# 初始化JS环境只初始化一次提升性能ctxinit_js_context()ifnotctx:returnall_data[]forpageinrange(start_page,end_page1):resultcrawl_data(page,ctx)ifresult.get(data):all_data.extend(result[data])# 模拟人类间隔避免频率限制time.sleep(random.uniform(1,2))# 保存数据withopen(crawl_result.json,w,encodingutf-8)asf:json.dump(all_data,f,ensure_asciiFalse,indent4)print(f批量爬取完成总数据量{len(all_data)}已保存到crawl_result.json)# 执行入口 if__name____main__:# 爬取1-10页数据batch_crawl(1,10)6.2 备选方案用execjs调用兼容老项目如果不想用py_mini_racer可以用execjs核心代码替换如下importexecjsdefinit_js_context_execjs():用execjs初始化JS环境withopen(Config.JS_FILE_PATH,r,encodingutf-8)asf:js_codef.read()ctxexecjs.compile(js_code)returnctxdefgenerate_encrypt_params_execjs(data:dict,ctx)-dict:execjs调用JS函数data_strjson.dumps(data)signctx.call(generateSign,data_str)params{**data,sign:sign}returnparams七、生产级踩坑实录血的教训这部分是实战核心也是90%教程不会讲的细节帮你少走半年弯路7.1 混淆代码还原常见坑控制流平坦化还原不彻底只格式化没还原控制流导致抠取的函数逻辑混乱——解决方案先用AST工具批量处理再手动微调漏看隐藏参数加密函数依赖window.location.href、document.cookie等隐藏参数抠取后因缺少这些参数生成的sign不一致——解决方案调试时打印所有变量补全隐藏参数变量名替换错误把关键变量名改错导致函数运行报错——解决方案替换前先注释验证后再修改。7.2 环境补全常见坑Node.js版本兼容前端用ES6语法本地Node版本太低导致报错——解决方案安装Node.js 14 LTS版本crypto-js版本不一致前端用3.x版本本地装4.x版本加密结果不同——解决方案安装和前端一致的版本缺少全局变量如document、localStorage直接补全为空对象即可只要加密函数不实际使用。7.3 Python调用常见坑py_mini_racer编码问题中文参数导致加密结果错误——解决方案确保JS和Python文件都是UTF-8编码execjs找不到Node.js报错“Could not find an available JavaScript runtime”——解决方案配置环境变量指定Node.js路径性能问题每次爬取都初始化JS环境速度慢——解决方案全局只初始化一次JS上下文。7.4 进阶解决方案全自动抠取用Frida Hook前端JS直接获取加密函数的输入输出无需手动还原混淆代码JS代码打包把抠取的代码打包成单个文件避免依赖缺失监控加密规则变化定期抓包验证sign若不一致重新逆向网站更新会改加密规则。八、合规提醒本文所有技术仅用于合法的技术研究和企业内部数据采集需严格遵守《网络安全法》《数据安全法》不爬取未公开数据、隐私数据遵守网站的用户协议和robots协议不用于商业侵权逆向行为仅针对自己有权访问的网站切勿攻击他人系统否则需承担法律责任。结语JS逆向的核心不是“看懂每一行代码”而是“抓大放小”——找到核心加密逻辑还原关键代码补全必要环境最终实现Python调用。这套“定位入口→还原混淆→抠取算法→补全环境→Python调用”的全流程方案是我在多个商业爬虫项目中验证过的最优解从最基础的格式化还原到进阶的AST反混淆再到生产级的Python整合覆盖了JS逆向的全场景。相比于网上零散的教程这套方案的核心是“落地性”——所有代码都能直接运行所有坑都有解决方案新手也能跟着搞定主流网站的前端加密反爬。

相关新闻

基于PHP、asp.net、java、Springboot、SSM、vue3的“在线小说创作平台”的设计与实现

基于PHP、asp.net、java、Springboot、SSM、vue3的“在线小说创作平台”的设计与实现

目录 可选框架 可选语言 内容 可选框架 J2EE、MVC、vue3、spring、springmvc、mybatis、SSH、SpringBoot、SSM、django 可选语言 java、web、PHP、asp.net、javaweb、C#、python、 HTML5、jsp、ajax、vue3 内容 进入二十一世纪,随着移动互联网技术的发展以及…

2026/7/5 4:46:12 阅读更多 →
带有外生变量的时间序列预测

带有外生变量的时间序列预测

关于“带有外生变量的时间序列预测(TSF-X)”,目前最新的机器学习/深度学习方法呈现出从“简单拼接”走向“深度耦合” 的鲜明趋势。根据2025-2026年的最新文献,主流技术路线可归纳为四大范式,且2025年已出现针对TSF-X问…

2026/7/5 14:17:30 阅读更多 →
以 Cloud 为核心的设备 mTLS 证书体系:从产品需求到 OP-TEE 安全落地

以 Cloud 为核心的设备 mTLS 证书体系:从产品需求到 OP-TEE 安全落地

📺 B站:博主个人介绍 📘 博主书籍-京东购买链接*:Yocto项目实战教程 📘 加博主微信,进技术交流群: jerrydev 以 Cloud 为核心的设备 mTLS 证书体系:从产品需求到 OP-TEE 安全落地&…

2026/5/17 4:34:24 阅读更多 →

最新新闻

如何快速上手Azure WebJobs SDK:30分钟搭建你的第一个后台任务

如何快速上手Azure WebJobs SDK:30分钟搭建你的第一个后台任务

如何快速上手Azure WebJobs SDK:30分钟搭建你的第一个后台任务 【免费下载链接】azure-webjobs-sdk Azure WebJobs SDK 项目地址: https://gitcode.com/gh_mirrors/az/azure-webjobs-sdk Azure WebJobs SDK是一个强大的框架,简化了在Azure中编写后…

2026/7/6 16:37:52 阅读更多 →
掌握yuzu模拟器:从零开始构建高性能Switch游戏环境

掌握yuzu模拟器:从零开始构建高性能Switch游戏环境

掌握yuzu模拟器:从零开始构建高性能Switch游戏环境 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu作为目前最受欢迎的任天堂Switch开源模拟器,为PC玩家提供了在Windows、Linux和Androi…

2026/7/6 16:37:52 阅读更多 →
安卓修改大师多语言实战:从零掌握values目录规范与高棉语包添加

安卓修改大师多语言实战:从零掌握values目录规范与高棉语包添加

安卓修改大师多语言实战:从零掌握values目录规范与高棉语包添加 简介 安卓修改大师(官网 www.apkeditor.cn)是一款功能强大的APK反编译与定制工具,无需编程基础即可轻松实现应用的汉化与多语言版本制作。本文将系统讲解Android多…

2026/7/6 16:35:50 阅读更多 →
如何在ComfyUI中轻松实现AI视频生成:WanVideoWrapper完全指南

如何在ComfyUI中轻松实现AI视频生成:WanVideoWrapper完全指南

如何在ComfyUI中轻松实现AI视频生成:WanVideoWrapper完全指南 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 你是否曾经梦想过将文字描述变成生动的视频画面?或者让静态…

2026/7/6 16:35:50 阅读更多 →
SwiftUI与AppKit架构融合:eul如何重构macOS状态监控应用开发范式

SwiftUI与AppKit架构融合:eul如何重构macOS状态监控应用开发范式

SwiftUI与AppKit架构融合:eul如何重构macOS状态监控应用开发范式 【免费下载链接】eul 🖥️ macOS status monitoring app written in SwiftUI. 项目地址: https://gitcode.com/gh_mirrors/eu/eul 在macOS应用开发领域,传统AppKit与现…

2026/7/6 16:31:44 阅读更多 →
告别背景音乐干扰:LTX-2.3 Foley LoRA让视频音效更真实的终极技巧

告别背景音乐干扰:LTX-2.3 Foley LoRA让视频音效更真实的终极技巧

告别背景音乐干扰:LTX-2.3 Foley LoRA让视频音效更真实的终极技巧 【免费下载链接】LTX-2.3-Foley-LoRA 项目地址: https://ai.gitcode.com/hf_mirrors/FuzzPuppy/LTX-2.3-Foley-LoRA 你是否曾为视频自动生成的背景音乐感到困扰?想要真实的音效却…

2026/7/6 16:29:42 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻