控制流程完整性:给大家介绍一种“另类”的Javascript反分析技术
字数 907 2025-08-18 11:37:07
JavaScript控制流程完整性反分析技术详解
1. 技术背景
JavaScript作为一种解释型语言,其源代码通常可以直接查看,这使得恶意软件分析人员能够相对容易地理解恶意代码的真实行为。为了对抗分析,攻击者开发了一种基于控制流程完整性的反分析技术。
2. 核心原理
该技术利用JavaScript的函数调用特性实现控制流完整性验证:
- 函数名作为密钥:使用
arguments.callee.name获取当前函数名作为解密密钥 - 动态解密:加密的Payload使用函数名作为密钥进行解密
- 完整性验证:如果函数被重命名或调用顺序改变,解密会失败
- 错误处理:通过try-catch机制在解密失败时改变执行路径
3. 技术实现细节
3.1 基本加密/解密函数
function keyCharAt(key, i) {
return key.charCodeAt(Math.floor(i % key.length));
}
function xor_encrypt(key, data) {
return _.map(data, function(c, i) {
return c.charCodeAt(0) ^ keyCharAt(key, i);
});
}
function xor_decrypt(key, data) {
return _.map(data, function(c, i) {
return String.fromCharCode(c ^ keyCharAt(key, i));
}).join('');
}
3.2 加密流程示例
var final_payload = "console.log('Malicious Content Triggers Here !')";
var k_final = "cow001";
var encrypted_final = xor_encrypt(k_final, final_payload);
3.3 解密执行流程
function cow001() {
eval(xor_decrypt(arguments.callee.name, [0,0,25,67,95,...]));
}
function pyth001() {
eval(xor_decrypt(arguments.callee.name, [19,22,3,88,0,...]));
}
function pippo() {
pyth001();
}
pippo();
4. 攻击者开发流程
- 编写原始恶意JavaScript代码
- 设计函数调用链和控制流程
- 使用专门脚本加密Payload:
- 为每个加密块指定函数名作为密钥
- 生成加密后的Payload数组
- 替换原始代码中的明文部分为加密Payload
- 构建多层嵌套调用结构
5. 防御分析的特点
- 抗静态分析:核心逻辑被加密,静态分析难以直接获取
- 抗动态分析:
- 函数重命名会导致解密失败
- 调用顺序改变会破坏控制流
- 多态性:可通过不同函数名和加密密钥生成不同变种
- 环境感知:可结合其他反调试技术增强效果
6. 对抗措施建议
- 动态分析:
- 在真实环境中执行并监控行为
- 保持原始函数名和调用顺序
- 符号执行:使用符号执行技术探索所有可能路径
- 模式识别:识别固定的加密/解密函数模式
- 控制流图分析:构建并分析控制流图识别异常结构
7. 技术演进潜力
- 可结合更多加密算法增强复杂度
- 可嵌套多层增加分析难度
- 可与其他反调试技术结合使用
- 可扩展到其他解释型语言(VBScript, PowerShell等)
8. 总结
这种基于控制流程完整性的JavaScript反分析技术通过将函数名作为加密密钥,实现了代码保护与执行环境验证的双重目的。它不仅能够抵抗简单的静态分析,还能对抗常见的动态分析技术,为恶意代码分析带来了新的挑战。