Skip to content

C2 Implant汇编实现全流程及检测对策研究

写在前面

俺写这个文章不是为了宣传咋写远控,重点是检测对策研究,知道小黑子的思路才能更好地进行检测

远控木马的核心在于 implant 模块,它驻留于被控主机中,负责与 C2(Command & Control)服务器通信、执行命令、回传数据。大多数 implant 是用 C/C++ 编写的,功能强但也容易留下高层特征,而最近我正好在研究汇编,那么,如果完全用汇编(NASM)来写一个精简 implant,会啥样,说干就干,实现了一个,server用py随便写了一个,主要是为了下发命令,感谢大模型~帮我做了很多苦力,运行效果大概如下图:

image-20250729235547618

下面开始正文~

这篇文章将以 Windows x64 为平台,介绍一个基于汇编实现的 C2 implant 的全流程。逐步拆解核心功能模块——从网络通信、命令分发、信息收集到远程命令执行,并结合检测与对抗角度讨论它的行为特征与潜在检测策略。


一、模块总览与工作流程

一个典型 implant 的核心结构通常包括四个主要模块:

  1. 网络通信:建立 网络连接 连接、发送接收数据
  2. 命令解析:判断关键字、提取参数
  3. 功能调用:如执行命令、信息采集等
  4. 数据回传:获取加过后加密回传

项目结构如下图(别问我为啥我写了这么多,而只发了一小部分,因为我是为了练手不是为了给小黑子写马,下边的代码放那也不能运行,主要是实现思路和检测思路): image-20250729235045769

二、网络通信:汇编下的建立连接与收发

implant 的生命周期始于与 C2 的连接。由于我们使用汇编,所有 API 的参数准备、结构体构造都要手动完成,下面的代码是在汇编中调用 WSAStartupsocket 完成连接准备:

; 初始化WSA,准备网络环境
sub rsp, 40                  ; 为WSAData结构体分配栈空间
mov rcx, 0x202               ; rcx = WSAStartup版本号(2.2)
lea rdx, [rsp]               ; rdx = WSAData结构体指针
call WSAStartup              ; 调用WSAStartup初始化网络

; 创建Socket
mov rcx, AF_INET             ; rcx = 地址族(IPv4)
mov rdx, SOCK_STREAM         ; rdx = 套接字类型(流式)
mov r8, IPPROTO_TCP          ; r8 = 协议类型(TCP)
call socket                  ; 创建Socket句柄

数据的加解密使用 XOR 处理方式,实现原理简单但可混淆流量内容:

; rcx = 缓冲区地址, rdx = 长度, r8b = key
xor_loop:
    mov al, [rcx]
    xor al, r8b
    mov [rcx], al
    inc rcx
    dec rdx
    jnz xor_loop

三、命令解析与执行分发

implant 接收到来自 C2 的命令后,需要能识别命令类型(如 execinfo 等),并跳转到对应处理逻辑。

这部分我们使用自定义的字符串比较函数,而非调用 CRT(标准C库),避免引入可识别的函数调用痕迹(哈哈哈,其实是因为报错了,我懒得调了)。命令参数一般通过空格分隔,命令字符串通常长这样:

exec whoami

通过逐字节比对实现命令匹配逻辑:

; rcx指向命令字符串,rdx指向关键字
call strcmp                 ; 调用自定义字符串比较函数
cmp eax, 0                  ; 比较结果,0表示相等
je handle_exec              ; 若匹配则跳转到exec命令处理流程

四、主机信息收集:获取系统基本信息

常见信息包括主机名、用户名、系统版本等。这些信息用于在 C2 面板上标识被控主机,或用于环境判断。

下面的代码是如何在栈上准备缓冲区并调用 GetComputerNameW(其他的我就不展示了~):

; 分配缓冲区并准备参数
sub rsp, 260                ; 为主机名缓冲区分配栈空间
mov rcx, rsp                ; rcx = lpBuffer,主机名缓冲区地址
mov rdx, 128                ; rdx = lpnSize,缓冲区长度
call GetComputerNameW       ; 调用API获取主机名

执行成功后,implant 将主机名转为 UTF-8 或 ASCII 编码,再通过 XOR 加密后发送至 C2。

五、远程命令执行:执行系统命令并获取输出

implant 支持远程执行任意命令行,比如:

exec whoami
exec dir C:\

我们通过 CreateProcessW 创建子进程,设置 STARTUPINFO 结构体以实现标准输出重定向,最终从管道读取输出并回传,代码如下:

; 设置STARTUPINFO结构体,指定输出重定向
lea rcx, [startupinfo]              ; rcx = STARTUPINFO结构体地址
mov dword [rcx+60], 0x100           ; dwFlags = STARTF_USESTDHANDLES
; ...设置标准句柄为管道...

; 调用CreateProcessW创建子进程
mov rcx, 0                          ; lpApplicationName = NULL
mov rdx, command_line               ; lpCommandLine = 命令行字符串
mov r8, 0                           ; lpProcessAttributes = NULL
mov r9, 0                           ; lpThreadAttributes = NULL
; ...
call CreateProcessW                 ; 创建进程

六、针对汇编Implant的检测维度探索

1.静态检测策略

尽管 implant 使用汇编语言实现,并规避了标准库依赖,但仍可能在样本文件中保留以下静态特征:

  • 异常导入表:使用的 API 函数集中于网络通信(如 socket、connect)、系统信息采集(如 GetComputerNameW)、进程管理(如 CreateProcessA)等,其调用组合与正常程序差异显著。

  • 特征字节序列:如手动构造 sockaddr_in、STARTUPINFO 等结构体的指令组合具有显著特征性,易被 YARA 等规则捕捉。

  • XOR 加密实现特征:简易的循环异或实现模式(xor al, key + loop)可通过签名识别提取。

2.行为检测策略

implant 执行期间的行为更具可识别性,以下是几个关键的检测方向:

  • API 调用链分析:如在短时间内依次调用 WSAStartup → socket → connect → recv → CreateProcessW 等链式操作,可形成高置信度的恶意行为链。

  • 命令执行行为特征:

  • 高频创建短生命周期进程;

  • 子进程输出被重定向(通过管道读取);

  • 命令行参数中包含 cmd.exe 或 PowerShell 等高风险组件。

3.网络检测策略

implant 与 C2 通信虽然加密处理,但由于使用的是 XOR 或其他简易加密方式,仍存在检测空间:

  • 数据包结构特征:典型 implant 具有周期性通信、数据包结构固定、数据长度变化不大等特征,可通过流量统计模型检测。

  • 通信内容模式:即便加密,也可通过可见模式(如加密前后长度、字符熵值波动)推测传输内容是否为命令或执行结果。

4.内存层面检测

  • 内存特征匹配:识别 implant 在内存中的自解密段、手动加载模块、不规范导入表等特征。

  • 可疑内存区域扫描:如 heap/stack 区域中存在可执行 shellcode、跳板指令(如 jmp rax)等。后续预告

写在最后

老规矩,继续挖个坑马上我可能会深扒一下Cobaltstrike的Shellcode的实现~在写自动化分析的工具了,等我写完可能就会写这个文章了

ps:我日常拖更,不一定啥时候干~

Comments