第99天-JS逆向终极提速:Yakit热加载,让你告别重复编码!

admin 2026-03-27 02:09:33 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了Yakit热加载(HotPatch)功能,这是一种在数据包发送前后通过Yaklang脚本实时处理数据的技术。它旨在解决JS逆向和渗透测试中工具切换频繁、重复劳动等效率低下的问题,通过核心语法{{yak(函数名|参数)}}实现一站式、自动化的数据加密、签名与处理。文章还通过HMAC-SHA256签名、AES-CBC加密及结合JsRpc调用浏览器JS等实战案例,展示了其灵活且强大的应用,能显著提升工作效率。 综合评分: 90 文章分类: 渗透测试,WEB安全,红队,恶意软件,安全工具


cover_image

第99天-JS逆向终极提速:Yakit热加载,让你告别重复编码!

原创

Сяо Яо Сяо Яо

AlphaNet

2026年3月21日 11:51 韩国

还在为JS逆向中反复的加密、签名、发包而烦恼吗?每次爆破密码,都要手动修改参数,再跑一遍加密脚本,效率低得让人抓狂?🤯

今天,我们将一起探索一款能彻底改变这一窘境的神器——Yakit的热加载(Hot Patch)功能。它能让你在发包的瞬间,动态完成数据加密和签名,实现真正的“项目联动”与“自动接口”,让你的逆向工作流丝滑如德芙!


🤔 是什么:Yakit热加载究竟是何方神圣?

简单来说,Yakit热加载是一种在数据包发送前或接收后,通过预定义的代码逻辑(Yaklang脚本)对数据进行实时处理的强大功能。

你可以把它想象成一个安插在请求管道上的“魔法盒子” 🧙‍♂️。每个请求发出前,都会先经过这个盒子,盒子里的代码会自动对指定内容进行修改、加密或签名,然后再放行。

它的核心语法非常简洁:

{{yak(函数名|参数1|参数2|...)}}

你只需要在Fuzz模块的数据包中,将需要动态生成的内容用这个格式占位,Yakit就会在运行时自动调用你写好的函数名,并将处理结果替换到占位符的位置。


🌟 为什么:我们为什么需要热加载?

在传统的JS逆向与渗透测试流程中,我们常常会遇到以下痛点:

  1. 流程割裂:在Burp Suite中抓包,在VS Code中调试JS加密,在Python里写脚本发包,工具来回切换,效率低下。

  2. 重复劳动:对于需要爆破的场景(如密码),每测试一个新密码,就需要手动执行一次加密,再粘贴回发包工具,过程极其繁琐。

  3. 难以联动:当一个请求的参数依赖于另一个请求的返回时(项目联动),手动处理这种依赖关系既复杂又容易出错。

而Yakit热加载正是为了解决这些问题而生!它带来了三大核心优势:

  • 一站式解决:将加密、签名逻辑直接集成到Yakit的发包工具中,实现抓包、分析、修改、重放的闭环操作。

  • 自动化处理:结合Fuzz功能,Yakit可以自动从字典中获取 payload,通过热加载函数进行加密,然后发送。整个过程无需人工干预。

  • 高度灵活:通过Yaklang脚本,你可以实现任意复杂的加密、编码和逻辑处理,甚至可以调用外部API(如JsRpc),灵活度极高。


🛠️ 怎么做:三步玩转Yakit热加载(实战案例)

掌握Yakit热加载,只需要理解它的三个核心组成部分:模板语法、代码逻辑和魔术方法

1. 热加载的基础逻辑

  • 模板{{yak(函数名|参数)}},这是告诉Yakit“这里需要用函数名来处理参数”。

  • 代码:你需要用Yaklang编写一个与函数名同名的函数,它接收参数并返回处理后的结果。

// 这是一个最简单的示例,将传入的字符串转为大写
upper = func(s) {
    // s 是传入的参数,类型为字符串
    // 返回值可以是字符串或数组
    return s.Upper()
}

在Fuzz中使用:{{yak(upper|hello)}},发送时它会自动变成 HELLO

2. 魔术方法:beforeRequest & afterRequest

Yakit提供了两个特殊的“魔术方法”,让热加载如虎添翼:

  • beforeRequest = func(req):在数据包发送前对整个请求进行最后一次处理。

  • afterRequest = func(rsp):在收到响应后对返回的数据包进行处理。

这两个方法赋予了我们修改整个请求(而不只是单个参数)的能力,在处理复杂场景时非常有用。


案例实战 1:前端验证签名(HMAC-SHA256)

假设一个登录请求,前端会对用户名和密码进行HMAC-SHA256签名。

🎯 目标:在爆破密码时,自动为每个密码生成对应的签名。

1. 设置Fuzz变量与JSON体

在Yakit的Fuzz模块中,我们这样设置POST的JSON体。{{param(password)}}会引用我们定义的password变量。

{
  "signature": "{{yak(signRequest|admin|{{param(password)}})}}",
  "key": "31323334313233343132333431323334",
  "username": "admin",
  "password": "{{param(password)}}"
}

2. 编写热加载脚本

我们定义signRequest函数来处理签名逻辑。

// sign 函数负责具体的HMAC-SHA256计算
func sign(user, pass) {
    // 使用固定的key "1234123412341234"
    // f`...` 是Yaklang中的格式化字符串
    return codec.EncodeToHex(codec.HmacSha256("1234123412341234", f`username=${user}&password=${pass}`)~)
}

// signRequest 是模板中调用的函数
signRequest = result => {
// result 的值是 "admin|{{param(password)}}" 经过变量替换后的字符串
pairs := result.SplitN("|", 2)
// 调用 sign 函数生成签名
return sign(pairs[0], pairs[1])
}

这样,当Yakit使用密码字典进行爆破时,每个密码都会被自动签名,无需任何手动操作!

案例实战 2:前端加密登录(AES-CBC)

这次,登录数据被整体AES加密后通过Base64编码发送。

🎯 目标:自动对包含用户名和密码的JSON字符串进行AES加密和Base64编码。

1. 设置Fuzz模板

在需要加密的地方,我们嵌套使用base64yak

{{base64({{yak(aescbc|{"username":"admin","password":"{{x(pass_top25)}}"})}})}}

2. 编写热加载脚本

aescbc函数负责接收JSON字符串,并返回加密后的结果。

aescbc = result => {
    // result 是传入的JSON字符串,如 '{"username":"admin","password":"password123"}'
    encryptedResult = codec.AESCBCEncryptWithPKCS7Padding(
        codec.DecodeHex(`31323334313233343132333431323334`)~, // key
        result, // data
        codec.DecodeHex(`bfeb9fdf041beaa31a1f136700f5e25c`)~, // iv
    )~
    return string(encryptedResult)
}

Yakit会将aescbc函数返回的加密结果,再通过外层的{{base64(...)}}进行编码,一气呵成!

案例实战 3:终极联动 – Yakit + JsRpc + 热加载

这是最强大、最灵活的用法。当加密逻辑极其复杂(例如,经过了多层混淆和魔改)时,我们不想用Yaklang重写一遍,而是希望直接调用浏览器中原始的JS加密函数。这时,JsRpc就登场了。

🎯 目标:通过Yakit的热加载,调用JsRpc服务,让浏览器环境来帮我们完成加密。

流程简介:

  1. 启动JsRpc服务:在浏览器控制台执行JsRpc客户端脚本,并注册一个可供调用的加密动作(如decrypt)。

  2. 编写热加载函数:这个函数不再执行加密计算,而是向JsRpc服务发送一个HTTP请求。

  3. 使用魔术方法:通过beforeRequest魔术方法,在请求发送前,将需要加密的参数值替换为JsRpc返回的加密结果。

热加载脚本核心逻辑:

// 1. 定义一个函数,用于与JsRpc服务通信
jsrpcReq = func(origin /*string*/) {
    group = "zzz";
    action = "decrypt"; // 对应JsRpc中注册的动作名

// 发送POST请求到JsRpc服务 rsp, rep = poc.Post( “http://127.0.0.1:12080/go”, poc.replaceBody(“group=” + group + “&action=” + action + “&param=” + json.dumps(origin), false), poc.appendHeader(“content-type”, “application/x-www-form-urlencoded”) )~

// 解析返回的JSON,并提取加密后的数据 return json.loads(rsp.GetBody())[“data”];

}

// 2. 使用 beforeRequest 魔术方法在发包前替换参数
beforeRequest = func(https, originReq, req) {
// 从当前请求中获取所有POST参数
postParams = poc.GetAllHTTPPacketPostParams(req)

// 假设需要加密的参数是 “encryptedData” // 将其原始值发送给 jsrpcReq 函数进行处理 encryptedParam = jsrpcReq(postParams[“encryptedData”])

// 将请求中的 “encryptedData” 参数替换为加密后的值 req = poc.ReplaceHTTPPacketPostParam(req, “encryptedData”, encryptedParam)

// 返回修改后的完整请求 return []byte(req)

}

通过这种方式,我们完美地将Yakit的发包能力与浏览器的JS执行环境连接了起来,无论加密逻辑多复杂,都能轻松实现自动化!


📝 总结:核心要点回顾

  • Yakit热加载:在发包时动态处理数据的“魔法”,核心语法是 {{yak(函数名|参数)}}

  • 三大优势:一站式、自动化、高灵活,极大提升JS逆向和渗透测试效率。

  • 基础用法:通过编写同名Yaklang函数,实现对参数的自定义处理(如签名、加密)。

  • 进阶用法:利用beforeRequest等魔术方法,在发包前对整个请求进行修改。

  • 终极联动:结合JsRpc,可以直接调用浏览器原生JS函数,解决最复杂的加密场景,实现真正的“自动接口”。

掌握了Yakit热加载,你就相当于拥有了一把JS逆向的“瑞士军刀”,能够以更优雅、更高效的方式应对各种加密挑战。


🤔 思考与交流:

在你过往的逆向经历中,是否也遇到过类似的繁琐流程?你觉得Yakit热加载还能应用在哪些有趣的场景中?欢迎在评论区留言分享你的想法!👇


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:AlphaNet Сяо Яо Сяо Яо《第99天-JS逆向终极提速:Yakit热加载,让你告别重复编码!》

不要测无意义的并发漏洞 网络安全文章

不要测无意义的并发漏洞

文章总结: 本文分享了关于文章和视频浏览量的并发测试经验。作者通过抓包分析并利用intruder模块进行重放,成功刷取了网站的浏览量。测试发现,视频浏览量因浏览
评论:0   参与:  0