恶意和非恶意二进制文件静态数据解析和分析

admin 2025年6月24日00:15:20评论24 views字数 23899阅读79分39秒阅读模式

【翻译】Static Data Exploration

两年前,我们完全被数据收集、一次性编写的 Python 代码和炫目的图表所吸引,在 2018 年 EMBER 论文的启发下,我们开始收集、解析和分析恶意和良性二进制文件。我们最终在 Steelcon 2024 会议上讨论了这一过程和我们的发现,在我们的演讲《统计隐匿性》中,我们试图确定一个新植入程序需要做什么才能融入当代良性软件的格局。我们希望这项分析既能启发和激励创建更好的有效载荷,也能为蓝队提供静态恶意软件分析的进一步属性和行为指导。

我们的初步发现相当有趣,但由于生活和倦怠的混合因素,我们早就应该进行后续研究了。但上周,Ember 2024 作为 EMBER2024 - 恶意软件分类器整体评估基准数据集的一部分发布,重新点燃了我们对这个主题的兴趣。我们开始更新和扩展我们的 2024 年数据集,更新我们的审查流程,并基于 EMBER2024 论文,EMBER2024 - 恶意软件分类器整体评估基准数据集以及自我们上次演讲以来发表的其他研究进行进一步的分析技术。最终,我们想在这篇和即将发布的博客中从静态角度审视软件的状态,看看我们能学到什么来创建更好的恶意软件,以及更好地区分恶意软件和良性可执行文件的方法。我们将介绍我们如何收集样本,如何创建数据集,然后使用我们更新的方法探索和记录我们最初且严重拖延的发现。

数据收集

与许多项目一样,获取数据是这个问题中最困难的部分——确保我们的样本大体一致,并反映整个群体的适当广度和深度。在我们的处理过程中,我们将样本分为两大类,然后尽可能多地寻找示例:

类别
描述
恶意二进制文件 ("malware")
本质上具有恶意意图的软件,如病毒、木马、蠕虫等让我们保持就业的好东西。
良性二进制文件 ("goodware")
不包含恶意意图的软件,如共享或专用库(即.dlls)或 Spotify、Outlook 或 Minecraft 等应用程序。在本节中,我们包括原生的 Microsoft Windows 二进制文件以及第三方开发的二进制文件(即为 Windows 开发的其他所有人)。

收集恶意软件样本

我们从恶意软件开始。恶意软件很容易获得,集中且遍布互联网。虽然许多有用的网站提供免费恶意软件,一次一个植入程序,但我们发现了几家拥有大量恶意软件收藏的知名组织。我们从以下数据集中收集了样本:

  1. Sophos ReversingLabs 2000 万数据集 SOREL-20M
  2. Abuse.ch 和 Spamhaus 的 MalwareBazaar
  3. 无与伦比的 VX-Underground

Sophos Reversinglabs SOREL-20M 数据集是我们发现的最方便的恶意软件数据集,因为它包含(毫不奇怪)2000 万个样本,这些样本都可以从 Amazon S3 轻松下载。然而,正如他们的博客 Sophos-ReversingLabs (SOREL) 2000 万样本恶意软件数据集中详细描述的那样,数据集中的样本通过剥离 Subsystem 和 FileHeader.Machine 头值被解除武装,这可能会通过减少子系统字段中可用的元数据来影响我们的分析。

对于恶意软件样本,我们审查了完整的二进制文件,将 OptionalHeader.Subsystem 标志和 FileHeader.Machine 头值都设置为 0,以防止意外执行。

收集良性软件样本

良性软件更难获得,经过验证的良性软件更是如此。对于良性软件,我们在演讲中使用了多种来源:

  1. 国家软件参考库 (NSRL)
  2. 各种配置、版本和分发的 Microsoft Windows 和 Microsoft Windows 服务器。
  3. 典型的 Microsoft 软件,包括应用程序、服务、库和其他可分发文件。
  4. Chocolatey
  5. ninite

国家软件参考库 (NSRL) 数据库维护了供应商提交的应用程序的哈希值列表。有了这些哈希值,挑战在于找到文件本身。对我们来说,我们发现 Hybrid Analysis API 可以让我们拉取原始二进制文件。我们还使用了其他公开可用的助手;我们编写了一些简单的脚本来从 Windows 的包管理器 Chocolatey 中拉取二进制文件的版本,以及从初始安装助手 Ninite 中拉取(较少的)样本。我们还从我们的 Windows 实验室环境中尽可能多地获取了样本,包括多个桌面和服务器安装的 Windows,以及我们可以在其上安装的许多角色和服务。

这个数据集绝不是所有可用或可访问的良性软件样本的完整代表。我们应该注意到,正如 EMBER 所做的那样,与(大多数!)恶意软件不同,良性软件的许可和分发要严格得多,我们鼓励有抱负的读者负责任和道德地构建更完整的良性软件数据集。

数据解析

有了涵盖恶意软件和良性软件的新样本,我们构建了一个解析器来复制 ember 的工作并构建具有类似特征的数据集。关于我们如何自动化样本静态审查的全面演练,请参见 Mez0 的博客,"Citadel: 二进制静态分析框架"。为了避免在这里重新创建整个博客,我们的解析旨在审查每个二进制文件并突出显示其元数据和数据中的特征,包括:

  1. 导入
  2. 导出
  3. 可选头
  4. 熵(包括整个文件和逐节)
  5. 文件大小
  6. 工具链(编译器、链接器等)
  7. 代码签名
  8. TLS
  9. 符号
  10. 哈希(TLSH 和 SHA256)

我们发现我们无法获得的是恶意软件家族。也许 Citadel 可以更新为我们做到这一点,但这需要一些时间来开发和执行——也许我们将来会探索这一点。如果你有任何关于我们如何实现这一点的想法,请联系我们!

通过这些努力,我们总共获得了 644,140 个样本,其中 613,879 个是恶意软件样本,30,261 个是良性软件样本。

恶意软件与良性软件分布

数据探索

在展示了我们如何整理和解析数据集之后,让我们深入分析解析结果,并分享我们在探索数据集时的初步发现和理论。

架构分析

首先从架构开始分析。让我们看看数据集中恶意软件 (malware) 和良性软件 (goodware) 在 x64 和 x86 架构上的分布情况。

恶意软件分布:

架构
数量
x64
613878
未知
1

良性软件分布:

架构
数量
x64
19880
x86
10380
恶意软件架构
良性软件架构

有趣的是,恶意软件样本中有 613,878 个是 x64 架构,只有 1 个未知架构。而良性软件的分布则更为均衡,x64 架构有 19,880 个,x86 架构有 10,380 个。从开发者的角度来看,虽然 x64 架构已经存在相当长的时间,但 x86 样本的完全缺失仍然令人惊讶。我们不能完全排除样本提交到数据集时的异常行为,但我们对这个结果持怀疑态度。

节区分析

我们以 PE 格式调试页面作为官方实现的节区名称基础,可以直接比较相似节区的大小和熵值,同时使用节区名称列表来检查非官方或非常规的节区。

节区名称
描述
.bss
未初始化数据(自由格式)
.cormeta
表示包含托管代码的 CLR 元数据
.data
初始化数据(自由格式)
.debug$F
预编译调试类型(仅对象文件)
.debug$P
调试类型(仅对象文件)
.drective
链接器选项
.edata
导出表
.idata
导入表
.idlsym
包含注册的 SEH(仅镜像)以支持 IDL 属性
.pdata
异常信息
.rdata
只读初始化数据
.reloc
镜像重定位
.rsrc
资源目录
.sbss
GP 相对未初始化数据(自由格式)
.sdata
GP 相对初始化数据(自由格式)
.srdata
GP 相对只读数据(自由格式)
.sxdata
注册异常处理程序数据(自由格式和 x86/仅对象文件)
.text
可执行代码(自由格式)
.tls
线程本地存储(仅对象文件)
.tls$
线程本地存储(仅对象文件)
.vsdata
GP 相对初始化数据(自由格式,仅 ARM、SH4 和 Thumb 架构)
.xdata
异常信息(自由格式)

我们将所有节区的数据放入 JSON 对象中,每个节区包含熵值和大小列表,然后计算平均值。下表总结了这些数据。

类别
节区
平均熵
平均大小
数量
malware
.debug
5.599858881
1,012,552.8
137
goodware
.text
5.99365007
537,000.02
26,145
malware
.text
6.255716132
336,903.23
432,768
goodware
.rdata
4.705207915
226,824.54
23,371
malware
.data
3.280598217
149,298.42
379,834
malware
.rsrc
4.559958375
146,393.03
484,761
malware
.srdata
4.981952522
136,572.06
17
malware
.pdata
4.818058259
54,359.147
4,849
goodware
.rsrc
3.750977196
53,179.795
26,683
malware
.rdata
3.163208936
53,070.413
313,326
goodware
.sdata
3.921923155
37,741.714
14
goodware
.data
2.340989243
30,988.398
21,827
malware
.reloc
4.213806253
27,759.143
168,621
goodware
.pdata
4.402602734
25,858.914
16,340
malware
.xdata
3.217135004
14,411.245
1,411
goodware
.edata
2.842691873
12,260.046
3,294
goodware
.xdata
3.685339784
12,046.871
4,166
goodware
.srdata
4.38643325
11,264
1
goodware
.reloc
3.060418737
9,458.8093
24,658
malware
.vsdata
7.449222236
8,704
6
malware
.sdata
3.220623313
7,756.0462
2,164
malware
.idata
4.63734346
7,036.8053
79,044
goodware
.idata
4.103264093
6,982.353
5,858
malware
.edata
2.25954688
6,845.2301
8,202
malware
.sbss
3.50447763
6,205.594
133
malware
.tls
0.040064223
2,008.0996
64,565
malware
.bss
0.055536247
1,615.1944
30,283
malware
.sxdata
0.065376136
1,122.807
228
goodware
.tls
0.069993845
616.55076
4,285
goodware
.sxdata
0.020393135
512
6
goodware
.debug
4.830524203
155.39474
114
goodware
.bss
0.002617006
46.669959
4,860
malware
.cormeta
0
0
0
malware
.drective
0
0
0
malware
.idlsym
0
0
0

首先,包含可执行代码的 .text 节区在恶意软件中显示出明显更高的平均熵值(6.26 vs 5.99),我们推测这是由于恶意二进制文件中更严重的混淆和/或打包造成的。此外,虽然恶意软件的 .text 节区数量更多,但良性软件的版本平均更大,可能反映了更广泛的合法代码库。

.rsrc 节区在恶意软件中明显更大且更频繁。其在恶意软件中的较高平均熵值(4.56 vs 3.75)暗示了经常被滥用于嵌入混淆或加密的有效载荷。相反,通常用于只读数据的 .rdata 节区则显示出相反的趋势:良性软件具有更高的平均熵值和更大的大小,可能是由于嵌入了更丰富的常量或资源。

良性软件对某些节区的使用极少,而这些节区在恶意软件中完全不存在,例如 .srdata(仅 1 个实例)和 .sxdata,尽管它们的低数量限制了统计解释。

最后,.debug 节区在恶意软件中异常大,尽管很少见,平均大小超过 1MB。这很不寻常,因为调试符号通常在生产二进制文件中被剥离;这可能反映了故意的滥用或错误分类。

总体而言,节区熵值和大小的差异为区分恶意软件和良性软件提供了有用的信号,特别是在考虑打包行为和节区利用模式时。

现在让我们反过来,只查看我们不认识的节区名称,得到以下结果:

类别
节区
出现次数
平均熵
平均大小
Malware
UPX1
102,029
6.3956
258,974.7
Malware
UPX0
101,995
2.1948
92,005.05
Malware
.code
55,950
4.8622
2,850.94
Malware
UPX2
50,166
2.805
854.52
Malware
.imports
42,889
4.0734
2,590.39
Malware
DATA
39,116
4.7043
174,271.7
Malware
CODE
38,718
6.5981
493,990.7
Malware
BSS
38,157
0.0092
185.73
Malware
.bak
34,906
7.0183
6,780.43
Malware
.NewSec
28,482
0.2099
1,613.08
Goodware
.CRT
3,116
0.2378
517.92
Goodware
.buildid
2,328
0.5503
512
Goodware
/4
1,657
1.6041
13,968.92
Goodware
_RDATA
1,059
2.9316
8,441.47
Goodware
.qtmetad
1,016
2.122
519.06
Goodware
.00cfg
880
0.2986
512
Goodware
.gfids
571
0.662
1,149.53
Goodware
/19
305
5.647
147,435.9
Goodware
/45
282
5.2452
31,549.73
Goodware
.didat
275
1.2737
1,967.94

恶意软件样本中普遍存在非标准节区,如 UPX1、UPX0 和 UPX2,这些是 UPX 打包可执行文件的典型特征。UPX1 显示出非常高的熵值(6.40),这与打包文件的特征一致。其他节区如.bak 和.NewSec 表明使用了注入或重命名的节区,其中.bak 显示出异常高的熵值(7.02),进一步暗示了混淆或多态技术的使用。

相比之下,良性软件(goodware)表现出更少且更一致的非标准节区,具有较低的熵值和较小的尺寸,例如.buildid 和.00cfg。这些节区通常用于存储良性元数据或运行时配置。良性软件中有限的变化和低熵值表明了透明性和可预测性,与恶意软件节区的多样性和高熵值形成鲜明对比。总体而言,数据强调了熵值和异常节区命名作为区分恶意二进制文件和合法文件的重要指标。

文件大小

文件大小是另一个值得关注的指标,因为它通常与规避和检测相关。我们观察到有些恶意软件会通过增加文件大小来逃避扫描,而有些则使用极小的可执行文件来减少可扫描内容。让我们对数据集进行分析,看看有什么发现。

类别
总文件数
最小大小
最大大小
平均大小
中位数大小
标准差
恶意软件
613,879
512.00 B
30.00 MB
1.45 MB
688.07 KB
2.41 MB
良性软件
30,261
0.00 B
29.99 MB
757.79 KB
84.39 KB
2.37 MB
类别
大小范围
文件数量
百分比
恶意软件
0-1MB
364,101
59.30%
恶意软件
1-5MB
219,760
35.80%
恶意软件
5-10MB
22,795
3.70%
恶意软件
10-50MB
7,223
1.20%
恶意软件
>50MB
0
0.00%
良性软件
0-1MB
26,119
86.30%
良性软件
1-5MB
3,114
10.30%
良性软件
5-10MB
600
2.00%
良性软件
10-50MB
428
1.40%
良性软件
>50MB
0
0.00%

恶意软件展现出比良性软件更广泛和更大的文件大小分布。虽然 59.3% 的恶意软件样本小于 1MB,但仍有相当一部分(35.8%)在 1-5MB 之间,甚至有些异常值达到 30MB。这表明恶意软件通常采用两种策略:

  1. 最小化载荷:通过减少可扫描内容来规避基于签名的检测
  2. 膨胀技术:通过增加文件大小来超过某些扫描器的阈值限制

相比之下,良性软件绝大多数(86.3%)集中在 1MB 以下,中位数大小仅为 84.39KB。这种一致性反映了结构化软件开发实践和最小的代码膨胀,与恶意软件的多样性形成鲜明对比。有趣的是,两类样本在 50MB 以上的文件都很少见,表明如此大的二进制文件很少被用于良性或恶意目的。然而,防范恶意软件不能简单地通过阻止大于 50MB 的文件来实现。在我们的机器上,我们可以看到许多良性文件(如游戏、安装程序和其他可信文件)远大于这个阈值,这些文件不应该被自动删除。相反,许多被恶意使用的库也超过了最小阈值,这表明单独使用文件大小并不能形成可靠的规则,但可以与其他指标结合使用。

恶意软件较高的标准差(2.41MB vs. 2.37MB)和中位数与平均值的差距(688KB vs. 1.45MB)暗示了右偏分布,这可能是由于包含打包器、资源填充载荷或多阶段投放器的大型文件造成的。相比之下,良性软件的中位数与平均值差距较小,且平均值较低,反映了更严格的控制和更少的异常。

这里有趣的是良性软件和恶意软件在用途上的明显差异。虽然良性软件旨在实现从计算器应用到任务管理器的各种功能,但恶意软件的范围要严格得多,通常试图植入更多恶意软件。这是我们数据集的一个关键限制,我们无法轻易判断样本是勒索软件、投放器还是植入物本身。

总体而言,恶意软件文件大小的可变性突显了其适应性——在隐蔽和过度之间摇摆——而良性软件的趋势显示出一致性,这可以为静态分析管道中的异常检测基线分析提供参考。

熵值

另一个被广泛讨论的指标是熵值,特别是香农熵(Shannon entropy)。它用于测量数据的随机性,在恶意软件中,加密被用来保护攻击者不想让你看到的内容。例如,考虑一个想要执行 shellcode 来投放植入物的可执行文件...该 shellcode 很可能被加密。

以下是文件中熵值的汇总表:

类别
总文件数
最小熵值
最大熵值
平均熵值
中位数熵值
标准差
恶意软件
613879
0.0058
8
6.3702
6.6033
1.3545
良性软件
30261
0
7.9999
6.1045
6.2981
0.7566
类别
熵值范围
文件数量
百分比
恶意软件
0-1
5084
0.80%
恶意软件
1-1.5
1603
0.30%
恶意软件
1.5-2
3828
0.60%
恶意软件
2-2.5
4665
0.80%
恶意软件
2.5-3
5245
0.90%
恶意软件
3-3.5
7069
1.20%
恶意软件
3.5-4
6767
1.10%
恶意软件
4-4.5
16956
2.80%
恶意软件
4.5-5
19947
3.20%
恶意软件
5-5.5
40245
6.60%
恶意软件
5.5-6
68747
11.20%
恶意软件
6-6.5
106131
17.30%
恶意软件
6.5-7
118191
19.30%
恶意软件
7-7.5
90415
14.70%
恶意软件
7.5-8
118986
19.40%
良性软件
0-1
11
0.00%
良性软件
1-1.5
0
0.00%
良性软件
1.5-2
16
0.10%
良性软件
2-2.5
10
0.00%
良性软件
2.5-3
77
0.30%
良性软件
3-3.5
165
0.50%
良性软件
3.5-4
583
1.90%
良性软件
4-4.5
594
2.00%
良性软件
4.5-5
1165
3.80%
良性软件
5-5.5
2161
7.10%
良性软件
5.5-6
4392
14.50%
良性软件
6-6.5
12278
40.60%
良性软件
6.5-7
7350
24.30%
良性软件
7-7.5
1228
4.10%
良性软件
7.5-8
231
0.80%

恶意软件的平均熵值(6.37)通常高于良性软件(6.10),当检查熵值范围的分布时,这种差异变得更加明显。

53.4% 的恶意软件样本落在 6.5 到 8 的熵值范围内,这表明超过一半的数据集使用了某种程度的混淆或加密部分。相比之下,良性软件在 6.0 到 6.5 之间达到峰值(40.6%),在更高的熵值区间急剧下降,只有 5% 的良性软件超过 7.0。

这种模式支持了高熵值可能是恶意行为的强有力指标的假设。然而,单独使用熵值并不是完美的预测指标。例如,一些良性软件(如安装程序、压缩的可执行文件或加密工具)可能自然表现出较高的熵值。良性软件相对较低的标准差(0.7566)与恶意软件(1.3545)相比,也表明良性文件的结构更加一致,不太可能包含大的加密块或随机数据。

导入函数分析

接下来我们分析导入函数。在 Categorising DLL Exports with an LLM 一文中,mez0 使用 LLM 对 MSDN 中的 Windows API 函数进行分类 - 分类映射文件可在此处找到:https://gist.github.com/mez-0/833314d8e920a17aa3ca703eabbfa4a5

以 VirtualAlloc 函数为例,该函数从 Kernel32.dll 导出,分类如下:

DLL
函数
描述
类别
KERNEL32.DLL
VirtualAlloc
在进程的虚拟地址空间中保留和提交内存
内存管理

通过分析导入函数,我们可以了解文件可能执行的操作。需要注意的是,有多种方法可以隐藏这些函数并通过动态获取地址来调用,但这不在我们当前的讨论范围内。以下是 Chrome 中导入函数的示例:

恶意和非恶意二进制文件静态数据解析和分析
Google Chrome 中的函数

对于每个样本,我们可以统计导入函数的调用次数,以了解各个调用的普遍性。通过这种方式,我们可以与良性软件进行交叉参考,找出关键差异。

恶意软件常用函数:

函数
总调用次数
样本数
样本占比
kernel32.dll!ExitProcess
415243
390812
63.66%
kernel32.dll!GetModuleHandleA
370172
304720
49.64%
kernel32.dll!WriteFile
350280
298774
48.67%
kernel32.dll!LoadLibraryA
287964
286013
46.59%
kernel32.dll!ReadFile
306967
265799
43.30%
kernel32.dll!GetModuleFileNameA
289828
254605
41.47%
kernel32.dll!GetTickCount
269169
254307
41.43%
kernel32.dll!VirtualAlloc
282818
250326
40.78%
kernel32.dll!GetStdHandle
283171
246382
40.14%
kernel32.dll!SetFilePointer
280856
243293
39.63%
kernel32.dll!FindClose
263412
237305
38.66%
kernel32.dll!HeapAlloc
225400
225322
36.70%
kernel32.dll!VirtualFree
242081
222411
36.23%
kernel32.dll!WaitForSingleObject
219853
219588
35.77%
kernel32.dll!GetFileSize
232099
217207
35.38%
kernel32.dll!CreateFileA
256095
214049
34.87%
kernel32.dll!FreeLibrary
250137
213455
34.77%
kernel32.dll!WideCharToMultiByte
226000
205958
33.55%
advapi32.dll!RegCloseKey
247615
200498
32.66%
user32.dll!MessageBoxA
230943
197857
32.23%

一个关键观察是,恶意软件样本大量使用与进程和文件操作相关的核心 Windows 内核函数。例如 kernel32.dll!ExitProcess(63.66%)、GetModuleHandleA(49.64%)和 WriteFile(48.67%)是恶意软件样本中最常出现的函数。这表明恶意软件依赖程序化控制执行流程和 I/O 操作。LoadLibraryA 和 GetProcAddress 等函数也值得注意,它们在动态代码加载和函数解析中扮演重要角色——这些是恶意软件用于规避静态分析和实现模块化 payload 交付的常见技术。

良性软件常用函数:

函数
总调用次数
样本数
样本占比
kernel32.dll!GetSystemTimeAsFileTime
15542
15542
51.36%
kernel32.dll!GetCurrentProcessId
15535
15533
51.33%
kernel32.dll!QueryPerformanceCounter
15510
15474
51.14%
kernel32.dll!SetUnhandledExceptionFilter
14942
14942
49.38%
kernel32.dll!UnhandledExceptionFilter
14513
14513
47.96%
kernel32.dll!IsDebuggerPresent
13127
13127
43.38%
kernel32.dll!TerminateProcess
12944
12943
42.77%
kernel32.dll!IsProcessorFeaturePresent
12343
12343
40.79%
kernel32.dll!RtlVirtualUnwind
11648
11648
38.49%
kernel32.dll!RtlCaptureContext
11645
11645
38.48%
kernel32.dll!RtlLookupFunctionEntry
11626
11626
38.42%
kernel32.dll!InitializeSListHead
10920
10920
36.09%
kernel32.dll!GetModuleHandleW
10976
10861
35.89%
kernel32.dll!DeleteCriticalSection
10770
10715
35.41%
vcruntime140.dll!memset
9280
9280
30.67%
vcruntime140.dll!__C_specific_handler
8552
8552
28.26%
vcruntime140.dll!__std_type_info_destroy_list
7445
7445
24.60%
kernel32.dll!DisableThreadLibraryCalls
7265
7265
24.01%
kernel32.dll!TlsGetValue
6874
6874
22.72%
vcruntime140.dll!memcpy
6498
6498
21.47%

相比之下,良性软件样本更频繁地调用系统自省和诊断函数,包括 GetSystemTimeAsFileTime(51.36%)和 QueryPerformanceCounter(51.14%)。这些函数通常用于性能监控、日志记录和异常处理——这是合法软件的预期行为。SetUnhandledExceptionFilter 和 RtlVirtualUnwind 等异常相关函数的频繁出现进一步支持了良性软件倾向于包含健壮的错误处理机制的观点,这可能是由于更高的开发标准和测试要求。

函数
恶意软件调用次数
恶意软件样本数
良性软件调用次数
良性软件样本数
kernel32.dll!CloseHandle
377592
323275
9086
8979
kernel32.dll!EnterCriticalSection
265071
235059
10770
10714
kernel32.dll!GetCurrentProcess
269276
268920
13416
13416
kernel32.dll!GetCurrentThreadId
291135
258604
15791
15697
kernel32.dll!GetLastError
369351
316088
10381
10282
kernel32.dll!GetProcAddress
401545
358065
11004
10874
kernel32.dll!InitializeCriticalSection
218748
188769
6433
6378
kernel32.dll!LeaveCriticalSection
265558
235556
10796
10740
kernel32.dll!MultiByteToWideChar
232035
212398
6689
6608
kernel32.dll!Sleep
268710
234973
8164
8041

共享函数集,如 CloseHandle、GetLastError 和 Sleep,在恶意软件和良性软件中都有出现,但在恶意软件中的调用频率和数量明显更高。这反映了这些 API 的通用性;它们对良性和恶意应用程序都是必不可少的。然而,使用频率的差异可能反映了不同的操作强度或结构设计。例如,恶意软件中 GetProcAddress 的调用次数(401,545 次)与良性软件(11,004 次)的显著差异强化了动态行为是恶意代码特征的观点。

总体而言,数据表明虽然某些 API 的使用在良性软件和恶意软件中不可避免且存在重叠,但在这些函数的使用方式上存在明显差异。恶意软件倾向于利用有助于代码注入、持久化和隐蔽性的 API,而良性软件则倾向于使用与可靠性和诊断相关的 API。这支持了将 API 调用分析作为恶意软件检测和行为分类的可行特征,前提是它考虑了上下文使用情况,而不仅仅是存在或频率。

清单文件分析

清单文件 (Manifest) 包含文件描述、商标等信息,可以在任何文件的"详细信息"选项卡中查看:

恶意和非恶意二进制文件静态数据解析和分析

从数据集来看,39.44% 的恶意软件样本 (242,122/613,879) 包含清单文件,而良性软件的比例为 78.94%(23,888/30,261)。这种现象可以理解...由合法公司提供的软件通常会填写这些信息,为什么不呢?而对于恶意软件来说,传统上没有这个必要——除非试图伪装成正常软件。

字段
恶意软件总数
良性软件总数
恶意软件覆盖率
良性软件覆盖率
assembly_version
16,317
4,246
2.66%
14.18%
comments
55,394
4,419
9.02%
14.61%
company_name
182,491
23,019
29.71%
76.05%
file_version
237,630
23,791
38.71%
78.60%
internal_name
176,546
19,107
28.75%
63.15%
legal_copyright
161,832
23,135
26.37%
76.45%
legal_trademarks
27,441
1,577
4.47%
5.21%
original_file_name
40
22
0.01%
0.07%
product_name
192,966
23,318
31.43%
77.08%
product_version
220,469
23,608
35.91%
78.03%

良性软件在元数据完整性方面表现更为突出,file_version、product_version、product_name 和 company_name 等字段在超过 75% 的样本中出现。相比之下,这些字段在恶意软件样本中仅出现在 26-39% 的样本中。这种差异可能反映了合法软件开发者的优先级,他们通常需要遵守合规性、版本控制和品牌要求——这些因素在恶意软件开发实践中基本不存在。此外,original_file_name 等字段在两组数据中几乎不存在(恶意软件 0.01%,良性软件 0.07%),表明某些元数据属性的诊断价值有限。有趣的是,虽然 comments 和 assembly_version 等字段在少数良性软件样本中存在,但它们在恶意软件中的出现率更低(2-9%),这意味着攻击者倾向于省略非功能性的描述性元数据,可能是为了减少文件大小或避免暴露开发痕迹。这种元数据使用上的差异可能为自动化恶意软件分类提供可行的启发式方法,但需要注意对抗性适应,即恶意软件作者可能伪造或模仿良性软件元数据以逃避检测。

bce48fd0850969f93da9e85a0c65f74b10d85aee68fdf6fe0e65d881f52f69ad 被发现包含清单文件,如果我们将其转储,可以看到其内容:

恶意和非恶意二进制文件静态数据解析和分析

或者,我们可以查看 70bc155082505cdc0ec08428b39fe03212ff06653549f36cd8a9577202fc20a5 来了解它应该如何编写:

恶意和非恶意二进制文件静态数据解析和分析

虽然这看起来很明显,但这类数据可能还是应该填写。虽然它不能确保植入成功,但至少减少了一个可疑点。因此,总的来说,添加这些信息基本上不需要什么努力,但很值得。

工具链分析

在完成上述分析后,我们不得不提到工具链。这包括:

  • 链接器 (linker)
  • 编译器 (compiler)
  • 打包器 (packers)

根据我们的经验,填充这些信息的最佳方法是使用 Detect-it-Easy。启动它并指向一个样本,我们可以看到大量信息。

恶意和非恶意二进制文件静态数据解析和分析

elastic 还提供了一个 python 绑定。然而,它在处理样本数量时花费了惊人的时间,最终卡住了。我们尝试在 python 函数中引入超时包装器,但它仍然很慢。于是,我们构建了一个.NET 应用程序来异步解析所有样本——这工作得很好,解析所有样本花了 3 个小时。从 CLI 执行此操作的主要命令是:

diec.exe E:datasetmalware ------heuristicscan
恶意和非恶意二进制文件静态数据解析和分析
Screenshot showing the output of Detect It Easy's heuristic scan, highlighting several files from the dataset.
The output from the .NET wrapper:DIEC Scan Summary - 09/06/2025 01:48:39==================================================Total files: 616,524Successful: 118,415Failed: 498,109Success rate: 19.2%Top error types:Process timeout: 498,109 files

让我们分析链接器 (linker)、编译器 (compiler)、打包器 (packer) 和保护器 (protector) 的数据。

链接器 (Linker)

通过数据分析,我们识别出 107,234 个样本的链接器信息,占收集样本的 17.46%。以下是完整数据:

工具
恶意软件数量
良性软件数量
总数
恶意软件占比
良性软件占比
Microsoft Linker
85,740
18,653
104,393
82.13%
17.87%
Turbo Linker
8,780
156
8,936
98.25%
1.75%
Polink
7,468
0
7,468
100.00%
0.00%
GNU Linker ld (GNU Binutils)
2,228
3,511
5,739
38.82%
61.18%
LCC Linker
2,401
6
2,407
99.75%
0.25%
Watcom Linker
536
1
537
99.81%
0.19%
GoLink
80
0
80
100.00%
0.00%
PowerBASIC Linker
0
8
8
0.00%
100.00%
Borland TLINK
0
6
6
0.00%
100.00%
TCC Linker
1
0
1
100.00%
0.00%

Microsoft Linker 在两类软件中都很普遍。这很合理,因为 Visual Studio IDE 易于使用,大多数软件都会使用它来构建。Turbo Linker、Polink、LCC Linker、Watcom Linker、GoLink 和 TCC Linker 几乎完全与恶意软件相关(98.25%-100%),表明这些工具要么是利基产品,要么特别受恶意软件开发者青睐,可能是因为它们的灵活性或隐蔽性。相反,PowerBASIC 和 Borland TLINK 仅用于良性软件(100%),表明它们要么已经过时,要么受到严格控制,限制了它们在恶意环境中的使用。GNU Linker 在良性软件中的占比更高(61.18%),而在恶意软件中占比较低(38.82%),这可能是因为它易于获取、自动化,并且在许多 GitHub 项目中常见。

编译器 (Compiler)

在编译器方面,我们看到了更多的多样性。

工具
恶意软件数量
良性软件数量
总数
恶意软件占比
良性软件占比
Microsoft Visual C/C++
56,642
13,276
69,918
81.01%
18.99%
Visual Basic
9,384
7
9,391
99.93%
0.07%
Borland Delphi
8,503
78
8,581
99.09%
0.91%
PureBasic
7,269
277
7,546
96.33%
3.67%
MASM
4,187
0
4,187
100.00%
0.00%
Microsoft Visual Basic
3,776
0
3,776
100.00%
0.00%
MinGW
2,217
1,422
3,639
60.92%
39.08%
VB.NET
2,492
62
2,554
97.57%
2.43%
FASM
1,442
0
1,442
100.00%
0.00%
Watcom C/C++
536
1
537
99.81%
0.19%
Embarcadero Delphi
304
35
339
89.68%
10.32%
Borland C++
273
40
313
87.22%
12.78%
LCC-Win32
258
0
258
100.00%
0.00%
Free Pascal
117
6
123
95.12%
4.88%
Borland C/C++
0
5
5
0.00%
100.00%
Virtual Pascal
3
0
3
100.00%
0.00%
Rust
0
2
2
0.00%
100.00%
Go
2
0
2
100.00%
0.00%
JScript
1
1
2
50.00%
50.00%
Visual Objects
1
0
1
100.00%
0.00%
Intel C/C++ Compiler
1
0
1
100.00%
0.00%
Tiny C
1
0
1
100.00%
0.00%

Microsoft Visual C/C++ 在两类软件中都很普遍(恶意软件 81.01%,良性软件 18.99%)。这再次表明它的广泛采用,使其成为开发者的常见选择。MASM、Microsoft Visual Basic、FASM、LCC-Win32、Virtual Pascal、Visual Objects、Intel C/C++ Compiler、Tiny C 和 Go 几乎完全用于恶意软件(100% 或接近 100%)。然而,这可能是数据集的问题,也可能反映了样本的年代。同样的情况也出现在 Visual Basic(99.93% 恶意软件)和 Borland Delphi(99.09% 恶意软件)中。MinGW(60.92% 恶意软件,39.08% 良性软件)通常用于开源工具,因此这一结果并不令人意外。

打包器 (Packer)

打包器用于通过加密和/或压缩文件来保护其他文件。执行时,原始文件会完全或部分解密/解压缩并加载到内存中。以下是我们收集的数据:

工具
恶意软件数量
良性软件数量
总数
恶意软件占比
良性软件占比
UPX
11,758
16
11,774
99.86%
0.14%
Petite
2,562
41
2,603
98.42%
1.58%
MPRESS
2,031
1
2,032
99.95%
0.05%
DxPack
1,632
0
1,632
100.00%
0.00%
NeoLite
923
0
923
100.00%
0.00%
PECompact
820
1
821
99.88%
0.12%
ASPack
741
2
743
99.73%
0.27%
(Win)Upack
182
0
182
100.00%
0.00%
MEW
78
0
78
100.00%
0.00%
kkrunchy
78
0
78
100.00%
0.00%
NsPacK
36
0
36
100.00%
0.00%
Packman
32
0
32
100.00%
0.00%
FSG
21
0
21
100.00%
0.00%
py2exe
3
11
14
21.43%
78.57%
.NETZ
9
0
9
100.00%
0.00%
Bat To Exe Converter
9
0
9
100.00%
0.00%
BeRo
9
0
9
100.00%
0.00%
Exe32Pack
3
0
3
100.00%
0.00%
PE-PACK
3
0
3
100.00%
0.00%
MoleBox
3
0
3
100.00%
0.00%
CExe
2
0
2
100.00%
0.00%
WWPACK
2
0
2
100.00%
0.00%
PyInstaller
1
0
1
100.00%
0.00%
AHpacker
1
0
1
100.00%
0.00%
Pack Master
1
0
1
100.00%
0.00%
XPACK
1
0
1
100.00%
0.00%
RLPack
1
0
1
100.00%
0.00%
NakedPacker
1
0
1
100.00%
0.00%

值得注意的是,这些工具几乎 100% 用于恶意软件。UPX(11,774 个样本,99.86% 恶意软件)、Petite(2,603 个样本,98.42% 恶意软件)和 MPRESS(2,032 个样本,99.95% 恶意软件)在样本数量上占主导地位。尽管合法开发者希望保护他们的作品,但恶意软件作者在试图植入恶意程序或勒索软件时更有动力这样做。

此外,py2exe 以 78.57% 的良性软件比例(14 个样本中的 11 个)脱颖而出,表明其在合法的 Python 软件开发中的使用,尽管样本量较小限制了更广泛的结论。这是合理的,因为 Python 代码易于阅读和理解,py2exe 虽然不是直接的打包器,但具有相同的影响。其他工具,如 DxPack(1,632 个样本)和 NeoLite(923 个样本),报告了 100% 的恶意软件,但较小的样本量(例如 PyInstaller,1 个样本)降低了这些百分比的可信度。

值得注意的是,我们这里的数据集存在局限性。获取恶意软件比获取良性软件容易得多,因此样本量可能不够全面。

保护器 (Protector)

如果将打包器视为打包和保护文件的工具,那么保护器旨在混淆二进制文件本身。以 VMProtect 为例,它提供以下功能列表:

  • 混淆方法
  • 变异
  • 虚拟化
  • 超级(变异 - 虚拟化)
  • 保护选项
  • 内存保护
  • 导入保护
  • 资源保护
  • 打包
  • 调试器检测
  • 虚拟工具检测
  • 附加功能
  • 控制台版本
  • 水印
  • 脚本语言
  • 许可系统
  • 激活系统
  • 虚拟文件

直接引用:

保护您的代码免受逆向工程、分析和破解。利用代码虚拟化的优势,在嵌入受保护应用程序的多个虚拟机上执行虚拟化的代码片段。

以下是我们分析结果。

工具
恶意软件数量
良性软件数量
总数
恶意软件占比
良性软件占比
VMProtect
616
3
619
99.52%
0.48%
.NET Reactor
152
29
181
83.98%
16.02%
Confuser
156
0
156
100.00%
0.00%
SoftSentry
151
0
151
100.00%
0.00%
DotFix NiceProtect
96
0
96
100.00%
0.00%
ENIGMA
69
0
69
100.00%
0.00%
Smart Assembly
57
10
67
85.07%
14.93%
Themida/Winlicense
64
0
64
100.00%
0.00%
Armadillo
63
0
63
100.00%
0.00%
tElock
62
0
62
100.00%
0.00%
Crypto Obfuscator
43
3
46
93.48%
6.52%
Ste@lth PE
46
0
46
100.00%
0.00%
Thinstall(VMware ThinApp)
37
0
37
100.00%
0.00%
Fish PE
32
0
32
100.00%
0.00%
ASProtect
29
0
29
100.00%
0.00%
NTkrnl Protector
24
0
24
100.00%
0.00%
Eazfuscator
22
0
22
100.00%
0.00%
Sixxpack
21
0
21
100.00%
0.00%
Babel .NET
19
0
19
100.00%
0.00%
Vbs To Exe
17
0
17
100.00%
0.00%
Dotfuscator
12
1
13
92.31%
7.69%
Enigma
12
0
12
100.00%
0.00%
Phoenix
11
0
11
100.00%
0.00%
Obfuscar
10
0
10
100.00%
0.00%
ByteGuard
10
0
10
100.00%
0.00%
Agile
8
0
8
100.00%
0.00%
Zprotect
8
0
8
100.00%
0.00%
PELock
7
0
7
100.00%
0.00%
eXPressor
7
0
7
100.00%
0.00%
Obsidium
6
0
6
100.00%
0.00%
StarForce
6
0
6
100.00%
0.00%
ARM Protector
5
0
5
100.00%
0.00%
ACProtect
5
0
5
100.00%
0.00%
North Star PE Shrinker
4
0
4
100.00%
0.00%
Safengine Shielden
4
0
4
100.00%
0.00%
SVK Protector
4
0
4
100.00%
0.00%
KoiVM
2
0
2
100.00%
0.00%
Yoda's Protector
2
0
2
100.00%
0.00%
Break Into Pattern
2
0
2
100.00%
0.00%
DNGuard
2
0
2
100.00%
0.00%
PEBundle
2
0
2
100.00%
0.00%
.BJFnt
2
0
2
100.00%
0.00%
PC Guard
2
0
2
100.00%
0.00%
Yano
2
0
2
100.00%
0.00%
CodeWall
2
0
2
100.00%
0.00%
PELOCKnt
1
0
1
100.00%
0.00%
Skater
1
0
1
100.00%
0.00%
PECRYPT32
1
0
1
100.00%
0.00%
ExeStealth
1
0
1
100.00%
0.00%
DeepSea
1
0
1
100.00%
0.00%
Ding Boys PE-lock Phantasm
1
0
1
100.00%
0.00%
AssemblyInvoke
1
0
1
100.00%
0.00%
Shrinker
1
0
1
100.00%
0.00%
ConfuserEx
1
0
1
100.00%
0.00%
MSLRH
1
0
1
100.00%
0.00%
HyperTech Crackproof
1
0
1
100.00%
0.00%

VMProtect(619 个样本,99.52% 恶意软件)在样本量上领先,其次是 .NET Reactor(181 个样本,83.98% 恶意软件)和 Confuser(156 个样本,100% 恶意软件)。只有五个工具——VMProtect(0.48% 良性软件)、.NET Reactor(16.02%)、Smart Assembly(14.93%)、Crypto Obfuscator(6.52%)和 Dotfuscator(7.69%)——报告了任何良性软件,但它们的良性软件比例较低,且样本量差异显著。

与打包器类似,我们在这里看到了大量的恶意软件使用。.NET Reactor 和 Smart Assembly 具有显著的良性软件比例,表明它们可能在某些 .NET 开发中的合法使用,但其恶意软件主导地位(83.98% 和 85.07%)仍然令人担忧。像 Confuser 和 SoftSentry 这样的工具,具有中等样本量和 100% 的恶意软件,是安全监控的高风险候选者。

代码签名 (Code Signing)

为了验证文件的合法性,我们使用代码签名技术。我们可以通过微软在 Windows 中包含的默认文件看到这一点 - 以 NTDLL.DLL 为例:

恶意和非恶意二进制文件静态数据解析和分析

LolCerts 项目旨在追踪泄露的证书,例如 MSI 证书事件:MSI 数据泄露:私有代码签名密钥在暗网泄露

通过为恶意软件进行代码签名,攻击者希望供应商能够允许该二进制文件运行。在撰写本文时,我们试图找到一些官方文档来证明代码签名证书对规避检测有积极影响,但我们只能参考"这对我们有效"的经验。以下是我们解析的所有 CA 的统计:

CA 名称
数量
COMODO RSA Code Signing CA
804
COMODO RSA Certification Authority
557
Symantec Time Stamping Services CA - G2
264
Symantec Time Stamping Services Signer - G4
264
AddTrust External CA Root
248
COMODO SHA-1 Time Stamping Signer
227
GlobalSign CodeSigning CA - SHA256 - G3
176
VeriSign Class 3 Code Signing 2010 CA
164
Symantec Class 3 SHA256 Code Signing CA
159
VeriSign Time Stamping Services CA
156
Microsoft Root Authority
150
Freemium GmbH
132
Cloud Installer
130
WoSign Time Stamping Signer
125
Qihoo 360 Software (Beijing) Company Limited
121
Microsoft Timestamping Service
108
VeriSign Class 3 Code Signing 2004 CA
106
Dummy certificate
106
APPSET
100
VeriSign Time Stamping Services Signer
96
thawte SHA256 Code Signing CA
96
Adobe Systems
95
freemium GmbH
91
thawte Primary Root CA
89
VeriSign Class 3 Public Primary Certification Authority - G5
81
Microsoft Timestamping PCA
77
Microsoft Corporation
76
Microsoft Code Signing PCA
70
SpringTech Ltd
69
COMODO Code Signing CA 2
64
Thawte Code Signing CA - G2
60
VeriSign Time Stamping Services Signer - G2
50
UTN-USERFirst-Object
48
PC Utilities Software Limited
44
GlobalSign Timestamping CA - G2
41

虽然这些数据很有趣,但更多是作为参考信息。以下是关键发现:在 613,879 个恶意软件样本中,我们发现 568,456 个(92.61%)样本未签名,45,423 个(7.39%)样本已签名。相反,在 30,261 个良性软件样本中,9,490 个(31.36%)未签名,20,771 个(68.64%)已签名。因此,良性软件往往经常签名,而恶意软件则相反。我们无法明确证明签名会产生影响或成为融入系统的唯一原因,但它确实有助于二进制文件更好地融入。然而,获取代码签名证书很困难;虽然 ADCS 可以颁发证书,但我们没有看到任何研究表明使用内部 ADCS 代码签名证书签名文件的影响,而受损证书和已知问题显然不是一个好的选择。值得注意的是,即使是合法服务也使用商业可用的开发者证书,这增加了真实性,并进一步使二进制文件远离恶意软件的外观。

类型
颁发者
数量
序列号
malware
CN=COMODO RSA Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
17233
61791086908916947884024501610337875119
malware
CN=COMODO RSA Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
6232
101909084537582093308941363524873193117
malware
CN=AddTrust External CA Root,OU=AddTrust External TTP Network,O=AddTrust AB,C=SE
5945
52374340215108295845375962883522092578
malware
CN=AddTrust External CA Root,OU=AddTrust External TTP Network,O=AddTrust AB,C=SE
5494
1
malware
CN=Symantec Time Stamping Services CA - G2,O=Symantec Corporation,C=US
5342
19688950797630895426199952712430983760
malware
CN=Thawte Timestamping CA,OU=Thawte Certification,O=Thawte,L=Durbanville,ST=Western Cape,C=ZA
5325
168250781398245547403531165097821404219
malware
CN=UTN-USERFirst-Object,OU=http://www.usertrust.com,O=The USERTRUST Network,L=Salt Lake City,ST=UT,C=US
4127
117007971038687812527568897756771083
malware
CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R3
3993
1462505465907667685259976282102477
malware
CN=Microsoft Root Authority,OU=Microsoft Corporation,OU=Copyright (c) 1997 Microsoft Corp.
3481
3914548144742538765706922673626944
malware
CN=Thawte Timestamping CA,OU=Thawte Certification,O=Thawte,L=Durbanville,ST=Western Cape,C=ZA
3410
95367435335131489231313444090147582372
malware
CN=VeriSign Class 3 Public Primary Certification Authority - G5,OU=(c) 2006 VeriSign, Inc. - For authorized use only,OU=VeriSign Trust Network,O=VeriSign, Inc.,C=US
3270
81710363848389238104995526639509734954
malware
CN=COMODO RSA Code Signing CA,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
2934
96929902786164039751057176698743692889
malware
CN=VeriSign Class 3 Public Primary Certification Authority - G5,OU=(c) 2006 VeriSign, Inc. - For authorized use only,OU=VeriSign Trust Network,O=VeriSign, Inc.,C=US
2743
109001353806506068745144901449045193671
malware
CN=GlobalSign CodeSigning CA - SHA256 - G3,O=GlobalSign nv-sa,C=BE
2637
8240380941626947394907749311
malware
CN=Certification Authority of WoSign,O=WoSign CA Limited,C=CN
2407
49344295393511144818278722224547446860
malware
CN=Root Agency
2307
160647940116102772061935198811329157007
malware
CN=Microsoft Timestamping PCA,O=Microsoft Corporation,L=Redmond,ST=Washington,C=US
2298
458441701260288556269574
malware
OU=Class 3 Public Primary Certification Authority,O=VeriSign, Inc.,C=US
2284
87155975386774669517273893148021257666
malware
CN=VeriSign Time Stamping Services CA,O=VeriSign, Inc.,C=US
2231
18490660337486627817154717305594869384
malware
CN=Unknown issuer
2216
1
goodware
CN=DigiCert Trusted Root G4,OU=www.digicert.com,O=DigiCert Inc,C=US
7473
11533403529598586876501374841704918745
goodware
CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
4383
5364131601516814570659357524942475272
goodware
CN=DigiCert Trusted Root G4,OU=www.digicert.com,O=DigiCert Inc,C=US
3290
9586110043380832440035821245782711899

结论

获取这个数据集(包括良性软件和恶意软件)相当费时,但我们尽力而为,并且仍在寻求获取更多数据。两者中,恶意软件比良性软件更容易获得,且从许可角度来看,分发问题较少,但同样可能会根据状态和来源进行一些修改。

我们最初的主要结论是:如果你表现得像一个合法的开发者,那么你看起来也会像一个合法的开发者。

这两个数据点之间的关键差异构成了一个有趣的对比。然而,我们注意到,要让一个二进制文件最好地融入环境,虽然听起来很明显,但需要像开发者一样进行开发。使用 Visual Studio 等工具并配备所有正确资源构建和设置的恶意软件,看起来会更加真实可信。尝试融入恶意软件和良性软件之间的灰色地带是更可取的。如果任何检测逻辑纯粹基于"如果没有 manifest"这样的规则,那么这种规则理应被打破,希望编写这种低质量逻辑的厂商能够从中吸取教训。与我们所有的博客一样,我们不想直接告诉你构建更好恶意软件的确定方法,如果你从头到尾阅读了这篇博客并且有能力,你就会知道需要改进什么。

原文始发于微信公众号(securitainment):恶意和非恶意二进制文件静态数据解析和分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月24日00:15:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   恶意和非恶意二进制文件静态数据解析和分析https://cn-sec.com/archives/4195210.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息