JS 逆向加解密:堆栈原理与四大定位技巧

张开发
2026/4/20 21:27:54 15 分钟阅读

分享文章

JS 逆向加解密:堆栈原理与四大定位技巧
JS 逆向加解密堆栈原理与四大定位技巧在前端逆向工程中加解密逻辑往往隐藏在海量代码、动态加载脚本或混淆代码中直接查找加密函数如同“大海捞针”。想要高效定位核心逻辑必须先掌握堆栈原理理解代码执行脉络再结合合适的定位方式精准锁定关键代码。本文将先拆解堆栈的底层逻辑再详细讲解全局搜索、事件断点、XHR/Fetch断点、启动器调试四种核心定位方式帮助逆向工程师建立“先懂流程再找代码”的逆向思维。一、堆栈原理理解JS代码的“执行脉络”在定位加解密逻辑前必须先搞懂“堆栈”是什么——它是浏览器记录函数调用关系的核心机制如同一张“代码执行地图”能帮我们还原从“触发操作”到“加密执行”再到“请求发送”的完整链路。1. 堆栈的核心概念调用堆栈Call Stack当JS代码执行时每调用一个函数浏览器会将该函数的执行上下文如参数、局部变量、执行位置压入“栈”中函数执行完毕后会从栈中弹出。最终堆栈会记录当前所有未执行完毕的函数调用关系。栈的特性后进先出LIFO最后被调用的函数会压在栈顶最先执行完毕并弹出最先被调用的函数压在栈底最后执行完毕。堆栈与执行顺序的关系堆栈展示顺序从上到下 调用顺序后调用的函数在栈顶代码执行顺序从下到上 执行顺序栈底的函数最先执行栈顶的函数当前正在执行。2. 堆栈在逆向中的核心作用逆向加解密的本质是“追溯数据流向”——从“加密后的密文”反向找到“明文输入”和“加密函数”。而堆栈恰好能提供这条“追溯路径”当代码暂停在某一位置如请求发送、加密执行时通过堆栈可向上栈底方向追溯“谁调用了当前函数”逐步找到明文参数的来源和加密函数的入口避免盲目搜索代码精准锁定与加解密相关的函数调用链忽略无关代码干扰。3. 堆栈示例还原加密执行流程假设某网站登录的加密执行链路如下// 1. 页面加载时绑定点击事件 window.onload function() { document.querySelector(.login-btn).addEventListener(click, handleLogin); // 步骤1绑定事件 }; // 2. 点击按钮触发事件回调 function handleLogin() { const username document.getElementById(username).value; const password document.getElementById(password).value; const encryptedPwd encryptPassword(password); // 步骤2调用加密函数 submitRequest(username, encryptedPwd); // 步骤3调用请求提交函数 } // 3. 密码加密核心函数 function encryptPassword(pwd) { return CryptoJS.MD5(pwd salt123).toString(); // 步骤4执行加密 } // 4. 提交请求 function submitRequest(username, pwd) { const xhr new XMLHttpRequest(); xhr.open(POST, /user/login); xhr.send(JSON.stringify({ username, password: pwd })); // 步骤5发送请求 }当我们在xhr.send()处触发断点时调用堆栈Call Stack会显示如下从上到下send xhr.js:50 // 栈顶当前正在执行的函数请求发送 submitRequest login.js:30 // 调用send的函数组装请求 handleLogin login.js:15 // 调用submitRequest的函数事件回调 (anonymous) login.js:5 // 栈底最先执行的函数绑定事件此时通过堆栈追溯栈顶send确认请求已组装完成password是密文上一层submitRequest找到密文pwd的来源是encryptedPwd参数再上一层handleLogin找到encryptedPwd是encryptPassword(password)的返回值且password是表单输入的明文最终定位到加密核心函数encryptPassword。二、四大定位方式精准锁定加解密逻辑掌握堆栈原理后结合以下四种定位方式可覆盖绝大多数前端加解密场景。每种方式各有适用场景需根据“是否已知函数名、是否已知接口、触发方式”灵活选择。1. 全局搜索最快定位已知特征的加密函数全局搜索是最直接的定位方式适用于已知加密相关特征的场景如加密函数名、参数名、关键字核心是通过“特征匹配”快速锁定可疑代码。核心原理前端加解密逻辑往往包含明显的特征关键词如函数/参数名encrypt加密、decrypt解密、sign签名、password密码、salt盐值、key密钥算法关键词MD5、SHA256、AES、RSA、CryptoJS常用加密库操作关键词base64、encode编码、decode解码。通过浏览器开发者工具的全局搜索功能匹配这些关键词可快速找到疑似加密函数。操作步骤打开浏览器开发者工具F12切换到「Sources」面板按下「CtrlShiftF」全局搜索快捷键输入关键词如encrypt、CryptoJS、password搜索结果会显示所有匹配的文件和代码行点击结果可直接跳转到对应代码在疑似加密函数的入口处设置普通断点触发加密操作如点击登录观察变量和执行流程。进阶技巧模糊匹配若不确定完整关键词可使用通配符如encry*匹配encrypt、encryptPassword多关键词组合同时搜索encryptpassword缩小匹配范围排除框架代码搜索结果中若包含jquery.js、vue.js等框架文件可勾选「Filter」筛选业务代码文件如login.js、api.js。优劣分析优势操作最快、效率最高适合有明确特征的场景如已知用CryptoJS加密、参数名是sign劣势对无明显特征的加密逻辑无效如函数名被混淆为a、b无关键词。实战场景某网站登录时密码加密已知前端使用CryptoJS库通过全局搜索输入关键词CryptoJS找到login.js中包含CryptoJS.AES.encrypt的代码定位到函数function d(e) { return CryptoJS.AES.encrypt(e, key123).toString() }在该函数第一行设置断点点击登录代码暂停观察到e是输入的明文密码确认这是核心加密函数。2. 事件断点追溯用户操作触发的加密逻辑事件断点适用于加密逻辑由用户操作触发的场景如点击登录按钮、提交表单、输入文本无需提前知道任何代码特征通过“捕获用户事件”反向追溯加密函数。核心原理用户操作点击、输入、提交会触发DOM事件click、submit、input而加解密逻辑通常在事件的回调函数中执行如点击登录按钮后回调函数中获取表单数据并加密。通过给DOM元素或全局事件设置断点可在事件触发时暂停代码再通过堆栈追溯到加密函数。两种事件断点用法1元素级事件断点精准适用于已知触发加密的具体DOM元素如登录按钮、提交按钮切换到「Elements」面板通过「CtrlShiftC」选中目标元素如登录按钮button classlogin-btn右键点击该元素选择「Break on」→ 「Attribute modifications」属性修改如按钮禁用状态变化或「Event handlers」直接捕获事件回调触发用户操作如点击按钮代码会暂停在事件回调函数中通过调用堆栈向上追溯找到加密函数。2全局事件断点广谱适用于未知具体触发元素但知道事件类型如click、submit切换到「Sources」面板展开「Event Listener Breakpoints」勾选对应事件类型如「Mouse → click」、「Form → submit」触发用户操作代码会暂停在所有click或submit事件的回调函数中结合堆栈和代码逻辑筛选出与加解密相关的回调函数。优劣分析优势无需提前了解代码结构覆盖范围广适合加密函数隐藏深、无明显特征的场景劣势可能触发大量无关事件如页面其他元素的点击需要耐心筛选堆栈。实战场景某网站登录按钮点击后无明显加密关键词通过元素级事件断点选中登录按钮右键「Break on」→「Event handlers」→「click」点击按钮代码暂停在handleLogin回调函数中查看堆栈发现handleLogin调用了f(pwd)进入f函数后看到return btoa(pwd salt)Base64编码加密成功定位加密逻辑。3. XHR/Fetch断点从请求出发逆向加密源头XHR/Fetch断点适用于已知加密参数所在接口的场景如登录接口/user/login、数据接口/api/data核心是“拦截请求发送过程”通过堆栈逆向追溯参数加密的源头。核心原理所有前端请求XHR或Fetch发送前必须先完成参数组装和加密如将明文密码转为密文、生成sign签名。给目标接口设置断点后当JS执行到XMLHttpRequest.send()或fetch()时会自动暂停此时堆栈中会保留从“加密函数”到“请求发送”的完整调用链向上追溯即可找到加密逻辑。操作步骤切换到「Sources」面板点击「XHR/Fetch Breakpoints」标签点击「」号输入目标接口的路径支持精确匹配和模糊匹配精确匹配/user/login仅拦截该接口模糊匹配/api/拦截所有包含/api/的接口触发请求如点击登录、刷新页面当请求即将发送时代码会暂停在send()或fetch()处查看「Call Stack」调用堆栈从栈顶send函数向上追溯找到参数加密的关键函数。关键技巧观察请求数据暂停后通过「Scope」面板查看send()的参数如请求体data确认哪些参数是加密后的密文如password、sign跳过框架代码堆栈中若包含axios.js、fetch.js等请求库代码可通过「黑盒脚本」Blackbox Script隐藏专注于业务代码结合条件断点若同一接口有多次请求如分页加载可给XHR断点添加条件如url.includes(login)仅拦截目标请求。优劣分析优势精准锁定与请求相关的加密逻辑无无关干扰是登录、数据提交接口逆向的首选方式劣势仅支持XHR/Fetch请求不支持form表单提交、script标签动态加载等非异步请求。实战场景某网站数据接口/api/getData的请求参数包含sign签名通过XHR断点添加XHR断点输入/api/getData刷新页面触发请求代码暂停在xhr.send()处查看堆栈向上追溯到buildParams函数发现该函数接收原始参数page1size10继续向上追溯到generateSign函数看到sign的生成逻辑md5(params timestamp secretKey)成功还原签名算法。4. 启动器网络面板的“快捷堆栈工具”启动器Initiator是浏览器「Network」面板中XHR/Fetch请求的内置功能——无需手动设置断点可直接查看该请求的“调用堆栈”快速关联到请求对应的JS代码是效率最高的定位方式之一。核心原理每个前端请求都有“启动者”即触发该请求的JS函数启动器功能会记录请求的完整调用堆栈并直接提供代码跳转入口。逆向时通过启动器可跳过“设置断点-触发暂停”的步骤直接从请求关联到加密函数所在的代码位置。操作步骤打开开发者工具F12切换到「Network」面板筛选请求类型点击「XHR」或「Fetch」只显示目标请求类型触发目标请求如点击登录、刷新页面找到需要逆向的接口如/user/login点击该请求在右侧详情面板中切换到「Initiator」启动器标签查看调用堆栈堆栈从上到下是“调用顺序”点击任意堆栈条目可直接跳转到对应的JS代码行追溯加密逻辑从堆栈的“请求发送函数”如send、fetch向上追溯找到参数加密的核心函数。优劣分析优势无需手动断点直接通过请求关联堆栈省去设置断点、触发暂停的步骤效率极高劣势仅能查看“已发送请求”的堆栈若加密逻辑在请求发送前被拦截如条件不满足则无法捕获部分混淆代码可能导致堆栈显示不完整。实战场景某网站登录接口/user/login的password参数是加密值通过启动器快速定位打开「Network」→「XHR」点击登录按钮找到/user/login请求点击该请求切换到「Initiator」标签看到堆栈如下从上到下fetch fetch.js:30 sendLoginReq login.js:40 encryptAndSubmit login.js:25 handleLoginClick login.js:15点击堆栈条目encryptAndSubmit login.js:25直接跳转到该函数代码function encryptAndSubmit() { const pwd document.getElementById(pwd).value; const encryptedPwd cryptoFunc(pwd); // 加密函数 sendLoginReq(encryptedPwd); }再点击cryptoFunc函数即可查看完整加密逻辑全程无需设置任何断点。三、四大定位方式选择指南已知条件推荐定位方式核心优势已知加密关键词如encrypt、CryptoJS全局搜索速度最快直接匹配特征已知触发加密的用户操作如点击登录事件断点无需代码特征追溯事件回调已知加密接口如/user/login启动器优先 XHR断点启动器快捷高效XHR断点精准拦截加密逻辑在页面加载时执行XHR断点 启动器捕获初始化请求的堆栈加密函数无特征、被混淆启动器优先 事件断点双重验证快速缩小范围四、总结逆向加解密的核心逻辑闭环JS逆向加解密的本质是“追溯数据流向”而堆栈原理是“追溯的工具”四大定位方式是“追溯的入口”。完整的逆向流程可总结为场景分析明确加密触发时机用户操作/页面加载、相关接口/元素、是否有已知特征选择入口根据场景匹配定位方式全局搜索/事件断点/XHR断点/启动器调试触发断点执行对应操作点击/刷新/输入让代码暂停在关键位置堆栈追溯从暂停位置向上追溯还原“明文输入→加密执行→密文输出→请求发送”的完整链路还原逻辑通过单步执行、变量观察明确加密算法如AES/MD5、密钥/盐值、参数组合规则最终复现加密过程。《网络安全从零到精通全套学习大礼包》96节从入门到精通的全套视频教程免费领取如果你也想通过学网络安全技术去帮助就业和转行我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。网络安全学习路线图想要学习 网络安全作为新手一定要先按照路线图学习方向不对努力白费。对于从来没有接触过网络安全的同学我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线大家跟着这个路线图学习准没错。配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取

更多文章