手把手js逆向断点调试&js逆向前端加密对抗&企业SRC实战分享

手把手js逆向断点调试&js逆向前端加密对抗&企业SRC实战分享

0x1 前言

哈咯,师傅们!最近在学习js逆向相关的知识点,跟着网上的师傅的课程已经很多相关文章探索学习,今天想着写一篇js逆向断点调试&js逆向前端加密对抗相关的文章出来,给师傅们分享下,有不正确的地方,希望大佬勿喷。

这篇文章主要是给没有学习过js逆向的师傅学习的,分享一些js逆向基础知识,js实战断点调试技巧以及后面分享js逆向靶场搭建以及js逆向前端加密对抗,拿微信小程序常用的AES、RSA和明文Sign 签名校验绕过几个方面给师傅们分享下操作技巧。

最后面给师傅们分享一个前段时间搞的一个企业src的商城优惠卷并发漏洞,也是拿到了一千块的赏金,漏洞都很详细的给师傅们分享了这个案例,师傅们看完我上面的js断点调试和js前端加解密靶场打法等,可以去尝试玩下,要是有地方写的有问题,大佬勿喷!

0x2 如何找到加密算法

这里我直接拿Google浏览器控制面板来给师傅们演示下这个流程,主要是通过F12调试控制js前端代码

其中里面的作用域,调用堆栈,XHR断点这三个功能需要了解认识下

一、作用域(Scope)

作用域是指变量、函数和对象在代码中可访问的范围,决定了标识符(变量名、函数名)的可见性。

主要类型:

  • 全局作用域:在所有函数和代码块之外声明的变量,在整个程序中都可访问。
const globalVar = "我是全局变量"; function test() { console.log(globalVar); // 可访问 }
  • 函数作用域:在函数内部声明的变量,仅在该函数内部可访问。
function test() { const funcVar = "我是函数内变量"; console.log(funcVar); // 可访问 } console.log(funcVar); // 报错:未定义
  • 块级作用域:由 {} 包裹的代码块(如 ifforwhile)中用 let/const 声明的变量,仅在块内可访问。
if (true) { const blockVar = "我是块内变量"; console.log(blockVar); // 可访问 } console.log(blockVar); // 报错:未定义

作用: 避免变量名冲突,控制内存使用(离开作用域后变量可能被垃圾回收)。

二、调用堆栈(Call Stack)

调用堆栈是JavaScript引擎用于管理函数调用顺序的一种数据结构(遵循“后进先出”原则)。

工作原理:

  • 当函数被调用时,引擎会为其创建一个“执行上下文”并压入栈顶。
  • 函数执行完毕后,其执行上下文从栈顶弹出,控制权回到之前的函数。
  • 栈顶始终是当前正在执行的函数。

示例:

function a() { console.log("a开始"); b(); console.log("a结束"); } function b() { console.log("b开始"); c(); console.log("b结束"); } function c() { console.log("c执行"); } a();

调用堆栈过程:

  1. 执行 a()a 入栈 → 栈:[a]
  2. a 中调用 b()b 入栈 → 栈:[a, b]
  3. b 中调用 c()c 入栈 → 栈:[a, b, c]
  4. c 执行完毕 → c 出栈 → 栈:[a, b]
  5. b 执行完毕 → b 出栈 → 栈:[a]
  6. a 执行完毕 → a 出栈 → 栈空

作用: 追踪函数执行顺序,调试时可通过堆栈信息定位代码执行路径(如报错时的“堆栈跟踪”)。

三 、XHR断点(XHR Breakpoint)

XHR断点是浏览器开发者工具中的一种调试功能,用于在发送AJAX请求(XMLHttpRequest 或 Fetch)时暂停代码执行,方便调试网络请求相关逻辑。

使用场景:

  • 调试接口请求参数是否正确
  • 查看请求发送时机和触发条件
  • 分析请求被拦截或修改的逻辑

四、 js基础断点调试

我们这里随便输入一个电话号码以及密码,直接看这个网络这里,可以看到账户输入的账户、密码都被进行了加密

其中我们常见的加密内容是md5、base64加密的,但是下面这个系统加密的一看就不是常见的加密方式

像这个,我们要是想要在我们输入账户密码的后,在传输到服务器端中可以将其加密的字段截取,然后进行分析,看看这个网站是使用什么类型进行加密的,就可以进行破解了,这就是后面我需要讲的js断点调试。

我们输入账号密码-> 浏览器接受到我们的账号密码-> 根据js进行加密-> 发送到对方的服务器(网页)

服务器接收数据-> 对我们的数据进行解密-> 判断我们的数据解密后是否正常-> 正常就返回正常结果(否则返回报错)

0x3 实战断点调试-找加密算法

一、案例一

在讲这个案例断点调试之前,先带师傅们认识下这几个按钮工具作用

工具栏作为断点调试的操作工具,包含了 6 个按钮:

  • 按钮 1:让代码继续执行,运行到下一个断点会中断执行,如果没有设置断点会直接运行完代码
  • 按钮 2:跳过下一个函数调用。即不遇到函数时,执行下一步;遇到函数时,不进入函数直接执行下一步
  • 按钮 3:跳进下一个函数上下文。即不遇到函数时,执行下一步;遇到函数时,进入函数上下文,查看函数具体内容
  • 按钮 4:跳出当前函数调用
  • 按钮 5:单步调试,当前断点的下一步
  • 按钮 6:停用/激活全部断点

这里直接搜索Vip/LoginResult接口关键字,因为我们断点调试的话需要点击web端端某个个功能点,出发我们后面打的断点才可以成功,这里我们开始点击登陆,直接请求的是这个接口,所有这里我们可以先搜索这个Vip/LoginResult关键词看看

这里直接选择最上面的top文件,右击选择在所有文件中搜索

找到这个有关登陆功能处的代码,然后打断点

可以尝试多打几个断点,然后挨个阶段运行调试看看

点击登陆按钮,就可以成功执行断点了,右边那个按钮就是执行到下一个断点

可以看到图中,代码断点运行成功了,在控制台输入logindata,就可以显示对应的加密数据了(手机号、密码)

二、案例二

老规矩还是直接输入手机号和密码,然后看F12中的网络数据包,可以看到这里的密码也是进行了加密

找到登陆口附近的js代码,寻找publickey关键字

这里先随机设置一个断点

设置好断点后,点击登录,即可触发断点,进行 js 断点的调试。

可以看到点击完登陆,出现了这个功能

常见的js逆向加密搜索关键字:

encrypt encryptedData setPublicKey publicKey

直接进行js断点调试,在控制台输入dataJson.password,就可以看到密码的js加密数据

三、案例三

这里再给师傅们分享一个标签断点法,这里刚好有个网上实际的站点,拿出来给师傅们分享下

线F12,然后点击1,然后把鼠标选中2(登陆功能上)

然后右键选中“登陆”标签,将子树修改,和属性修改都勾选上。然后我们随便输入一个账号密码点击登录

这样就可以成功 把运行的js代码给断下来了,但是目前这个网站今天写文章的时候已经找不到加密函数了,可能是已经修复了这个系统

0x4 js逆向靶场安装

前端加密对抗练习靶场——encrypt-labs下载链接:https://github.com/SwagXz/encrypt-labs

1、直接下载这个压缩包即可

2、然后解压之后直接放在phpstudy的www网站目录下

3、这里还需要把这个文件下的数据库的用户名和密码都修改成phpstudy默认的root

要不然会提示连接数据库账号密码错误

4、还需要注意的一点就是php的版本需要大于7.3.4版本

要不然会有提示openssl等服务启动不了等报错

5、使用命令行创建encryptDB数据库

mysql -u root -p create database encryptDB 

6、导入sql数据

mysql> use encryptdb; Database changed mysql> source C:\phpstudy_pro\WWW\encrypt-labs-main\encryptDB.sql

账号密码是:admin:123456,直接登陆即可完成靶场搭建了

0x5 解密工具下载

一、autoDecoder

工具下载链接:https://github.com/f0ng/autoDecoder

下载jar文件那个,直接导入burpsuit插件即可使用

具体的使用和操作方法,师傅们可以看这个文章,写的很详细:

https://blog.ZEEKLOG.net/2202_75361164/article/details/144360050

二、Js-Forward脚本工具

Js-Forward是为了解决在渗透测试过程中所遇到的WEB参数加密而开发出的脚本工具

工具下载链接:https://github.com/G-Security-Team/JS-Forward

三、JsRpc工具

工具下载链接:https://github.com/jxhczhl/JsRpc/releases/tag/v1.095

具体操作使用方法如下:https://github.com/jxhczhl/JsRpc

四、ctool浏览器插件加解密

工具下载链接:https://github.com/baiy/Ctool/releases/tag/v2.3.0

这里直接拿Google浏览器演示,下载下面的压缩包

然后解压,Google浏览器插件点击加载这个工具文件夹即可

0x6 对称加密-AES 加解密

一、AES 加解密简介

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序)加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:

AES 加解密:常用的微信小程序加解密方法

常见的搜索关键词:

encrypt、encryptedData、setpublickey

二、AES固定Key

第一种比较简单,key和iv写死,抓包发现数据传输被加密了

这里直接定位搜索“encryptedData”加密字段定位到算法位置

简单的分析,就是一个固定key 和iv 的aes加密,直接还原明文数据

{"username":"admin","password":"123456"}

三、AES服务端获取key

key和iv没有写在前端,直接使用bp抓包即可

这里使用bp插件autoDecoder,先配置自带的方法,红框的配置要注意配置好

主页面配置,仅登录所以关键字写了password

然后进入intruder进行爆破登录尝试

成功爆破

0x7 非对称加密-RSA 加解密

一、如何快速判定 RSA 呢?

RSA 只能加密短小的数据,如果数据太大,会直接报错,因此可以入超长数值,看看是否报错!

提示了这个错误,显示加密失败,说明就是非对称加密- RSA加密了

对于非对称加密,他需要设置公钥,因此一般全局搜索:

setpublickey、encrypt

二、RSA 加密

这个关卡不难,搜索非对称加密RSA常用的加密关键字:setpublickey,通过前端js找到公钥

然后通过断点调试,进行找到没有加密的原始数据

跟上面一样使用bp的插件autoDeceder

0x8 Sign 签名校验绕过

直接使用bp抓包,数据包的参数如下:username、password、nonce、timestamp、signature

我们这里来给师傅们演示下这个signature参数的由来

登陆界面,密码输入1234567,返回包提示密码错误

这个靶场的密码是123456,那么在bp数据包中,直接这里就把密码修改成123456,看看返回包

显示signature校验不正确,因为前面username、password、nonce、timestamp参数会生成signature传入到后台,后台就回和我们这里输入到signature进行匹配,要是不一样,就会进行报错

搜索关键字:signature,去断点看js代码

function sendDataWithNonce(url) { const username = document.getElementById("username") .value; const password = document.getElementById("password") .value; const nonce = Math.random() .toString(36) .substring(2); const timestamp = Math.floor(Date.now() / 1000); const secretKey = "be56e057f20f883e"; const dataToSign = username + password + nonce + timestamp; const signature = CryptoJS.HmacSHA256(dataToSign, secretKey) .toString(CryptoJS.enc.Hex);

打完断点,点击明文加签,进行断点调试

  1. 首先将usernamepasswordnonce(随机数)和timestamp(时间戳)拼接成一个字符串dataToSign,作为待签名的数据
拼接:admin123456drzeh01d5sn1755059730 

  1. 使用CryptoJS库的HmacSHA256方法,用secretKey(be56e057f20f883e)对拼接后的字符串进行 HMAC-SHA256 加密,生成signature(签名)
cd5e4af5343372cc5945539cddb67c8d33ae0f9be361c60e935e80b4c5a5f719

  1. 这样再替换回到数据包中即可成功登陆了

0x9 企业SRC实战分享—优惠卷

这个企业SRC是个商城的web资产应用,一进去,直接使用手机号登陆,因为像这样的可以直接使用手机号登陆(有账号),方便后续的渗透测试,很多功能点可能得登陆进去才可以测试

上面图片中,登陆到后台,有好几个功能点跟会员优惠卷有关系,商城优惠卷并发领取,必须得测下

点击领取,然后进行抓包测试,可以看到优惠卷的ID,为什么这里我要提下这个ID值呢,因为在后面我们还可以进行优惠卷横向并发,把不同金额的优惠卷ID进行便利并发领取,比如说你新人只能领取100元的,但是你通过ID横向并发领取到了200元的客户回归优惠卷,那么这个对商城是不是就有一定的危害了

然后可以使用这个并发插件脚本进行爆破,数量可以设置20个即可

def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=20, requestsPerConnection=100, pipeline=False ) for i in range(20): engine.queue(target.req, target.baseInput, gate='race1') engine.openGate('race1') engine.complete(timeout=60) def handleResponse(req, interesting): table.add(req)

可以看到数据包的状态200和长度都是一样的,那就说明我们成功进行了并发操作

然后返回账号的卡卷中心,发现领取了24张优惠卷

其中里面有20元、50元、100元优惠卷,并发操作都一样,都可以进行无限并发领取优惠卷

返回会员支付界面,可以看到支付的优惠卷都是可以直接使用叠加的,漏洞提交平台,一千块大洋到手

0x10 总结

这篇文章到这里就结束了,希望看完这篇文章对师傅们有帮助,该文章主要是记录和分享我的学习过程和一些漏洞挖掘的案例和手法等,本人技术水平一般,有问题欢迎师傅们加我微信交流学习!

最后祝愿看了这篇文章的师傅们,天天有漏洞产出,天天有src赏金!

Read more

LLaMA-Factory:高效微调百款大模型的利器

LLaMA-Factory:高效微调百款大模型的利器 在大模型落地日益加速的今天,越来越多团队面临一个现实问题:如何以更低的成本、更少的资源完成对主流语言模型的定制化训练?毕竟,并非每个开发者都拥有百亿参数模型预训练的算力预算。而真正有实用价值的,往往是那些基于通用基座模型、针对特定任务进行微调后的“小而精”的专用模型。 正是在这样的背景下,LLaMA-Factory 应运而生——它不是一个简单的训练脚本集合,而是一套完整覆盖数据处理、模型训练、参数优化到推理部署的全流程微调框架。其目标很明确:让哪怕只有一块消费级显卡的开发者,也能高效地完成对 Llama3、Qwen2、ChatGLM 等主流大模型的 LoRA 或 QLoRA 微调。 GitHub 地址: https://github.com/hiyouga/LLaMA-Factory 这个项目最打动人的地方在于它的“开箱即用”体验。你不需要从零搭建训练流程,也不必深陷于各种库版本兼容性问题中。无论是通过命令行快速启动一次 SFT 训练,还是使用 WebUI 进行可视化配置,LLaMA-Factory

大模型测评:千问、DeepSeek、豆包、KIMI、元宝、文心一言,降英文AI率谁最能打?

大模型测评:千问、DeepSeek、豆包、KIMI、元宝、文心一言,降英文AI率谁最能打?

时间来到2026年,对于留学生和海外内容创作者来说,与AI检测工具的博弈早已成为日常。Turnitin、GPTZero、ZeroGPT的算法日益精进,单纯依靠ChatGPT或DeepSeek生成内容后直接提交,无异于“裸奔”。 为了通过检测,大家开始寻求各种“降AI率”工具。但市面上工具繁多,智写AI、通义千问、DeepSeek、豆包、KIMI、腾讯元宝、文心一言……这些名字频频出现。它们谁真的能打?谁只是花架子? 今天,我们将基于2026年最新的实测数据与用户反馈,对这七款工具在降英文AIGC率这场硬仗中的表现,进行一次彻底的横向对比。 测评说明:我们怎么测的? 为了公平起见,我们设定了一个标准的测试场景: * 测试文本:一段由AI生成的英文学术引言(主题:机器学习在金融风控中的应用),初始AI率经Turnitin模拟环境检测为 92%。 * 考核维度: 1. 降AI核心效果:处理后文本在主流检测工具中的AI率。 2. 文本质量:是否保留原意、专业术语是否准确、逻辑是否通顺。 3. 场景契合度:是否适合学术/

记录一下使用llama.cpp过程中遇到的一些问题和解决方法

写在前面: 什么未操作即同意的条款?我写的东西免费分享也不是你能随意搬运的理由啊 特此声明,若该文章被搬运到除ZEEKLOG(www.ZEEKLOG.net)以外的其他社区如2048 AI社区,则视为该社区同意将所有收益无偿捐赠给我所有 此外,我写的所有分享都是免费的,如有VIP文章也是ZEEKLOG干的,请私信我修改成免费 起因:使用LMStudio调用AI模型时发现显存占用率一直不超过80%,询问AI解决办法无果后一怒之下换用llama.cpp,遇到了一堆AI解决不了的问题,遂记录 llama.cpp下载地址如下 https://github.com/ggml-org/llama.cpp/releases 以防万一 我老年痴呆说一下如何使用llama.cpp调用模型,把下面的代码保存成bat,放在和llama-server.exe同目录下,然后运行这个bat(确保模型位置选对,GPU_LAYERS和THREADS根据机器能力) @echo off setlocal set "MODEL_PATH=F:\Models\Yakyu&

技术报告:在 4x Tesla P40 上训练 Llama-3.3-70B 大模型指南

作者: Antigravity (Google DeepMind Agent) 日期: 2026-01-14 硬件目标: NVIDIA Tesla P40 (24GB) x4 模型目标: Llama-3.3-70B-Instruct 1. 摘要 本报告详细记录了在不支持 BFloat16 和 Tensor Cores 半精度加速(Pascal 架构)的老旧硬件(Tesla P40)上,成功训练 70B 参数量级大预言模型的技术方案。 通过结合 4-bit NF4 量化、模型自动分片 (Model Sharding) 以及 纯 FP32 训练管线 (Pure FP32 Pipeline),我们成功克服了硬件架构限制,实现了稳定训练。 2.