SilentisVox/Payload-Obfuscation

GitHub: SilentisVox/Payload-Obfuscation

一款专注于 shellcode 加密与 MAC 混淆的载荷隐匿方案,旨在帮助研究者在测试环境中规避防病毒软件的检测。

Stars: 1 | Forks: 0

# 载荷混淆 逃避 **防病毒软件**(AV)最常见的方式是 shellcode 注入。 当 shellcode 被加载到内存中后,仅因存在就会被视为恶意。 逃避检测的一种方法,就是简单地伪装 shellcode; 在明处隐藏的同时保持功能正常。 **免责声明**:此内容仅用于教育和测试目的。 不要在你没有使用权限的机器上使用。 不要使用此方法来操控或与未经授权的机器通信。 ## 问题 在大多数情况下,shellcode 是从原始 **可执行文件**(EXE)注入的。 可执行文件的 `.data` 段包含公开的变量; shellcode 可以被存储在一个变量中,并在之后被引用。 如果 `.data` 段中包含 shellcode 指令,那说明情况已经严重异常。 防病毒软件在识别恶意软件时倾向于采取更保守的策略; 隐藏 shellcode 应成为优先事项。 为 shellcode 插入随机垃圾数据仍可能被标记为 shellcode。 插入看起来不像原本内容的代码,更容易被标记。 ``` - .\Malware.exe : Operation did not complete successfully because the file contains a virus or potentially unwanted software. ``` ## 解决方案 当我考虑混淆 shellcode 时,脑海中浮现两种方案。 一种方案可能看起来像 **加密**; 以只有我们知晓的方式扰乱 shellcode,使其变得不可识别。 另一种方案是 **MAC 混淆**; 将 shellcode 伪装成 MAC 地址数组,因为许多 EXE 都嵌入了 MAC 地址。 ### 加密 为了简洁和简单,我的加密算法将采用其中最基础的一种。 通过使用一个随机化的字节表,并根据字节密钥进行位移,我们实现了加密。 这种加密被称为 **Vigenere**,其本质是将一系列凯撒密码组成一张加密表。 加密过程涉及查找明文字节在表中的索引,并加上密钥字节在表中的索引。 解密时,查找加密字节在表中的索引,再减去密钥字节的索引,即可还原明文字节。 ``` void ENCRYPT(char *BUFFER, unsigned long SIZE, char *TABLE, char *KEY, char *OUTPUT) { for (int i = 0; i < SIZE; i++) OUTPUT[index] = TABLE[(indexof(TABLE, BUFFER[i]) + indexof(TABLE, KEY[i])) % 256]; } void DECRYPT(char *BUFFER, unsigned long SIZE, char *TABLE, char *KEY, char *OUTPUT) { for (int i = 0; i < SIZE; i++) OUTPUT[index] = TABLE[(indexof(TABLE, BUFFER[i]) - indexof(TABLE, KEY[i]) + 256) % 256]; } ``` ### MAC 混淆 将载荷伪装为 MAC 地址的混淆方式稍复杂,因为我们需要知道如何还原。 最初,按每 6 个字节一组进行打印是可以的,只要我们有填充。 但在反混淆时,我希望在导入函数方面保持极简。 既然我们知道如何混淆载荷,就可以利用一些技巧。 对于 MAC 地址的每个槽位,我们希望从字符的序数值中减去偏移,以获取字节片段。 将初始片段左移 4 位,并与第二个片段合并,即可得到正确的字节。 每 3 个字节跳过一位,我们取前 2 位来组成载荷的 1 个字节。 ``` void OBFUSCATE (char *MAC_ARRAY, unsigned long MAC_ARRAY_SIZE) { for (int i = 0; i < MAC_ARRAY_SIZE; i += 6) printf( "\"%02X-%02X-%02X-%02X-%02X-%02X\"", MAC_ARRAY[i], MAC_ARRAY[i + 1], MAC_ARRAY[i + 2], MAC_ARRAY[i + 3], MAC_ARRAY[i + 4], MAC_ARRAY[i + 5] ); } void MAC2CODE(char *STRING, char *ADDRESS) { for (int i = 0, j = 0; i < 6; i++, j += 3) ADDRESS[i] = (fromchar(STRING[j]) << 4) | (fromchar(STRING[j + 1])); } void DEOBFUSCATE(char *ARRAY[], unsigned long SIZE, char *BUFFER) { for (int i = 0, j = 0; i < SIZE; i++, j += 6) { char ADDRESS[6]; MAC2CODE(ARRAY[i], ADDRESS); BUFFER[j] = Address[0]; BUFFER[j + 1] = Address[1]; BUFFER[j + 2] = Address[2]; BUFFER[j + 3] = Address[3]; BUFFER[j + 4] = Address[4]; BUFFER[j + 5] = Address[5]; } } ```
标签:AV绕过, .data节, FastAPI, Payload Obfuscation, Shellcode, UML, Vigenere加密, 云资产清单, 代码伪装, 加密, 反病毒逃避, 可执行文件, 字节移位加密, 客户端加密, 恶意代码隐藏, 技术调研, 教育用途, 测试环境, 混淆, 漏洞扫描器, 网络安全, 逆向工程, 随机化表, 隐私保护