
智能摘要 AI
EntropyReducer是一种用于降低有效负载熵的算法,其工作原理由`BUFF_SIZE`和`NULL_BYTES`参数决定。该算法首先检查输入负载大小是否为`BUFF_SIZE`的倍数,若不是则填充至满足条件。接着,将负载分割成块并初始化为链表节点,每个节点包含大小为`NULL_BYTES`的空缓冲区。随后,通过合并排序算法随机化链表顺序,进一步降低熵。最终,链表被序列化并写入输出文件。 反混淆过程包括反序列化、链表排序及重组原始负载。`EntropyReducer`从命令行读取文件并输出混淆版本,文件名以“.ER”为前缀。混淆后文件大小可通过公式计算:`FinalSize = ((OriginalSize + BUFF_SIZE - OriginalSize % BUFF_SIZE) / BUFF_SIZE) * (BUFF_SIZE + NULL_BYTES + sizeof(INT))`。EntropyReducer显著降低了有效负载的熵
工作原理

EntropyReducer算法由BUFF_SIZE和NULL_BYTES值决定。以下是如果设置为4和2 , EntropyReducer将如何组织您的有效负载。BUFF_SIZENULL_BYTES
混淆算法
- EntropyReducer首先检查输入原始负载的大小是否为 的倍数
BUFF_SIZE,如果不是,则将其填充为原样。 - 然后它从有效负载中取出每个块,并使用InitializePayloadList
BUFF_SIZE函数为它创建一个链表节点,将有效负载初始化为一个链表。 - 创建的节点将有一个大小为的空缓冲区
NULL_BYTES,将用于降低熵 - 此时,尽管EntropyReducer通过降低有效载荷的熵完成了它的任务,但它并没有就此停止。然后它继续随机化链表中每个节点的顺序,分解原始负载的顺序。此步骤是通过MergeSort函数实现的合并排序算法完成的。
- 排序后的链表是随机排序的,因为链表排序后的值是原始payload的前三个字节的异或值,这个值决定了它在重新组织的链表中的位置,这一步可以显示这里
- 因为将链表保存到文件是不可能的,因为它是由指针链接在一起的。我们被迫将其序列化。
- 生成的链表的序列化是通过这里的
Obfuscate函数完成的。 - 之后,序列化数据就可以写入输出文件了。
反混淆算法
- 由于最后一步是
Obfuscation Algorithm序列化链表,所以这里要做的第一件事就是反序列化混淆后的有效负载,从中生成链表,这一步在函数中完成Deobfuscate。 - 下一步是使用节点的 Id 对链表进行排序,这是使用之前使用的相同合并排序算法完成的。
- 现在,链表的顺序正确,可以按照应有的方式重新构造有效载荷的字节。所以我们只需从每个节点中剥离有效载荷的原始字节,就像这里所做的那样。
- 最后一步是释放分配的节点,在此处完成。
用法
- EntropyReducer只是从命令行读取原始负载文件,并将混淆后的版本写入以“.ER”为前缀的相同文件名。
- 最终混淆后的有效负载的大小取决于 和 的
BUFF_SIZE值NULL_BYTES。但是,可以使用以下等式确定
FinalSize = ((OriginalSize + BUFF_SIZE - OriginalSize % BUFF_SIZE ) / BUFF_SIZE) * (BUFF_SIZE + NULL_BYTES + sizeof(INT))- 此 repo 中的PoC项目用于执行作为反序列化和反混淆
".ER"示例生成的文件。
包含在您的项目中
您所要做的就是将EntropyReducer.c和EntropyReducer.h文件添加到您的项目中,然后调用Deobfuscate函数。您可以查看PoC/main.c以供参考。
输出示例
在此示例中,设置BUFF_SIZE为3和NULL_BYTES1 。
- 原始有效负载,第一个有效负载块 (
FC 48 83)

- 相同的有效负载块,但偏移量不同

利润
- 由metasploit生成的 x64 calc shellcode是熵的
5.883,由pestudio查看。

- 同一个文件,AES 加密,得分熵为
7.110.

- RC4 算法的结果也几乎相同;
7.210

- 然而,使用EntropyReducer,得分熵甚至低于原始原始负载的熵;
4.093

合并排序算法取自c-linked-list。





评论 (0)