【免杀】C2免杀技术(五)动态API

一、什么是动态API

在C2免杀领域中,“动态API” 主要指的是绕过静态检测的一种技术手段,其本质是运行时动态解析和调用Windows API函数,而不是在程序编译阶段就明确引用这些API。这种方式可以有效躲避静态分析工具和杀软的签名识别。

为什么使用动态API?

静态杀软和EDR会扫描程序中是否包含可疑API(比如 CreateRemoteThreadVirtualAllocExWriteProcessMemory 等),一旦在导入表(IAT)或代码段中发现这些函数,就可能被标记为恶意。通过动态API调用,这些函数不会直接出现在导入表中,也不会以明文字符串形式出现,提高了免杀能力。

什么是IAT导入表?

在Windows可执行文件(如 .exe.dll)中,导入表(IAT,Import Address Table) 是PE结构中的一个关键部分,它告诉操作系统这个程序运行时需要哪些外部模块(DLL)和函数(API),并在加载时将它们的地址填入到程序中可调用的位置。一句话定义:IAT 是Windows程序用于调用外部DLL函数的一张“函数地址表”,由操作系统在加载时填充。 

举个直观的例子,假设你的程序要使用 Windows 的 MessageBoxA 函数,它位于 user32.dll 中。编译后 (静态导入),在PE文件头的导入表中,会列出DLL名、函数名;加载时操作系统的PE加载器会加载user32.dll,查找MessageBoxA函数的内存地址,并把这个地址写入到你的程序的IAT表项。然后你的代码中对MessageBoxA的调用,实际上是跳转到这个表项。

因此,杀软和EDR能直接查看IAT,看你的程序调用了哪些函数(如上图),一旦发现这些敏感API,程序可能立即被标记为恶意; 通过动态API可以绕过IAT暴露。

二、免杀效果展示

这里用C++写一个简单的喝水提醒的程序,代码如下:

#include <windows.h>
#include <iostream>
#include <thread>
#include <chrono>void remindToDrinkWater() {while (true) {// 等待1小时(3600秒)//std::this_thread::sleep_for(std::chrono::hours(1));std::this_thread::sleep_for(std::chrono::seconds(10));// 弹出消息框提醒喝水MessageBoxA(NULL, "该喝水了!", "喝水提醒", MB_OK | MB_ICONINFORMATION);}
}int main() {// 启动提醒喝水的线程std::thread reminderThread(remindToDrinkWater);// 主线程保持运行reminderThread.join();return 0;
}

运行测试,功能正常

再复制一份,加上动态API解析和调用代码

#include <windows.h>
#include <thread>
#include <chrono>
#include <iostream>typedef int (WINAPI* MessageBoxAFunc)(HWND, LPCSTR, LPCSTR, UINT);void remindToDrinkWater() {// 获取 user32.dll 的模块句柄HMODULE hUser32 = LoadLibraryA("user32.dll");if (!hUser32) {std::cerr << "无法加载 user32.dll" << std::endl;return;}// 动态获取 MessageBoxA 函数地址MessageBoxAFunc pMessageBoxA = (MessageBoxAFunc)GetProcAddress(hUser32, "MessageBoxA");if (!pMessageBoxA) {std::cerr << "无法获取 MessageBoxA 函数地址" << std::endl;return;}while (true) {std::this_thread::sleep_for(std::chrono::seconds(10)); // 测试用:每10秒提醒一次pMessageBoxA(NULL, "该喝水了!", "喝水提醒", MB_OK | MB_ICONINFORMATION);}
}int main() {std::thread reminder(remindToDrinkWater);reminder.join();  // 等待线程结束(实际永远运行)return 0;
}

运行测试,功能正常

将两个程序均编译出来

使用StudyPE+对比一下两者的导入表,发现右边使用动态API技术的程序比左边少了user32.dll,所以IAT不可能存在MessageBoxA函数

放到360下检测

运行测试,正常

三、结尾

免杀效果通常受多方面影响,没有哪一种技术或者手段能够通吃,通常需要多种手段结合才能最终实现免杀;其次,实战中面临的环境也不一样,不同的杀软效果也不一样,具体问题还需具体分析。本系列文章以技术的实现为主,验证时讲究点到为止,以此表达一项技术的有效性。 

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

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

相关文章

Python爬虫实战:研究JavaScript压缩方法实现逆向解密

一、引言 在数字化信息爆炸的时代,网络数据已成为驱动各行业发展的核心资产。Python 凭借其丰富的库生态和简洁的语法,成为网络爬虫开发的首选语言。然而,随着互联网安全防护机制的不断升级,网站普遍采用 JavaScript 压缩与混淆技术保护其核心逻辑和数据传输,这使得传统爬…

HTTP 请求走私(HTTP Request Smuggling)

HTTP 请求走私&#xff08;HTTP Request Smuggling&#xff09;是一种通过利用前端代理&#xff08;如负载均衡器、CDN&#xff09;和后端服务器在 解析 HTTP 请求时存在不一致性 的漏洞&#xff0c;从而实现 注入恶意请求 的攻击技术。 一、基本原理 HTTP 请求走私主要依赖两…

【Google机器学习实践指南(线性回归篇)

&#x1f50d; Google机器学习实践指南&#xff08;线性回归篇&#xff09; Google机器学习实战(3)-单变量线性回归核心解析&#xff0c;掌握房价预测模型 一、建模流程全景图 ▲ 四大核心步骤&#xff1a; 数据可视化→特征工程→模型训练→预测推理 二、房价预测实战 1. …

python打卡day16

NumPy 数组基础 因为前天说了shap&#xff0c;这里涉及到数据形状尺寸问题&#xff0c;所以需要在这一节说清楚&#xff0c;后续的神经网络我们将要和他天天打交道。 知识点&#xff1a; numpy数组的创建&#xff1a;简单创建、随机创建、遍历、运算numpy数组的索引&#xff1a…

ubuntu 20.04 更改国内镜像源-阿里源 确保可用

镜像源是跟linux版本一一对应的,查询自己系统的版本号&#xff1a; 命令&#xff1a;lsb_release -a macw:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal macw:~$…

基于OpenCV的SIFT特征和FLANN匹配器的指纹认证

文章目录 引言一、概述二、代码解析1. 图像显示函数2. 核心认证函数2.1 创建SIFT特征提取器2.2 检测关键点和计算描述符&#xff08;源图像&#xff09;2.3 检测关键点和计算描述符&#xff08;模板图像&#xff09;2.4 创建FLANN匹配器2.5 使用K近邻匹配 3. 匹配点筛选4. 认证…

四品种交易策略

策略概述 策略思路: 交易品种:同时交易四个品种,每个品种使用总资金的10%。 合约选择:使用连续合约(data0)发出交易信号,实际交易 主力合约(data1)和下一个主力合约(data2)。 资金管理:总资金用A_CurrentEquity表示,交易手数据此计算。 止损执行:盘中达到止损…

MySQL事务的一些奇奇怪怪知识

Gorm事务有error却不返回会发生什么 Gorm包是大家比较高频使用。正常的用法是&#xff0c;如果有失败返回error&#xff0c;整体rollback&#xff0c;如果不返回error则commit。下面是Transaction的源码&#xff1a; // Transaction start a transaction as a block, return …

时序数据库、实时数据库与实时数仓:如何为实时数据场景选择最佳解决方案?

随着物联网、金融交易、在线游戏等场景对实时数据处理需求的增长&#xff0c;市场上涌现出多种专门针对实时数据处理的数据库解决方案。然而&#xff0c;面对时序数据库、实时数据库和实时数据仓库这三种看似相似的技术&#xff0c;许多技术决策者常常感到困惑&#xff1a;它们…

Spring3+Vue3项目中的知识点——JWT

全称&#xff1a;JOSN Web Token 定义了一种简洁的、自包含的格式&#xff0c;用于通信双方以json数据格式的安全传输信息 组成&#xff1a; 第一部分&#xff1a;Header&#xff08;头&#xff09;&#xff0c;记录令牌类型、签名算法等。 第二部分&#xff1a;Payload&am…

微服务架构详解

微服务架构详解:从概念到实践(附代码案例) 目录 微服务架构详解:从概念到实践(附代码案例) 一、微服务架构概述 1.1 什么是微服务? 1.2 微服务的核心思想 二、微服务架构的优势与挑战 2.1 优势 2.2 挑战 三、微服务架构的核心组件 3.1 服务注册与发现 示例代…

linux下编写shell脚本一键编译源码

0 前言 进行linux应用层编程时&#xff0c;经常会使用重复的命令对源码进行编译&#xff0c;然后把编译生成的可执行文件拷贝到工作目录&#xff0c;操作非常繁琐且容易出错。本文编写一个简单的shell脚本一键编译源码。 1 linux下编写shell脚本一键编译源码 shell脚本如下&…

学习!FastAPI

目录 FastAPI简介快速开始安装FastApiFastAPI CLI自动化文档 Reqeust路径参数Enum 类用于路径参数路径参数和数值校验 查询参数查询参数和字符串校验 请求体多个请求体参数嵌入单个请求体参数 CookieHeader表单文件直接使用请求 ResponseResponse Model多个关联模型 响应状态码…

DAY 4 缺失值的处理

\1. 打开数据 import pandas as pd data pd.read_csv(rdata.csv) data\2. 查看数据 # 打印数据集的基本信息&#xff08;列名、非空值数量、数据类型等&#xff09; print("data.info() - 数据集的基本信息&#xff08;列名、非空值数量、数据类型等&#xff09;&#…

Java面试实战:从Spring Boot到分布式缓存的深度探索

Java面试实战&#xff1a;从Spring Boot到分布式缓存的深度探索 场景介绍 在一家著名的互联网大厂&#xff0c;面试官老王正对求职者“水货程序员”明哥进行Java技术面试。明哥带着一点紧张和自信&#xff0c;迎接这场技术“拷问”。 第一轮&#xff1a;基础问题 老王&#…

UART、SPI、IIC复习总结

一、UART 1、UART和USART的异同&#xff1f; 相同点 基本功能&#xff1a;都是用于串行通信的数据收发设备&#xff0c;能够实现数据在不同设备之间的传输。在异步通信模式下&#xff0c;二者的工作方式相似&#xff0c;都使用起始位、数据位、校验位&#xff08;可选&#…

PostGIS实现矢量数据转栅格数据【ST_AsRaster】

ST_AsRaster函数应用详解&#xff1a;将矢量数据转换为栅格数据 [文章目录] 一、函数概述 二、函数参数与分组说明 三、核心特性与注意事项 四、示例代码 五、应用场景 六、版本依赖 七、总结 一、函数概述 ST_AsRaster是PostGIS中用于将几何对象&#xff08;如点、线…

Linux 线程(上)

前言&#xff1a;大家早上中午晚上好&#xff01;&#xff01;今天来学习一下linux系统下所谓的线程吧&#xff01;&#xff01;&#xff01; 一、重新理解进程&#xff0c;什么是进程&#xff1f; 1.1 图解 其中黑色虚线部分一整块就是进程&#xff0c;注意&#xff1a;一整…

Java API学习笔记

一.类 1. String 类 不可变性&#xff1a;String对象创建后不可修改&#xff0c;每次操作返回新对象 String str "Hello"; str.length(); str.charAt(0); str.substring(1, 4); str.indexOf("l"); str.equals("hel…

医疗信息系统安全防护体系的深度构建与理论实践融合

一、医疗数据访问系统的安全挑战与理论基础 1.1 系统架构安全需求分析 在医疗信息系统中&#xff0c;基于身份标识的信息查询功能通常采用分层架构设计&#xff0c;包括表现层、应用层和数据层。根据ISO/IEC 27001信息安全管理体系要求&#xff0c;此类系统需满足数据保密性…