基于JS_HOOK的web流量加解密方案

admin 2026-01-13 14:37:00 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章提出一套基于JSHook的Burp流量加解密通用方案:通过中间人注入脚本劫持网页encrypt/decrypt函数,实时将明文/密文上报本地服务;配套浏览器扩展与RPC接口,实现BurpRepeater内一键加解密,无需逆向算法即可审计加密Web接口。作者给出完整HTML示例、Hook代码、轮询脚本及插件使用截图,并开源实现地址,方便红队快速移植至各类JS加密站点。 综合评分: 78 文章分类: WEB安全,红队,渗透测试,安全工具,实战经验


cover_image

基于JS_HOOK的web流量加解密方案

原创

kkk mr

漏洞推送

2026年1月12日 17:14 浙江

最近遇到一个web网站,流量是通过js的加密的,于是设计了一套较为通用的流量js hook配置burp的流量加解密方案。

方案分为以下几个部分:

•加密函数的参数和返回值记录•解密函数的的参数和返回值记录•生成请求的Rpc•解密响应的Rpc

优点: 不用管具体的加密算法的实现,找到函数即可

具体实现如下:

记录请求的密文和明文

假设现在网站源码如下:

<!DOCTYPE&nbsp;html><html&nbsp;lang="zh-CN">
<head>&nbsp; &nbsp;&nbsp;<meta&nbsp;charset="UTF-8">&nbsp; &nbsp;&nbsp;<meta&nbsp;name="viewport"&nbsp;content="width=device-width, initial-scale=1.0">&nbsp; &nbsp;&nbsp;<title>demo</title>&nbsp; &nbsp;&nbsp;<script>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;function&nbsp;encrypt(data) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;btoa(unescape(encodeURIComponent(data)));&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;function&nbsp;decrypt(data) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;decodeURIComponent(escape(atob(data)));&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;async&nbsp;function&nbsp;send() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;inputData =&nbsp;"test";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(!inputData) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;encryptedData =&nbsp;encrypt(inputData);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;payload = {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;message: encryptedData,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;timestamp:&nbsp;new&nbsp;Date().getTime()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;try&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;response =&nbsp;await&nbsp;fetch('https://httpbin.org/post', {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;method:&nbsp;'POST',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;headers: {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;'Content-Type':&nbsp;'application/json'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;body:&nbsp;JSON.stringify(payload)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(response.ok) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;result =&nbsp;await&nbsp;response.json();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;alert("resonpse:"+&nbsp;decrypt(JSON.parse(result.data).message));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;else&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;alert("error: "&nbsp;+ response.status);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;catch&nbsp;(error) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;</script></head>
<body>&nbsp; &nbsp;&nbsp;<button&nbsp;type="button"&nbsp;onclick="send()">send</button></body>
</html>

encrypt是加密函数,decrypt是解密函数

通过burp中间人注入hook代码,hook后代码为

<!DOCTYPE&nbsp;html><html&nbsp;lang="zh-CN">
<head>&nbsp; &nbsp;&nbsp;<meta&nbsp;charset="UTF-8">&nbsp; &nbsp;&nbsp;<meta&nbsp;name="viewport"&nbsp;content="width=device-width, initial-scale=1.0">&nbsp; &nbsp;&nbsp;<title>demo</title>&nbsp; &nbsp;&nbsp;<script>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;function&nbsp;encrypt(data) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;btoa(unescape(encodeURIComponent(data)));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;window.raw_encrypt&nbsp;= encrypt;&nbsp; &nbsp; &nbsp; &nbsp; encrypt =&nbsp;function&nbsp;(x) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;BASE_URL&nbsp;=&nbsp;'http://127.0.0.1:9999';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;async&nbsp;function&nbsp;reportData(plain, cipher) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;await&nbsp;fetch(`${BASE_URL}/report`, {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;method:&nbsp;'POST',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;headers: {&nbsp;'Content-Type':&nbsp;'application/json'&nbsp;},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;body:&nbsp;JSON.stringify({&nbsp;plaintext: plain,&nbsp;ciphertext: cipher })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; plaintext = x;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ciphertext =&nbsp;window.raw_encrypt(x);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;reportData(plaintext, ciphertext);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;ciphertext&nbsp; &nbsp; &nbsp; &nbsp; };

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;function&nbsp;decrypt(data) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;decodeURIComponent(escape(atob(data)));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;window.raw_decrypt&nbsp;= decrypt;&nbsp; &nbsp; &nbsp; &nbsp; decrypt =&nbsp;function&nbsp;(x) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;BASE_URL&nbsp;=&nbsp;'http://127.0.0.1:9999';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;async&nbsp;function&nbsp;reportData(plain, cipher) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;await&nbsp;fetch(`${BASE_URL}/report`, {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;method:&nbsp;'POST',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;headers: {&nbsp;'Content-Type':&nbsp;'application/json'&nbsp;},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;body:&nbsp;JSON.stringify({&nbsp;plaintext: plain,&nbsp;ciphertext: cipher })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ciphertext = x;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; plaintext =&nbsp;window.raw_decrypt(x);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;reportData(plaintext, ciphertext);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;plaintext&nbsp; &nbsp; &nbsp; &nbsp; };

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;async&nbsp;function&nbsp;send() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;inputData =&nbsp;"test";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(!inputData) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;encryptedData =&nbsp;encrypt(inputData);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;formData =&nbsp;new&nbsp;URLSearchParams();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; formData.append('data', encryptedData);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;try&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;response =&nbsp;await&nbsp;fetch('https://httpbin.org/post', {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;method:&nbsp;'POST',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;headers: {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 必须指定 Content-Type&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;'Content-Type':&nbsp;'application/x-www-form-urlencoded'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;body: formData&nbsp;// 直接传入 URLSearchParams 对象&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(response.ok) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;result =&nbsp;await&nbsp;response.json();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;alert("resonpse:"&nbsp;+&nbsp;decrypt(JSON.parse(result.data).message));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;else&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;alert("error: "&nbsp;+ response.status);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;catch&nbsp;(error) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;</script></head>
<body>&nbsp; &nbsp;&nbsp;<button&nbsp;type="button"&nbsp;onclick="send()">send</button></body>
</html>

这样就将我们将加解密都hook成我们的函数,并且在执行的时候会进行上报

至此,我们可以实现浏览器流量的加解密,效果如下:

原始请求:

解密请求:

原始响应包:

解密响应包:

Rpc实现请求加密

通过右键扩展,将明文数据发送到重放器

效果如下:

我们修改包的参数,然后在浏览器执行如下js代码:

(function&nbsp;() {&nbsp; &nbsp;&nbsp;const&nbsp;BRIDGE_URL&nbsp;=&nbsp;"http://127.0.0.1:9999";
&nbsp; &nbsp;&nbsp;/**&nbsp; &nbsp; &nbsp;* Site-specific Encryption Logic&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp;&nbsp;function&nbsp;Encryption(plainText) {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;window.raw_encrypt(plainText);&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;/**&nbsp; &nbsp; &nbsp;* Site-specific Decryption Logic&nbsp; &nbsp; &nbsp;* Replace 'window.targetDecrypt' with the actual function found on the site&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp;&nbsp;function&nbsp;Decryption(cipherText) {&nbsp; &nbsp; &nbsp; &nbsp;return&nbsp;window.raw_decrypt(cipherText);&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;/**&nbsp; &nbsp; &nbsp;* Send result back to Burp Bridge&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp;&nbsp;async&nbsp;function&nbsp;reportResult(taskId, result) {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;try&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;await&nbsp;fetch(`${BRIDGE_URL}/task`, {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;method:&nbsp;'POST',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;headers: {&nbsp;'Content-Type':&nbsp;'application/json'&nbsp;},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;body:&nbsp;JSON.stringify({&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;id: taskId,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;result: result&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;catch&nbsp;(e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;console.error("Failed to report result:", e);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;async&nbsp;function&nbsp;pollTask() {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;try&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;resp =&nbsp;await&nbsp;fetch(`${BRIDGE_URL}/task`);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;const&nbsp;task =&nbsp;await&nbsp;resp.json();
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// Ignore IDLE state to reduce console noise&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(task.type&nbsp;===&nbsp;"IDLE") {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;console.log("New Task Received:", task.type, task.id);
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;let&nbsp;result =&nbsp;null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(task.type&nbsp;===&nbsp;"ENCRYPT") {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result =&nbsp;await&nbsp;Encryption(task.payload);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;else&nbsp;if&nbsp;(task.type&nbsp;===&nbsp;"DECRYPT") {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;console.log(&nbsp;"DECRYPT",task.payload)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result =&nbsp;await&nbsp;Decryption(task.payload);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(result !==&nbsp;null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;await&nbsp;reportResult(task.id, result);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;console.log("Task Completed:", task.id);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;catch&nbsp;(e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// console.error("Poll Error:", e.message);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;finally&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// Use 200ms-500ms for better responsiveness&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;setTimeout(pollTask,&nbsp;300);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;console.log("JS Bridge Client Started... Waiting for tasks.");&nbsp; &nbsp;&nbsp;pollTask();})();

加密请求

然后选中我们要加密的文本,右键

js收到请求后处理:

加密效果:

解密请求

原始响应:

点击响应的Decrypted tag 触发rpc

插件使用方法

示例代码开源在:

https://github.com/lanyi1998/js_hook_decrype


免责声明:

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

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

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

本文转载自:漏洞推送 kkk mr《基于JS_HOOK的web流量加解密方案》

评论:0   参与:  0