_Incapsula_Resource与Rc4混淆分析

2024-01-10 11:29:43

一、获得混淆js

这么一个地址
https://www.interasia.cc/_Incapsula_Resource?SWJIYLWA=5074a744e2e3d891814e9a2dace20bd4,719d34d31c8e3a6e6fffd425f7e032f3

浏览器打开这个地址

在这里插入图片描述
复制这个js,到浏览器调试

在这里插入图片描述
先格式化查看,也就是一个eval函数执行b函数

在这里插入图片描述
打上断点(如果打不上断点的,crtl+s 保存文件,然后先执行一遍)

在这里插入图片描述
再次打断点,点进运行,进入到VM代码,就是一个OB混淆

在这里插入图片描述

把这个js代码,随便复制到一个新文件

二、分析JS

(1)格式化检测

从eval直接运行VM

可以看到很顺畅,没有一点卡顿,直接运行完所有,并且没有报错信息

请添加图片描述

从复制的文件运行代码

等待了一段时间出现错误

在这里插入图片描述

(2)格式化检测处理

在这里插入图片描述

这个是一个函数,定义了2个大数组,并且有自执行函数,选择合适位置打上断点分析,从这这个代码看到是顺序执行,我打上如下断点

在这里插入图片描述
运行调试,先执行了一个大数组生成,下面红框的函数是啥?

在这里插入图片描述

将红框的函数复制到 ob混淆解锁工具,如下图

https://lelinhtinh.github.io/de4js/

下图看到是对cookies的一个操作,并且使用了test,和toString 的方法,对removecookies这个方法进行格式化检测

那么这个 _0xf7ae1e 是这个方法的函数主体

在这里插入图片描述

 通过这个变量承载函数
 _0x13ab73['\x75\x70\x64\x61\x74\x65\x43\x6f\x6f\x6b\x69\x65'] = _0xf7ae1e;
 
 _0x5d6155  将函数调用进行执行
 var _0x5d6155 = _0x13ab73['\x75\x70\x64\x61\x74\x65\x43\x6f\x6f\x6b\x69\x65']();

再此处打上断点,查看 ,在没有去格式化的情况看这个值的结果如何,可以看到为false

在这里插入图片描述
将代码格式化去掉

在这里插入图片描述改成一行,在重新执行js,可以看到输出为True

在这里插入图片描述

关于格式化检测,如果不确定多少处,可以改一处,执行一次代码,看看是否还会出错,或者卡死,通过配合断点夹断方法,逐步确认什么函数,什么区域卡死或者报错

全局搜索 test,toString,RegExp 进行更改,本JS,搜索出来有10个地方

关于解决方法,可以通过调试状态下,在控制台,查看这些混淆代码,对应的函数主题需要进行格式化处理

在这里插入图片描述

想上面的第一个自执行函数处理完成后,调试可以正常走到下一个断点的,初步说明处理完毕

在这里插入图片描述

也可以将整个js文件,丢到上面工具网站,还原部分名称,进行修改,这里省略处理格式化检测过程

(3)Rc4 算法

将 _0x9897到工具看看怎么个事~
在这里插入图片描述

明显的Rc4算法

在这里插入图片描述

这段代码实现了 RC4 算法,是一种流加密算法。RC4(Rivest Cipher 4)是由 Ronald Rivest 设计的一种对称密钥算法,常用于加密通信中的数据流。它基于一个密钥流生成算法,通过对明文逐字节进行异或操作,实现对数据的加密和解密。

在这段代码中,有两个主要函数:

_0x9897: 这是 RC4 算法的主函数,接受两个参数 _0x2db912 和 _0x1c0add,其中 _0x2db912 是密钥,而 _0x1c0add 是需要加密/解密的数据。它使用了一个自执行的匿名函数,其中包含 RC4 算法的核心逻辑。
_0x3cdff9: 这个函数是 RC4 算法的核心,它接受两个参数 _0x384756_0x407419,其中 _0x384756 是需要加密/解密的数据,而 _0x407419 是密钥。该函数首先对密钥进行处理,然后通过对明文逐字节进行 RC4 算法的异或操作,得到加密或解密后的结果。

用JavaScript写一个简单样例

function rc4(key, input) {
    // 初始化阶段
    let S = [];
    for (let i = 0; i < 256; i++) {
        S[i] = i;
    }

    // 密钥调度阶段
    let j = 0;
    for (let i = 0; i < 256; i++) {
        j = (j + S[i] + key.charCodeAt(i % key.length)) % 256;
        // 交换 S[i] 和 S[j]
        const temp = S[i];
        S[i] = S[j];
        S[j] = temp;
    }

    // 伪随机生成阶段
    let i = 0;
    j = 0;
    let output = '';
    for (let k = 0; k < input.length; k++) {
        i = (i + 1) % 256;
        j = (j + S[i]) % 256;
        // 交换 S[i] 和 S[j]
        const temp = S[i];
        S[i] = S[j];
        S[j] = temp;
        const K = S[(S[i] + S[j]) % 256];
        // 异或运算
        output += String.fromCharCode(input.charCodeAt(k) ^ K);
    }

    return output;
}

// 示例
const key = 'SecretKey';
const plaintext = 'Hello, RC4!';
const ciphertext = rc4(key, plaintext);
console.log('Plaintext:', plaintext);
console.log('Ciphertext:', ciphertext);

// 解密
const decryptedText = rc4(key, ciphertext);
console.log('Decrypted Text:', decryptedText);

关于rc4算法更多

https://blog.51cto.com/u_15301988/3089450

RC4(Rivest Cipher 4),也称为Ron’s Code 4,是一种流密码(stream cipher)算法。它是由Ron Rivest在1987年设计的,用于在计算机通信中提供保密性。

RC4的特点是简单、高效,适用于资源受限的环境。它属于对称密钥算法,意味着相同的密钥用于加密和解密。以下是RC4算法的基本思想和步骤:

初始化阶段:

使用一个变量数组S(通常为256字节)作为状态向量。
初始化S数组,这通常是通过将其填充为0到255的整数序列。

密钥调度阶段:

将密钥(通常是8至256位长)按字节加入到S数组中。
通过多次迭代和交换S数组中的元素来增强密钥的随机性。

伪随机生成阶段:

利用初始化和密钥调度阶段构造的S数组,生成伪随机流。
将伪随机流与明文进行异或运算,得到密文。

加密过程:

对每个明文字节,使用伪随机生成的流进行异或运算。

三、处理

在rc4 算法函数观察值

在这里插入图片描述

出来结果

在这里插入图片描述

那么解决方法
在这里插入图片描述
继续内部读点调试
在这里插入图片描述

剩下的方法就很多了,封装SDK,算法还原都可以

文章来源:https://blog.csdn.net/weixin_44238683/article/details/135480981
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。