文章总结: 文档阐述了自研C2中利用多态变形技术规避特征码扫描的方法。核心是通过语义等价指令替换改变二进制特征以逃避哈希检测。内容涵盖PE解析、反汇编及指令变换的实现细节,强调了标志位保存的重要性。同时指出变形代码可能因序列异常被检测,建议参考Phrack资料优化,对红队免杀开发具有实战参考价值。 综合评分: 84 文章分类: 免杀,红队,恶意软件,二进制安全,安全开发
自研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倍
超清 流畅
继续观看
自研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不可缺少的模块-多态恶意软件的艺术,终结基于特征码的扫描》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论