工作原理
EntropyReducer算法由BUFF_SIZE和NULL_BYTES值决定。以下是如果设置为4和2 , EntropyReducer将如何组织您的有效负载。BUFF_SIZE
NULL_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_BYTES
1 。
- 原始有效负载,第一个有效负载块 (
FC 48 83
)
- 相同的有效负载块,但偏移量不同
利润
- 由metasploit生成的 x64 calc shellcode是熵的
5.883
,由pestudio查看。
- 同一个文件,AES 加密,得分熵为
7.110
.
- RC4 算法的结果也几乎相同;
7.210
- 然而,使用EntropyReducer,得分熵甚至低于原始原始负载的熵;
4.093
合并排序算法取自c-linked-list。
📮评论