自研C2不可缺少的模块-多态恶意软件的艺术,终结基于特征码的扫描

admin 2026-03-04 10:16:19 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档阐述了自研C2中利用多态变形技术规避特征码扫描的方法。核心是通过语义等价指令替换改变二进制特征以逃避哈希检测。内容涵盖PE解析、反汇编及指令变换的实现细节,强调了标志位保存的重要性。同时指出变形代码可能因序列异常被检测,建议参考Phrack资料优化,对红队免杀开发具有实战参考价值。 综合评分: 84 文章分类: 免杀,红队,恶意软件,二进制安全,安全开发


cover_image

自研C2不可缺少的模块-多态恶意软件的艺术,终结基于特征码的扫描

原创

老鑫安全 老鑫安全

老鑫安全

2026年3月3日 12:34 中国香港

AV签名扫描

一般来说,安全软件主要有三种技术:

  • • 文件扫描:签名(“yara”)扫描文件
  • • 内存扫描:使用签名(“yara”)扫描进程内存
  • • 遥测/行为:进程执行的操作(主要通过操作系统)

当文件写入磁盘时,杀毒软件会对其进行扫描。杀毒软件拥有一个包含已知恶意软件特征码(例如 Yara 规则)的数据库。文件写入事件由操作系统生成,并通过 AMSI 或内核微型过滤器传递给杀毒软件。签名扫描基于文件的静态内容。它会解析 PE 头部,并扫描 PE 段的内容。此过程发生在 EXE 文件执行之前。如果检测到可疑文件,则会在执行前将其删除。

通常最好的解决方案是多态变形代码。

多态代码的目的是混淆。有了它,就无需考虑基于哈希的检测,会让每个扫描器都以为自己在分析不同的二进制文件。

程序的本质

究竟是什么决定了程序的本质?是指令顺序?寄存器使用?内存布局?还是更深层次的东西,比如程序的意图?

多态理论认为,本质不在于代码的外观,而在于它的功能 *。*如果两个二进制文件对相同的输入产生相同的输出,即使它们的汇编代码完全不同,它们在功能上也是相同的。

Version A:               Version B:               Version C:
mov eax, 0               xor eax, eax             sub eax, eax
inc ebx                  add ebx, 1               lea ebx, [ebx+1]
Bytes:                  Bytes:                   Bytes:
B8 00 00 00 00 43       31 C0 83 C3 01          29 C0 8D 5B 01

三种完全不同的字节模式,功能却完全相同。所以程序的本质并非取决于其字节序列,而是取决于其行为。如果能生成无限多个产生相同行为的字节模式,就可以让基于特征码的检测变得不可能。

MOV reg, reg    NOP
XOR reg, reg    MOV reg, 0
MOV addr, reg +  PUSH addr  >  PUSH reg
MOV addr2, addr1 +  MOV addr3, addr2  >  MOV addr3, addr1
MOV reg, val +  ADD reg, reg2  >  LEA reg, [reg2 + val]

Original:    mov eax, [ebx+4]
Mutated:     push ebx
             add ebx, 4
             mov eax, [ebx]
             sub ebx, 4
             pop ebx
两者都将 [ebx+4] 处的值加载到 eax 中,但使用完全不同的指令序列。效果相同,但操作码不同。对于静态扫描器来说,它们之间是没有关联的。

早在2002年就有深度解析文章,深入剖析了多态变形代码引擎的构造:《我是如何打造MetaPHOR以及我从中学到的教训》,作者是The Mental Driller。没错,2002年。以今天的标准来看,确实古老,但其基本原理不过时。

http://virus.wikidot.com/metaphor

https://inria.hal.science/inria-00338066/document

现在我们用****另一种方式来实现。这个程序会接收一个二进制文件作为输入,然后根据输入生成**另一个二进制文件。每次程序执行时,它都会创建一个新的文件(新的哈希值)

步骤

  • • 创建一个结构体来存储必要的 PE 头变量
  • • 解析输入的 PE 文件并获取重要的PE header。
  • • 反汇编目标 PE 文件
  • • 随机更改指令
  • • 创建一个新文件,保留原文件的头部和所有部分,把修改后的“代码部分”写入其中。
xor  eax,eax 33 c0
sub  eax,eax 29 c0

它们都将 eax 寄存器设置为0 但是机器码完全不一样

但是这可能会改变代码流程,诸如像sub、xor指令操作寄存器时,会改变标记寄存器的标志位,当需要根据这些标志位做出决策时,代码流程就会改变。所以很多变形代码都会先pushf

mov eax,0                    pushf;--------------> 将条件标志保存到堆栈。
                            xor eax,0
                            popf;--------------> 从堆栈中恢复条件标志。
                             nop

 B8 00 00 00 00            9c 31 c0 9d 90

已关注

关注

重播 分享 赞

关闭

观看更多

更多

退出全屏

切换到竖屏全屏退出全屏

老鑫安全已关注

分享视频

,时长00:54

0/0

00:00/00:54

切换到横屏模式

继续播放

[ ]

进度条,百分之0

播放

00:00

/

00:54

00:54

倍速

全屏

倍速播放中

0.5倍 0.75倍 1.0倍 1.5倍 2.0倍

超清 流畅

 您的浏览器不支持 video 标签

继续观看

自研C2不可缺少的模块-多态恶意软件的艺术,终结基于特征码的扫描

观看更多

原创

,

自研C2不可缺少的模块-多态恶意软件的艺术,终结基于特征码的扫描

老鑫安全已关注

分享点赞在看

已同步到看一看写下你的评论

视频详情

每次执行时,它都会解析自身的二进制代码,找到可转换的区域,并将其替换为语义相同但语法不同的指令序列。

OPSEC?

但是如果分析最终的指令序列,你会意识到这种指令顺序极不寻常,正常情况下编译器不会生成这样的代码。这意味着,安全产品可以利用针对这些技术的静态检测规则,来检测这种指令混淆方法。

例如以下这条简单的Yara规则

rule  {
strings:
// pushf > 66 9c
// lea ?, [?] > 48 8d ?? ?? ?? ?? ??
// sub ?, ? > 48 81 ?? ?? ?? ?? ??
// popf > 66 9d
$lea_transform = { 66 9c 48 8d ?? ?? ?? ?? ?? 48 81 ?? ?? ?? ?? ?? 66 9d }
condition:
$lea_transform
}

改进

参考著名的黑客杂志《 Phrack》这篇文章:https://phrack.org/issues/71/15#article


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:老鑫安全 老鑫安全 老鑫安全《自研C2不可缺少的模块-多态恶意软件的艺术,终结基于特征码的扫描》

评论:0   参与:  0