控制流程完整性:给大家介绍一种“另类”的Javascript反分析技术
字数 907 2025-08-18 11:37:07

JavaScript控制流程完整性反分析技术详解

1. 技术背景

JavaScript作为一种解释型语言,其源代码通常可以直接查看,这使得恶意软件分析人员能够相对容易地理解恶意代码的真实行为。为了对抗分析,攻击者开发了一种基于控制流程完整性的反分析技术。

2. 核心原理

该技术利用JavaScript的函数调用特性实现控制流完整性验证:

  1. 函数名作为密钥:使用arguments.callee.name获取当前函数名作为解密密钥
  2. 动态解密:加密的Payload使用函数名作为密钥进行解密
  3. 完整性验证:如果函数被重命名或调用顺序改变,解密会失败
  4. 错误处理:通过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. 攻击者开发流程

  1. 编写原始恶意JavaScript代码
  2. 设计函数调用链和控制流程
  3. 使用专门脚本加密Payload:
    • 为每个加密块指定函数名作为密钥
    • 生成加密后的Payload数组
  4. 替换原始代码中的明文部分为加密Payload
  5. 构建多层嵌套调用结构

5. 防御分析的特点

  1. 抗静态分析:核心逻辑被加密,静态分析难以直接获取
  2. 抗动态分析
    • 函数重命名会导致解密失败
    • 调用顺序改变会破坏控制流
  3. 多态性:可通过不同函数名和加密密钥生成不同变种
  4. 环境感知:可结合其他反调试技术增强效果

6. 对抗措施建议

  1. 动态分析
    • 在真实环境中执行并监控行为
    • 保持原始函数名和调用顺序
  2. 符号执行:使用符号执行技术探索所有可能路径
  3. 模式识别:识别固定的加密/解密函数模式
  4. 控制流图分析:构建并分析控制流图识别异常结构

7. 技术演进潜力

  1. 可结合更多加密算法增强复杂度
  2. 可嵌套多层增加分析难度
  3. 可与其他反调试技术结合使用
  4. 可扩展到其他解释型语言(VBScript, PowerShell等)

8. 总结

这种基于控制流程完整性的JavaScript反分析技术通过将函数名作为加密密钥,实现了代码保护与执行环境验证的双重目的。它不仅能够抵抗简单的静态分析,还能对抗常见的动态分析技术,为恶意代码分析带来了新的挑战。

JavaScript控制流程完整性反分析技术详解 1. 技术背景 JavaScript作为一种解释型语言,其源代码通常可以直接查看,这使得恶意软件分析人员能够相对容易地理解恶意代码的真实行为。为了对抗分析,攻击者开发了一种基于控制流程完整性的反分析技术。 2. 核心原理 该技术利用JavaScript的函数调用特性实现控制流完整性验证: 函数名作为密钥 :使用 arguments.callee.name 获取当前函数名作为解密密钥 动态解密 :加密的Payload使用函数名作为密钥进行解密 完整性验证 :如果函数被重命名或调用顺序改变,解密会失败 错误处理 :通过try-catch机制在解密失败时改变执行路径 3. 技术实现细节 3.1 基本加密/解密函数 3.2 加密流程示例 3.3 解密执行流程 4. 攻击者开发流程 编写原始恶意JavaScript代码 设计函数调用链和控制流程 使用专门脚本加密Payload: 为每个加密块指定函数名作为密钥 生成加密后的Payload数组 替换原始代码中的明文部分为加密Payload 构建多层嵌套调用结构 5. 防御分析的特点 抗静态分析 :核心逻辑被加密,静态分析难以直接获取 抗动态分析 : 函数重命名会导致解密失败 调用顺序改变会破坏控制流 多态性 :可通过不同函数名和加密密钥生成不同变种 环境感知 :可结合其他反调试技术增强效果 6. 对抗措施建议 动态分析 : 在真实环境中执行并监控行为 保持原始函数名和调用顺序 符号执行 :使用符号执行技术探索所有可能路径 模式识别 :识别固定的加密/解密函数模式 控制流图分析 :构建并分析控制流图识别异常结构 7. 技术演进潜力 可结合更多加密算法增强复杂度 可嵌套多层增加分析难度 可与其他反调试技术结合使用 可扩展到其他解释型语言(VBScript, PowerShell等) 8. 总结 这种基于控制流程完整性的JavaScript反分析技术通过将函数名作为加密密钥,实现了代码保护与执行环境验证的双重目的。它不仅能够抵抗简单的静态分析,还能对抗常见的动态分析技术,为恶意代码分析带来了新的挑战。