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加密, 云资产清单, 代码伪装, 加密, 反病毒逃避, 可执行文件, 字节移位加密, 客户端加密, 恶意代码隐藏, 技术调研, 教育用途, 测试环境, 混淆, 漏洞扫描器, 网络安全, 逆向工程, 随机化表, 隐私保护