您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
2025/5/12 16:35:05
- // ==UserScript==
- // @name cryptoHook
- // @namespace qchook
- // @match *://*/*
- // @grant none
- // @version 1.0
- // @author cthousand
- // @license MIT
- // @description 2025/5/12 16:35:05
- // ==/UserScript==
- // Hook 加密方法
- !function () {
- // 保存原始的解密方法
- const originalEncrypt = window.crypto.subtle.encrypt;
- window.crypto.subtle.encrypt = async function (algorithm, key, data) {
- console.log("检测到加密调用");
- console.log("Algorithm:", algorithm);
- // 根据算法名称区分加密类型
- console.log("加密算法:", algorithm.name);
- // 如果是 AES 加密,打印更多详细信息
- if (algorithm.name.startsWith("AES")) {
- console.log("AES 加密详细信息:");
- debugger
- // 打印初始化向量(IV,16进制)
- if (algorithm.iv) {
- console.log("AES 初始化向量(IV,16进制):", arrayBufferToHex(algorithm.iv));
- }
- // 打印加密的明文(UTF-8)
- console.log("AES 加密的明文(UTF-8):", new TextDecoder().decode(data));
- // 调用原始的加密方法
- const encryptedData = await originalEncrypt.apply(this, arguments);
- // 打印加密的密文(Base64)
- console.log("AES 加密的密文(Base64):", arrayBufferToBase64(encryptedData));
- return encryptedData;
- }
- // 调用原始的加密方法
- return originalEncrypt.apply(this, arguments);
- };
- // 保存原始的解密方法
- const originalDecrypt = window.crypto.subtle.decrypt;
- // Hook 解密方法
- window.crypto.subtle.decrypt = async function (algorithm, key, data) {
- console.log("检测到解密调用");
- console.log("Algorithm:", algorithm);
- // 根据算法名称区分解密类型
- console.log("解密算法:", algorithm.name);
- // 如果是 AES 解密,打印更多详细信息
- if (algorithm.name.startsWith("AES")) {
- console.log("AES 解密详细信息:");
- // 打印初始化向量(IV,16进制)
- if (algorithm.iv) {
- console.log("AES 初始化向量(IV,16进制):", arrayBufferToHex(algorithm.iv));
- }
- // 打印加密的密文(Base64)
- console.log("AES 加密的密文(Base64):", arrayBufferToBase64(data));
- // 调用原始的解密方法
- try {
- const decryptedData = await originalDecrypt.apply(this, arguments);
- // 打印解密的明文(UTF-8)
- console.log("AES 解密的明文(UTF-8):", new TextDecoder().decode(decryptedData));
- return decryptedData;
- } catch (error) {
- console.error("解密失败:", error);
- throw error;
- }
- }
- // 调用原始的解密方法
- return originalDecrypt.apply(this, arguments);
- };
- // 保存原始的 generateKey 方法
- const originalGenerateKey = window.crypto.subtle.generateKey;
- // Hook generateKey 方法
- window.crypto.subtle.generateKey = async function (algorithm, extractable, keyUsages) {
- console.log("检测到生成密钥调用");
- console.log("Algorithm:", algorithm);
- console.log("Extractable:", extractable);
- console.log("Key Usages:", keyUsages);
- // 调用原始的 generateKey 方法
- const key = await originalGenerateKey(algorithm, extractable, keyUsages);
- // 如果生成的是密钥对(如 RSA 或 ECC),打印公钥和私钥信息
- if (algorithm.name.startsWith("RSA") || algorithm.name.startsWith("EC")) {
- console.log("生成的密钥对:");
- console.log("公钥:", key.publicKey);
- console.log("私钥:", key.privateKey);
- // 导出公钥(如果需要)
- if (key.publicKey.extractable) {
- const exportedPublicKey = await crypto.subtle.exportKey("spki", key.publicKey);
- console.log("公钥(Base64):", arrayBufferToBase64(exportedPublicKey));
- } else {
- console.warn("公钥不可导出");
- }
- } else {
- console.log("生成的密钥:", key);
- // 导出密钥(如果需要)
- if (key.extractable) {
- const exportedKey = await crypto.subtle.exportKey("raw", key);
- console.log("密钥(16进制):", arrayBufferToHex(exportedKey));
- } else {
- console.warn("密钥不可导出");
- }
- }
- return key;
- };
- // 辅助函数:将 ArrayBuffer 转换为 16 进制字符串
- function arrayBufferToHex(buffer) {
- const uint8Array = new Uint8Array(buffer);
- return uint8Array.reduce((hexString, byte) => {
- return hexString + byte.toString(16).padStart(2, '0');
- }, '');
- }
- // 辅助函数:将 ArrayBuffer 转换为 Base64 字符串
- function arrayBufferToBase64(buffer) {
- const uint8Array = new Uint8Array(buffer);
- return btoa(String.fromCharCode.apply(null, uint8Array));
- }
- }()