当前位置: 首页 > news >正文

【恶意软件检测论文】通过提取 API 语义来实现的一个新颖的安卓恶意软件检测方法

目录

  • 摘要
  • 1. 引言
  • 2. 相关工作
    • 2.1. 基于重新训练的恶意软件检测
    • 2.2. 基于应用关系图的恶意软件检测
    • 2.3. 基于异常样本识别的恶意软件检测
    • 2.4. 基于API聚类的恶意软件检测
  • 3. AMDASE概述
  • 4. 基于语义距离的API聚类
    • 4.1. API特征提取
    • 4.2. API句子生成
    • 4.3. API句子编码
    • 4.4.聚类中心生成
  • 5. Android malware detection
    • 5.1.调用图提取
    • 5.2.调用图优化
      • 5.2.1.未知功能引起的问题
      • 5.2.2.调用图优化算法
    • 5.3. Feature embedding
    • 5.4.分类
  • 6 实验与分析
    • 6.1.实验设置
    • 6.2.恶意软件检测性能
    • 6.3.不断发展的恶意软件检测性能
    • 6.4. API 聚类中方法名称的影响
    • 6.6 运行时评估
    • 6.7 API聚类在语义提取上的能力
  • 8. 讨论
        • API句子的规则
        • API聚类
        • 混淆技术
        • 深度学习分类器
        • 运行时间
  • 9. 结论

![[202402.通过提取 API 语义来实现的一个新颖的安卓恶意软件检测方法_image.png]]

[[A novel Android malware detection method with API semantics extraction_2024_Yang et al.pdf]]

AnovelAndroid malware detection method with API semantics extraction
一个新颖的安卓恶意软件检测方法,通过提取 API 语义来实现。

关键词:进化恶意软件检测、模型老化、API语义、函数调用图、机器学习。

摘要

由于Android框架和恶意软件的持续进化,使用过时应用程序训练的传统恶意软件检测方法在有效识别复杂的进化恶意软件方面已不足够。为了解决这个问题,本文提出了一种新颖的安卓恶意软件检测方法,名为API语义提取的安卓恶意软件检测方法(AMDASE),它可以有效识别进化的恶意软件实例。首先,AMDASE 执行API聚类以获取代表API功能的聚类中心,然后在恶意软件检测之前设计API句子来总结API特征,并使用自然语言处理(NLP)工具获取API句子的嵌入,用于聚类。借助API句子,可以有效地提取包含在诸如方法名称这样的特征中的API语义,这些特征准确地代表了其预期功能,这也使得聚类结果更加准确。其次,AMDASE 从每个应用中提取调用图,并通过移除与未知功能对应的节点来优化调用图,同时确保保留它们的前驱节点和后继节点之间的连通性。优化后的调用图可以提取更健壮的API上下文信息,准确地代表每个应用的行为。第三,为了保持对Android恶意软件进化的抵抗力,AMDASE 从优化的调用图中提取函数调用对,并将函数调用对中的API抽象为API聚类中获得的聚类中心。最后,使用一键映射生成特征向量,并使用机器学习分类器进行恶意软件检测。我们在一个包含42,154个良性和42,450个恶意应用的数据集上评估AMDASE,这些应用是在七年的时间里开发的。实验结果表明,AMDASE 的性能大大超过了现有的最先进方法,并且具有显著较慢的老化速度。

1. 引言

Android平台的广泛普及推动了Android恶意软件的快速扩张。尽管机器学习技术在恶意软件检测方面取得了优异的成果(Qiu等,2020年),但恶意软件的持续进化仍然对检测系统构成了巨大挑战(Jordaney等,2017年)。使用过时应用程序训练的分类器难以有效检测出一段时间后出现的新应用,导致检测性能随时间持续下降,这也被称为模型老化。模型老化是由概念漂移引起的,与计算机视觉或自然语言处理(NLP)不同,恶意软件检测的问题域频繁变化,导致新出现的恶意软件与旧恶意软件之间的特征分布存在差异。恶意软件开发者常通过改变实现方式来逃避检测系统,以保持恶意行为(张等,2020年)。具体来说,进化的恶意软件拥有大量未出现在训练集中的API。目前,大多数恶意软件检测方法都基于API调用信息。基于API频率信息的检测方法(杨等,2014年;Arp等,2014年;冯等,2020年)显示出高误报率,并容易受到恶意攻击。依赖API上下文信息的检测方法(吴等,2019年;艾伦等,2018年)在识别应用程序表现出的恶意行为方面提高了准确性。然而,由于缺乏适当的方法处理调用图中大量未知功能节点,这种方法在有效提取API上下文信息方面面临挑战。此外,这些现有的检测方法未能考虑API的频繁变化,因此在有效识别进化的恶意软件方面面临挑战。API聚类将具有相似功能的API分组到同一类别中。在恶意软件检测过程中,可以用API聚类中心替换特征向量中的API,以增强分类器识别训练阶段未遇到的API的能力。这种方法有可能减缓分类器性能随时间衰减的速度(张等,2020年)。然而,现有的API聚类方法从包名、参数和返回值等特征中提取API语义,而忽略了方法名和权限等关键特征。通过API聚类提升分类器性能的限度可以归因于API语义提取的不足。Mariconti等(2016年)提出了MAMADROID,其中他们采用了一种聚类技术,根据包名对API进行分组。MAMADROID通过将新引入的API抽象为包,显示出对现有包中API的弹性。然而,需要注意的是,同一包中的API不一定表现出相似的功能。此外,MAMADROID无法从新包中捕获任何API信息。Pendlebury等(2019年)发现,在消除时间偏差的实验设置下,MAMADROID的F1-测量值在仅三个月后从90%以上下降到58%。为了解决现有恶意软件检测方法中的上述缺陷,我们提出了一种新颖的Android恶意软件检测方法,即API语义提取的Android恶意软件检测方法(AMDASE),该方法可以有效检测进化的恶意软件。首先,我们进行API聚类,以获得代表API功能的聚类中心。我们设计API句子来总结API特征,并使用NLP工具获取API句子的嵌入,用于聚类。其次,我们从每个应用中提取调用图,并通过移除未知功能节点的同时保留其前驱节点和后继节点之间的连接来优化调用图。第三,我们从优化的调用图中提取函数调用对,并将调用对中的API抽象为API聚类部分获得的聚类中心。最后,使用一键编码生成特征向量,并使用机器学习分类器进行恶意软件检测。我们在一个包含42,154个良性应用和42,450个恶意应用的数据集上评估AMDASE的检测性能,这些应用是在七年的时间里开发的。AMDASE在2012年到2013年的数据上训练,当检测2014年到2018年的样本时,平均F1-测量值达到82.6%。平均F1-测量值比最先进的恶意软件检测方法MAMADROID高出22%。我们的实验结果表明,AMDASE的性能大大超过了现有的检测方法,并且老化速度明显较慢。本文主要做出三个贡献:首先,我们提出了一种基于语义距离的API聚类方法。我们设计API句子来总结API的特征。API句子不仅包含重要的特征,如概述API功能的方法名,还将具有不一致特征数量的API统一映射到固定大小的特征向量中。借助API句子,可以有效地提取API的语义,这使得API聚类结果更加准确。其次,我们引入了一种调用图优化方法。这种方法在保持其前驱节点和后继节点之间的连接的同时,移除了所有未知节点。如果调用图中任意两个API节点(例如,APIx和APIy)之间存在由所有未知功能节点组成的路径,则在优化的调用图中,APIx直接调用APIy。调用图优化使得提取的API上下文信息能更精确地反映应用的行为模式。最后,我们介绍了AMDASE,这是一种新颖的Android恶意软件检测方法,可以有效识别进化的恶意软件,无需任何类型的重新训练。通过将API抽象为聚类中心,AMDASE对Android框架和恶意软件中的API变化具有弹性。

2. 相关工作

机器学习在Android恶意软件检测方面取得了显著进展(Wu等,2023年;Bhat等,2023年;Tarwireyi等,2023年;Yang等,2015年;Zhang等,2014年;Yang等,2014年;Karbab等,2018年;Chen等,2018年;Feng等,2020年;Wang等,2019年,2018年;Liu等,2019年;Lu等,2021b年)。然而,模型老化的问题始终是一个重大挑战。Pendlebury等(2019年)和Jordaney等(2017年)详细说明了概念漂移在Android恶意软件检测中的普遍性。研究人员提出了许多解决方案来应对这一问题,主要可以分为四类:重新训练、应用关系图、异常样本识别和API聚类。

2.1. 基于重新训练的恶意软件检测

“重新训练”一词涉及到利用概念漂移样本及其相应标签重新训练分类器的过程。根据标签的不同来源,重新训练的过程可以分为两种类型:真实标签重新训练和伪标签重新训练。真实标签来自恶意软件专家的手动标注。而“伪标签”指的是由恶意软件分类器生成的推断类标签,通常以其预测的高置信度为特征。Grosse等(2017年)提出了一种自适应且可扩展的Android恶意软件检测方法DroidOL。DroidOL系统利用调用图提取应用的敏感行为特征,并在检测过程中利用误分类样本及其相应的真实标签更新分类器。因此,DroidOL能够适应Android应用的进展。Xu等(2019年)提出了一种基于在线学习的恶意软件检测方法DroidEvolver。DroidEvolver认为,用不同优化器训练的分类器具有不同的老化速度,因此在训练阶段构建了一个由五个线性在线学习算法组成的模型池。在检测阶段,使用其他未老化模型的预测结果更新老化模型。基于重新训练的检测方法通常有以下缺陷:重新训练真实标签需要大量高质量的概念漂移样本,这在有限的时间内难以完成。此外,重新训练真实标签还需要大量人力资源进行概念漂移样本的手动标注。伪标签重新训练免除了人力资源手动标注样本的需要,但伴随着两个固有的限制。首先,一旦预测标签错误,将导致分类器性能急剧下降。另一个缺点是,恶意攻击者可以设计特定样本来利用伪标签重新训练的机制。

2.2. 基于应用关系图的恶意软件检测

应用关系图指的是构建一个以每个应用为主节点的实体关系图,以反映不同应用之间的相似性。Android生态系统经历的是逐渐的进化过程,而不是突变,导致进化的恶意软件保留了与其祖先相似的显著特征。一旦概念漂移应用被误分类,分类器可能会使用该应用与其祖先节点在应用关系图中的相似性,将其拉回到决策边界。Gu和Li(2021年)提出了一种缓解Android恶意软件检测中模型老化的方法。它构建了一个应用关系图来反映应用之间的进化关系,这个图辅助分类器进行恶意软件检测。Hei等(2021年)提出了一种基于异构图注意网络的Android恶意软件检测方法。在训练阶段,构建了一个应用关系图来模拟应用之间的相似性。然后,使用图神经网络学习应用之间的相似性并生成用于恶意软件检测的特征向量。在检测阶段,设计了一种增量聚合方法MsGAT++,使得无需更新整个应用关系图即可快速生成特征向量。基于应用关系图的检测方法通常有以下缺陷:首先,代码重用是软件开发的重要部分,因为它允许开发者将现有代码用于各种目的。然而,值得注意的是,代码重用的做法不仅限于良性应用,恶意行为者也可能在恶意软件开发中使用来自良性应用的重用代码。这给利用应用之间的相似性的恶意软件检测方法带来了严重困难。同时,应用之间的相似性并不反映它们的行为,这对基于应用关系图的检测方法学习恶意软件与良性应用之间行为特征的差异构成了挑战。

2.3. 基于异常样本识别的恶意软件检测

异常样本识别是在检测过程中过滤出概念漂移样本。恶意软件分类器对这些样本的决策通常信心较低,因此需要恶意软件专家的参与,以评估并做出明智的判断。Yuan等(2022年)提出了一种使用双头神经网络进行概念漂移样本识别的方法。这个神经网络有两个平行的输出层,分别输出应用的预测结果。通过这两个输出层之间的差异来识别概念漂移样本。Karbab和Debbabi(2021年)提出了一种自适应的Android恶意软件检测方法。分类器在对概念漂移样本做出决策时通常信心较低,因此在恶意软件检测过程中会过滤掉低信心样本。异常样本识别可以大大提高检测方法的有效性,但它仅限于识别概念漂移样本,而不是进化恶意软件检测。

2.4. 基于API聚类的恶意软件检测

API聚类将具有相似功能的API分组到同一类别中。在恶意软件检测过程中,用API聚类中心替换特征向量中的API,增强了检测方法对API频繁变化的抵抗力。MAMADROID(Mariconti等,2016年)通过包名对API进行聚类。通过将API调用抽象为包,MAMADROID对新引入的API显示出弹性,这些API出现在现有包中。然而,同一包中的API不一定执行相似的功能(Zhang等,2020年)。此外,MAMADROID无法从新包中捕获任何API信息。Zhang等(2020年)提出了APIGRAPH,这是对现有Android恶意软件分类器的一种增强,通过API聚类实现。首先,APIGRAPH从Android官方文档中提取信息以构建实体关系图。然后,使用TransE(Van der Maaten和Hinton,2008年)算法生成实体和关系的嵌入向量。最后,使用k-Means(Syakur等,2018年)算法进行API聚类。作者认为,具有相似参数、相似权限、相似包和相似返回值的API必定具有相似的功能。然而,在API语义提取过程中,包含大量语义信息的API方法名被忽略了。Lei等(2019年)引入了一种使用API标记的API聚类方法。最初,它将调用图中的每个API分割为标记,包括其家族、包名、类名、方法名、返回值和参数。然后,使用doc2vec(Lau和Baldwin,2016年)对每个API进行编码并生成嵌入。最后,使用k-Means算法完成聚类。这种API聚类方法在API语义提取过程中使用了方法名,但忽略了权限和异常等关键特征。权限在Android系统中极为重要(Au等,2012年)。同时,这种方法从训练集而不是API文档中收集API,这使得该方法无法识别测试集中出现的新API。Xu等(2020年)提出了一种使用调用图中API上下文信息的API聚类方法。这种方法认为,展示出相似的调用者和被调用者模式的API很可能具有类似的功能。因此,设计了一个双层神经网络来捕捉API调用及其上下文信息之间的潜在关系。神经网络中的隐藏层用作反映API语义的嵌入,用于聚类。然而,这种方法使用训练数据和测试数据一起训练神经网络,这是一种严重的数据窥探(Quiring等,2022年)行为。在实际场景中,这种方法无法识别测试集中出现的新API。与其他方法相比,API聚类是解决进化恶意软件检测问题最直接和有效的解决方案。然而,现有的聚类方法在API语义提取过程中忽略了方法名和权限等关键特征,导致聚类结果对分类器性能的提升有限。

3. AMDASE概述

AMDASE是一种使用API上下文信息的静态恶意软件检测方法。该系统展示了强大的检测进化恶意软件的能力。图1展示了AMDASE的框架。它由两部分组成:基于语义距离的API聚类和Android恶意软件检测。基于语义距离的API聚类生成代表每个API功能的API聚类中心,在Android恶意软件检测之前完成。基于语义距离的API聚类有四个步骤。首先,从Android官方文档中提取每个API的特征(图1中的步骤a),包括异常、权限、参数、返回值等。其次,根据规定的规则生成API句子(图1中的步骤b)。第三,使用Bert(Jacob等,2019年),一个成熟的NLP模型,对API句子进行编码,获取每个API的嵌入(图1中的步骤c)。最后,我们使用k-Means算法生成代表API功能的聚类中心(图1中的步骤d),并将具有相似语义的API分组在一起。

Android恶意软件检测过程包括五个步骤。首先,使用FlowDroid(Arzt等,2014年),一个静态分析工具,从每个应用中提取函数调用图(图1中的步骤1)。此外,通过消除代表未知功能的节点,同时确保其前驱节点和后继节点之间的连接被保持,优化调用图(图1中的步骤2)。进一步,从调用图中提取函数调用对(图1中的步骤3)。在第四步,最初将函数调用对抽象为API聚类对。接下来,我们继续将剩余方法抽象为其相应的包。最后,使用一键编码生成每个应用的特征向量(图1中的步骤4)。在最后一步,将特征向量输入机器学习分类器,以预测应用是恶意的还是良性的(图1中的步骤5)。

4. 基于语义距离的API聚类

基于语义距离的API聚类包括四个部分:API特征提取、API句子生成、API句子编码和聚类中心生成。

4.1. API特征提取

特征提取是从Android官方文档中提取每个API的特征(Api文档,2023年)。我们研究中使用的特征包括七个不同的类别:包名、类名、方法名、参数、权限、异常和返回值。APIGRAPH的作者提供了收集的Android官方文档和API特征提取的源代码(Apigraph,2023年)。通过复制源代码,我们能够获得所有API及其相应的特征。现有的API聚类方法在API语义提取时忽略了方法名,然而,API的方法名包含大量信息并勾画出API的功能。通过使用NLP模型,可以有效地提取API方法名中嵌入的语义信息,从而提供其预期功能的近似表示。例如,具有方法名如‘getDeviceId’或‘setWifiEnabled’的API。它们的方法名使我们能够轻松理解它们的功能。表1显示了名为Android.telephony.TelephonyManager.getDeviceId的API的特征提取结果。注意,为了减少一些广泛使用的特征值对API语义提取的影响,我们忽略了如int、boolean、String和float等特征值。表1中显示的API以int为参数并返回String。在特征提取过程中忽略了这两个特征值。除了APIGRAPH中现有的特征提取方法外,我们通过利用它们的驼峰命名(除了第一个词,其余词的首字母都是大写,如‘setWifiEnabled’和‘sendTextMessage’)将方法名和类名分开为单词来修改API特征。表1中显示的API的方法名为‘getDeviceID’,可以分为三个单词:’get’、‘Device’和‘ID’,用‘$’分隔。注意,类名和方法名中的一些词都是大写的,如‘SQL’、‘URL’和表1中的‘ID’,这些词是缩写,需要额外处理。

4.2. API句子生成

在特征提取完成后,我们将API转换为能够反映其语义信息的嵌入向量。这部分面临的问题是相同特征的值数量不一致。例如,某些API的方法名可以分解为五个词,而有些API只能分解为三个词。一些API需要调用权限,而其他的则不需要。因此,需要设计一种嵌入方法,该方法不仅能表示API的语义信息,还能将所有具有可变数量特征值的API统一映射为固定大小的特征向量,这些向量最终用于后续聚类中的距离计算。

为解决这个问题,我们首先将每个API及其特征转换为一个句子,称为API句子。根据特征值的数量,API句子的生成分为通用部分和唯一部分。通用部分指的是所有API都具有且仅有一个值的三个共同特征:方法名、类名和包名。通用部分句子生成规则如下:
方法 𝑀𝑒𝑡ℎ𝑜𝑑 来自类 𝐶𝑙𝑎𝑠𝑠 来自包 𝑃𝑎𝑐𝑘

唯一部分包含四种类型的特征:权限、异常、参数和返回值。对于这些唯一特征,每个API都有不同数量的特征值。表2列出了唯一部分句子生成的规则。算法1展示了API句子生成的伪代码。输入是APIx的七种类型的特征,输出是APIx的API句子𝑆。第1至3行生成API句子中通用特征的对应部分;第4至7行调用算法2来生成API句子中唯一特征的对应部分;第8行将𝑆中所有大写字母替换为小写字母;第7行将𝑆中的每个’$‘、’‘和’.'替换为空格。

算法2展示了API句子生成中唯一特征处理的伪代码。算法2算法1的第4至7行调用。输入是唯一特征的特征值列表𝐹𝑒𝑎𝑡𝑢𝑟𝑒𝑠和相应的API句子生成规则𝑅0和𝑅1。输出是对应于唯一特征的API句子部分𝑆𝑃𝑎𝑟𝑡。算法2考虑了特征值数量为0或至少为1的两种情况。

表1中显示的API及其特征输入算法1后,我们可以得到以下API句子:“method get device id from class telephony manager from package Android telephony use permission read phone state throw none exception use none parameter return none”。

4.3. API句子编码

在完成API句子生成后,我们使用预训练的Bert模型对每个API句子进行编码,并取CLS的编码输出作为API语义嵌入。CLS的768维特征向量概括了整个句子的语义信息。Bert是一个广泛认可的预训练模型,在自然语言处理(NLP)领域的各种基础任务中表现出色(Bengio等人,2000年)。Bert在输入序列前添加了一个特殊的词向量CLS。CLS是分类的缩写,它可以更全面地融合序列中所有单词的信息。它通常用于各种下游任务,包括文本情感识别。Bert拥有大量的参数。使用在如BooksCorpus和Wikipedia(Jacob等人,2019年)等语料库上预训练的Bert可以大大节省计算资源。API句子不仅包含诸如方法名和权限等重要特征,还能将具有不一致特征数量的API统一映射到固定大小的特征向量中。借助API句子和Bert的嵌入使用,从API中提取语义不仅依赖于包和参数等特征,还依赖于概述API功能的方法名,这使得API聚类结果更加准确。

4.4.聚类中心生成

每个API的特征向量维度为768,通过Bert嵌入获得,这个维度相当大。这在聚类过程中的距离计算上带来了重大负担。为了降低维度,采用了主成分分析(PCA)(Svante等人,1987年),考虑了90%的方差比率。经过降维处理后,每个API获得了一个66维的特征向量。采用肘部方法(Syakur等人,2018年)来确定最优的聚类中心数目,确定为2000个。最后,执行了k-均值聚类算法(Syakur等人,2018年)。当Android官方文档更新时,比如增加新的API或改变现有API的特征,聚类结果需要更新。如图2所示,我们只需要生成新添加或更改的API的句子,并用Bert编码来获得它们的嵌入。在聚类过程中,新的API被分组到最近的聚类中心,并更新这个聚类中心的坐标。然而,APIGRAPH(张等人,2020年)需要更新实体-关系图,并使用TransE算法(Bordes等人,2013年)从头开始训练整个图,这需要重新聚类所有API的嵌入。以从API级别28(A28)更新到API级别29(A29)的聚类结果为例,A28中有58,291个API,而在A29中新增了834个API。在更新聚类结果时,我们的API聚类方法只需要处理834个新API。而APIGraph不仅需要处理这834个新API,还需要处理A28中现有的58219个API。本文提出的API聚类方法的更新成本显著低于APIGRAPH。

5. Android malware detection

在本文中,我们介绍了AMDASE,这是一种新颖的Android恶意软件检测方法,能够有效识别进化的恶意软件。图3展示了AMDASE中Android恶意软件检测的框架。Android恶意软件检测包括四个步骤:(1)调用图提取,使用静态分析工具从每个应用程序中提取调用图。(2)调用图优化,通过删除未知函数节点同时保留它们的前驱节点和后继节点之间的连通性来优化调用图。(3)特征嵌入,将优化后的调用图映射成一个特征向量。最初,从调用图中提取函数调用对。随后,使用聚类中心来替代调用对中的API,同时使用包来替代其他函数。最终,通过使用一键编码生成特征向量。(4)分类,使用训练好的机器学习分类器来预测这个应用是良性的还是恶意的。

5.1.调用图提取

初始步骤中使用了FlowDroid(Arzt等人,2014年),这是一种广泛使用的静态分析工具,用来从每个APK文件中提取调用图。调用图是一种树状结构,表示应用程序中函数调用关系。Android操作系统基于事件驱动模型运行,在这种模型中,Android应用内的代码执行是由多种事件(例如,触摸屏幕、接收网络消息)触发的。与常见的Java和C++代码不同,后者有明确的执行顺序并从特定的main()函数开始,Android应用中的代码根据触发事件的顺序有不同的执行顺序。因此,FlowDroid生成了一个名为dummyMainMethod()的特殊函数作为调用图的根节点,这意味着它是虚拟的主函数(也称为入口函数)。dummyMainMethod()的子节点是对应于不同触发事件的代码。FlowDroid假设这些代码可以按任何可能的顺序执行。

5.2.调用图优化

5.2.1.未知功能引起的问题

API的全名是应用程序编程接口,它是一种特殊的调用方式,实现了系统功能,如网络通信、蓝牙使用、相机操作等。除了API外,应用中还有大量未知函数和相对较少的其他函数。根据代码保护机制(Schulz,2012),未知函数可以分为混淆函数(例如,com.a.b.c.e123)和自定义函数(例如,com.xiaomi.mipush.sdk.pushMessageHandler)。其他函数主要用于类初始化(例如,java.io.FileOutputStream.init)。Android官方文档提供了这些函数所属类的记录。调用图,也称为控制流图,表示应用程序内的调用关系。未知函数、其他函数和API在调用图中都是单独的节点。未知函数节点占调用图的绝大多数。现有的检测方法有两种处理未知函数的方式:统一抽象和全部保留。统一抽象是将所有未知函数节点抽象为一个名为Unknown的节点。这将严重减少调用图的结构信息。在所有未知节点被抽象后,大量API的前驱节点和后继节点在调用图中都是Unknown节点。因此,调用图中API的上下文信息被严重损害。全部保留涉及保留调用图中所有未知函数节点。这将产生大量冗余信息。API的数量有限,每个API的使用更为明确。相比之下,软件开发者有权定义未知函数的名称和用途,这些可以轻易改变。在调用图中保留所有未知函数将严重增加后续检测工作的计算开销,并影响检测方法提取API上下文信息的能力。API上下文信息在准确表示每个应用的行为方面最为有效。本质上,恶意软件检测的主要数据来源是调用图中API调用的局部信息。然而,大量的未知函数节点严重削弱了提取API上下文信息的能力。

5.2.2.调用图优化算法

为了解决提取API上下文信息的严重困难,我们提出了一种调用图优化方法。这种方法移除了几乎无法提取任何有用信息的未知函数节点,同时保留了它们的前驱节点和后继节点之间的连通性。如果在调用图中任意两个API节点(例如,APIx和APIy)之间存在由全部未知函数节点组成的路径,即APIx通过调用几个未知函数来调用APIy。在优化后的调用图中,APIx直接调用APIy。未知函数本身不包含任何信息,或者它包含的信息量很小,几乎无法提取。然而,应该保留其调用关系,因为它反映了应用的行为。在优化后的调用图中只有三种类型的函数:入口函数、API和其他函数。这三种类型的函数之间的调用关系更准确、更稳健地反映了应用的行为。算法3显示了调用图优化的伪代码。该算法的输入是从应用和Android官方文档中提取的调用图。输出是优化后的调用图。

![[202402.通过提取 API 语义来实现的一个新颖的安卓恶意软件检测方法。A novel Android malware detection method with API semantics extraction_image.png]]

第2至7行用于筛选图中的关键函数节点,包括入口函数、API和其他函数。第8至9行用于获取打算移除的未识别节点的前驱节点列表和后继节点列表。第10至14行通过嵌套遍历这两个列表并在调用图中添加由这两个列表中的任意两个节点组成的有向边,以维持未知节点的前驱和后继节点之间的连通性。第15行用于从调用图中移除未知节点。

5.3. Feature embedding

第三步是将优化后的调用图映射成一个特征向量。首先,我们从优化后的调用图中提取函数调用对,包括调用者和被调用者。调用对中的函数可以分为三类:API、入口函数和其他函数。然后,每个API被抽象成第4节中获得的聚类中心。这个过程还涉及将其他函数抽象成各自的包,而入口函数被指定为保留。通过将API抽象成聚类中心,AMDASE能够抵御Android框架和恶意软件中API变化的影响。最后,使用一键编码生成每个应用的特征向量。优化后调用图中的聚类调用对的特征值被映射到第一个组件,而其他组件设置为零。

5.4.分类

在进行分类之前,前一步骤生成的特征向量维度过大,导致在训练和预测过程中产生了显著的计算负担。因此,在分类之前使用PCA(Svante等人,1987年)来降低特征向量的维度。PCA能够消除特征空间中的误导信息,如噪声,使分类器能够捕捉到更稳定和强大的特征。在测试随时间开发的恶意软件时,PCA可以大大提高分类器的性能。Android恶意软件检测的最后一步是使用机器学习分类器进行分类,预测这些应用是良性的还是恶意的。我们选择k-最近邻(KNN)(Fix和Hodges,1952年)、支持向量机(SVM)(Hearst等人,1998年)和随机森林(RF)(Breiman,2001年)作为分类器。这三种算法使用Python库scikitlearn(Scikit-learn,2023年)实现。每个模型通过训练集中应用的特征向量进行训练,并通过测试集中的应用进行测试。我们使用10折交叉验证来评估AMDASE。

6 实验与分析

在本节中,我们对AMDASE进行了全面的评估,包括以下六个实验:

  1. 恶意软件检测的有效性评估:我们评估了AMDASE在识别和区分恶意软件与良性应用方面的有效性。
    检测进化的Android恶意软件的能力研究:我们研究了AMDASE在识别随时间演变的Android恶意软件方面的表现。
  2. API聚类中方法名称的影响分析:我们探讨了在API聚类过程中方法名称对聚类结果的影响。
  3. 调用图优化的影响评估:我们衡量了优化调用图对提高检测效率和准确性的作用。
  4. AMDASE的运行时评估:我们提出了对AMDASE运行时间的评估,以考察其在实际应用中的性能。
  5. API聚类在API语义提取上的能力评估:通过分析嵌入空间中常用API的紧密程度,我们评估了API聚类在提取API语义方面的能力。
    这些实验旨在全面验证AMDASE系统的性能,确保其在各个方面都能达到预期的安全防护效果。

6.1.实验设置

表3总结了我们实验中使用的数据集,包括42,450个恶意应用和42,154个良性应用。我们使用的apk的MD5是由APIGRAPH(张等人,2020年)的作者收集的。我们从三个开放的仓库下载恶意软件,包括AndroZoo(Allix等人,2016年)、VirusTotal(VirusTotal,2023年)和AMD数据集(魏等人,2017年)。所有的恶意应用至少被VirusTotal中的15个杀毒引擎标记为恶意。我们从Google Play商店(2023年)收集良性应用,并借助AndroZoo下载它们。所有的良性应用都被VirusTotal中的每一个杀毒引擎标记为良性。为了评估AMDASE,我们使用收集的数据集进行10折交叉验证。我们设计了以下两个实验场景来评估进化恶意软件的检测能力:

  • 场景A:使用2012年到2013年的应用进行十折交叉验证,产生10个训练过的分类器。我们使用这10个分类器来检测2014年到2018年开发的恶意软件,并取检测结果的平均值。

  • 场景B:使用2013年到2014年的应用进行十折交叉验证,产生10个训练过的分类器。我们使用这10个分类器来检测2015年到2018年开发的恶意软件,并取检测结果的平均值。

我们选择了以下广泛使用的指标,包括准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1值(F1-Measure)。准确率的计算公式为: Accuracy = T P + T N T P + T N + F P + F N \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} Accuracy=TP+TN+FP+FNTP+TN 。在以下公式中,精确率为: Precision = T P T P + F P \text{Precision} = \frac{TP}{TP + FP} Precision=TP+FPTP ,召回率为: Recall = T P T P + F N \text{Recall} = \frac{TP}{TP + FN} Recall=TP+FNTP 。其中TP和TN分别代表正确分类为恶意和良性的样本数量,FP和FN分别代表错误地识别为恶意和良性的样本数量。

F 1 = 2 × Precision × Recall Precision + Recall F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1=Precision+Recall2×Precision×Recall

6.2.恶意软件检测性能

为了评估AMDASE在恶意软件检测方面的有效性,我们使用同一年开发的样本对AMDASE进行了训练和测试。我们对表3中描述的七个数据集进行了10折交叉验证。表4展示了不同方法在每个数据集上的检测性能。在SVM、RF和KNN中,AMDASE使用RF取得了最佳性能。AMDASE在7年的平均F1值达到了96.7%,比MAMADROID(92.7%)和MALSCAN(90.9%)分别高出4.3%和6.4%;AMDASE的平均准确率为96.7%,比MAMADROID和MALSCAN分别高出4.3%和6.1%;AMDASE的平均精确率为98.5%,比MAMADROID和MALSCAN分别高出5.5%和5.6%;AMDASE的平均召回率为94.8%,比MAMADROID和MALSCAN分别高出3.2%和6.2%;从表4可以看出,MAMADROID的所有指标随时间缓慢增长。MALSCAN(吴等人,2019年)在2012年至2014年间具有较高的精确率和较低的召回率,但在2015年至2018年间精确率较低,召回率较高。这种现象可能与Android框架的变化有关,但AMDASE始终能够在高水平上稳定地维持其检测性能,受时间变化的影响较小。

6.3.不断发展的恶意软件检测性能

为了检验AMDASE在检测进化恶意软件方面的表现如何,我们选择了MAMADROID、AE-MAMADROID(张等人,2020年)、MALSCAN和AE-MALSCAN(张等人,2020年;吴等人,2019年)作为比较方法。AE-MAMADROID和AE-MALSCAN分别代表使用APIGRAPH增强MAMADROID和MALSCAN。在不同的分类器中,AMDASE使用SVM在进化恶意软件检测方面表现最佳。如表5所示,AMDASE的F1值显著高于其他方法。在场景A中,2014年至2018年AMDASE的平均F1值达到了82.6%,比MAMADROID(67.9%)高出22%。在场景B中,2015年至2018年AMDASE的F1值均高于80%。实验结果证明,使用旧样本训练的AMDASE能有效检测进化的恶意软件。与MAMADROID的API聚类方法相比,后者仅将API抽象为其包,AMDASE充分考虑了API的方法名称和权限中包含的丰富语义信息,使得聚类结果更有效。在恶意软件检测阶段,AMDASE可以借助调用图优化提取更稳健的反映应用行为的特征。因此,使用旧软件样本训练的AMDASE能有效检测进化的恶意软件,并且其老化速度显著减慢。APIGRAPH是现有Android恶意软件分类器的一种增强。它通过用APIGRAPH中获得的聚类中心替换特征向量中的API,使检测方法对进化的恶意软件具有弹性。MALSCAN通过使用调用图中敏感API的中心性信息来检测恶意软件。这些敏感API由PScout(Au等人,2012年)收集,大多数在2016年后很少使用,因此MALSCAN在2017年的F1值急剧下降。AE-MALSCAN使用聚类中心的中心性信息替代敏感API。在MALSCAN通过APIGRAPH增强后,其老化速度放缓。相反,MAMADROID在通过APIGRAPH增强后,其老化速度变得更加严重。具体原因将在第6.5节进一步分析。

6.4. API 聚类中方法名称的影响

为了评估API方法名称对API聚类结果的影响,我们设计了三种基于API聚类的恶意软件检测方法。第一种检测方法是使用本文提出的API聚类方法的AMDASE,带有一键编码(ASEOH);第二种检测方法是不考虑方法名称(WMN)。WMN的API聚类方法在生成API句子时忽略方法名称,其他步骤与本文提出的API聚类方法相同;第三种检测方法是使用APIGRAPH提出的聚类方法的APIGraph,带有一键编码(AGOH)。这三种检测方法都使用聚类中心的一键编码生成特征向量,并且都选择了在KNN、RF和SVM中表现最佳的分类器进行恶意软件检测。我们使用场景A和场景B进行十折交叉验证。表6显示了这三种基于API聚类的检测方法的检测结果。在场景A中,2014年至2018年WMN的平均F1值为58.2%,比AGOH高出19.5%;ASEOH的平均F1值为74.6%,比WMN高出28.2%;AMDASE的平均F1值为82.6%,比ASEOH高出10.7%。在场景B中,2014年至2018年WMN的平均F1值为66.9%,比AGOH高出13.4%;ASEOH的平均F1值为79.0%,比WMN高出18.1%;AMDASE的平均F1值为86.5%,比ASEOH高出9.5%。AGOH和WMN在提取API语义时都没有考虑方法名称,因此这两种方法的性能迅速衰减。与AGOH相比,WMN使用Bert挖掘类名和权限等特征中的语义信息,导致其老化速度相对较慢。ASEOH使用的API聚类方法充分利用了方法名称中包含的语义信息,因此ASEOH的性能与AGOH和WMN相比有了很大的提升。当我们使用从优化调用图中提取的聚类调用对的一键编码作为特征向量(AMDASE)时,检测性能进一步提高。实验结果表明,方法名称在API聚类中起着不可或缺的作用。

6.6 运行时评估

在本节中,我们通过使用从表3中随机选取的2000个应用程序来展示MAMADROID、MALSCAN和AMDASE的运行时开销。表9展示了运行时评估的结果。与AMDASE一样,MAMADROID和MALSCAN也是使用调用图中的API上下文信息进行恶意软件检测的方法。因此,这三种方法的运行时间可以分为三个阶段:调用图提取、特征提取和分类。

  • 调用图提取:此阶段从APK文件中提取调用图。MAMADROID和AMDASE都使用Soot(Vallée-Rai等人,2010年)进行代码表示,并使用FlowDroid生成调用图,因此这两种方法的时间成本几乎相同(分别为14.345秒和14.297秒)。MALSCAN使用Androguard(Androguard,2023年)生成调用图。与FlowDroid相比,Androguard的时间成本大大降低(3.912秒,约低72.6%)。

  • 特征提取:此阶段将调用图转换为特征向量。MALSCAN需要计算调用图中敏感API的中心性信息,时间成本最大(3.293秒)。AMDASE需要在此阶段优化调用图并嵌入特征,时间成本为0.974秒。MAMADROID从调用图中抽象出函数调用对,转换为包调用对,并构建马尔可夫链来模拟转移概率,所需时间最少(0.529秒)。

  • 分类:此阶段使用训练好的机器学习分类器预测应用是恶意的还是良性的。MAMADROID使用PCA进行降维并使用RF进行检测,时间成本为0.028秒。AMDASE使用PCA进行降维并使用SVM进行检测,时间成本为0.025秒。MALSCAN在此阶段只需要使用RF进行检测,时间开销最少(0.003秒)。

MALSCAN专注于在应用商店(如Google Play)中快速扫描大量应用程序。因此,MALSCAN所需的时间在这三种方法中最少(7.208秒)。MAMADROID和AMDASE的运行时开销相对较大(分别为14.902秒和15.296秒)。其中,AMDASE的运行时间最长,但考虑到AMDASE的出色检测性能和极其缓慢的老化速度,AMDASE的运行性能是可以接受的。

6.7 API聚类在语义提取上的能力

在本节中,我们通过分析嵌入空间中常用API的紧密程度来评估API聚类在API语义提取上的能力。我们选择了最常用的200个API,并使用t-SNE(Van der Maaten和Hinton,2008年)算法将高维特征向量映射到二维平面。由于空间限制,图4仅显示了部分可视化结果。在图4中,属于同一聚类中心的API用相同的颜色标记。红色节点是与Android活动生命周期相关的API,黄色节点是与线程活动相关的API,深蓝色节点是与输入输出相关的API,橙色节点是与哈希图相关的API,浅蓝色节点是与数组内容操作相关的API。可以看出,属于同一聚类中心的API具有相似的功能,而具有不同功能的API被分组到不同的聚类中心。值得注意的是,浅蓝色节点和黄色节点都属于Android包java.lang。这表明MAMADROID使用的简单将API分组到其包中的聚类方法不足以提取API语义。如图4所示,具有相似功能的API之间的欧几里得距离较短。这证明了我们的API聚类方法在语义提取上的有效性。我们的方法可以生成更准确反映API功能的嵌入,使得后续的k-均值聚类算法能更好地将具有相似功能的API分组到同一聚类中心。

8. 讨论

API句子的规则

在设计API句子生成规则时,我们发现尽管一些具有不同表达方式的规则含义相同,但API聚类结果对AMDASE的检测性能可能会产生一定影响。例如,将规则“不使用任何权限”更改为“不使用权限”或“没有使用权限”会削弱AMDASE检测进化恶意软件的能力。可能是因为Bert能从“none”中提取的信息比“not”或“no”更多。

API聚类

API聚类属于无监督学习。判断API聚类结果的质量没有绝对正确的答案。聚类的有效性只能通过恶意软件检测的性能来反映。本文提出的API聚类方法可以有效延缓分类器的老化速度,使分类器能够抵抗Android框架中API的变化。

混淆技术

恶意软件可能使用诸如打包(Duan等人,2018年;Lu等人,2020年,2021年)、反射和动态代码加载(Falsina等人,2015年)等混淆技术来逃避静态检测。恶意软件开发者可能将API混淆为未知函数。在调用图优化过程中,这些混淆的API会丢失。然而,调用图优化的目的是我们无法从大量未知函数中有效获取有用信息。与良性应用相比,恶意软件在调用图优化过程中通常会添加更多的API调用对。这些调用对大多与线程活动相关。恶意软件经常伪装成良性应用,并通过多线程活动执行恶意行为。

深度学习分类器

深度学习已广泛应用于网络安全。未来,我们将尝试使用DNN或GNN(Wu等人,2020年)作为恶意软件检测的分类器。本文认为简单的机器学习分类器(如SVM和KNN)更适合检测概念漂移样本,而更强大的分类器(如随机森林)容易导致过拟合现象。基于它们自身的特点,这些复杂的算法可以在训练阶段学习到除恶意行为之外的更多相关性,并取得更好的检测结果,这也使它们难以有效检测进化的恶意软件。

运行时间

值得注意的是,在第6.6节中,MAMADROID和AMDASE在第一阶段的时间成本约占总时间的95%。使用Androguard提取调用图可以大大减少恶意软件检测的时间开销,但同时也会丢失一定量的调用图准确性,最终会影响检测性能。如何快速准确地提取Android应用的调用图仍然是未来的重要研究方向。

9. 结论

持续检测进化的恶意软件是一个重大挑战。为了解决这一问题,我们提出了AMDASE,这是一种新颖的Android恶意软件检测方法,具有API语义提取功能。我们设计API句子来总结重要的API特征,并使用Bert提取API的语义。借助API句子,从API中提取语义信息不仅依赖于包和参数等特征,还依赖于概述API功能的方法名称。为了克服调用图中大量未知函数导致的API上下文信息提取困难,我们提出了一种调用图优化方法,该方法在保持其前驱节点和后继节点之间的连接的同时,移除调用图中所有未知节点。同时,我们将优化后的调用图中的API抽象为代表其功能的API聚类中心,这使得检测方法能够抵抗Android框架和恶意软件中频繁的API变化。我们在开发了七年的42.2K良性和42.5K恶意应用的数据集上评估了AMDASE的有效性。实验结果表明,AMDASE在现有最先进的Android恶意软件检测方法中表现出色,同时也显著降低了老化速率。

相关文章:

【恶意软件检测论文】通过提取 API 语义来实现的一个新颖的安卓恶意软件检测方法

目录 摘要1. 引言2. 相关工作2.1. 基于重新训练的恶意软件检测2.2. 基于应用关系图的恶意软件检测2.3. 基于异常样本识别的恶意软件检测2.4. 基于API聚类的恶意软件检测 3. AMDASE概述4. 基于语义距离的API聚类4.1. API特征提取4.2. API句子生成4.3. API句子编码4.4.聚类中心生…...

大模型系列4--开源大模型本地部署到微调(WIP)

背景 一直想真正了解大模型对硬件资源的需求,于是准备详细看一篇视频,将核心要点总结记录下。本文内容参考视频:保姆级教程:6小时掌握开源大模型本地部署到微调,感谢up主 训练成本 训练 > 微调 > 推理训练GPT…...

Linux 磁盘满了怎么办?快速排查和清理方法

当 Linux 磁盘满了,会导致系统无法正常运行,比如无法写入文件、服务停止、甚至系统崩溃。因此,快速排查并清理磁盘空间是非常重要的。以下是详细的排查和解决步骤: 一、快速定位磁盘占用原因 1. 检查磁盘使用情况 使用 df 命令查…...

go 协程练习例题

go 协程练习例题 例1:统计 1-200000 的数字中,哪些是素数例2:使用单通道、2个协程交替读取字符串例3:使用1个管道,2个协程写数据、1个协程读例4:完成一个并发任务调度器,按照指定顺序执行一系列…...

JAVA:访问者模式(Visitor Pattern)的技术指南

1、简述 访问者模式(Visitor Pattern)是一种行为型设计模式,允许你将操作分离到不同的对象中,而无需修改对象本身的结构。这种模式特别适合复杂对象结构中对其元素进行操作的场景。 本文将介绍访问者模式的核心概念、优缺点,并通过详细代码示例展示如何在实际应用中实现…...

如何实现邮箱+验证码登录功能(express+vue+MySQL版)

目录 1. 初始化项目2. 配置环境变量3. 更新数据库4. 编写路由函数5. 前端调用接口 1. 初始化项目 前端根目录:/web 后端根目录:/api_server 安装依赖: npm install express mysql nodemailer randomstring dotenv其中,nodemaile…...

Pycharm访问MySQL数据库·上

1.MySQL驱动模块Connector #导入数据库的驱动工具 import mysql.connector #连接数据库必备的条件 config {"host": "localhost","port": 3306,"user": "root","password": "888888","database&…...

vscode+msys2+clang+xmake c++开发环境搭建

转载请标明出处:小帆的帆的专栏 安装msys2 下载msys2安装包:清华源下载地址安装msys2:安装目录,C:\Softwares\msys64 安装cling工具链,xmake !!!在开始菜单中启动MSYS2 CLANG64,…...

Python面试常见问题及答案5

一、基础语法相关 问题1: Python的可变数据类型和不可变数据类型有哪些? 答案: 在Python中,可变数据类型有列表(list)、字典(dict)、集合(set)。这些数据类型…...

威联通docker无法拉取镜像

链接:威联通TS-464C 折腾--Container Station国内无法拉取镜像_docker_wangguanghe-开放原子开发者工作坊我这里用的是IPV6 ,没有公网资源啊。 wangguanghe...

3D 生成重建034-NerfDiff借助扩散模型直接生成nerf

3D 生成重建034-NerfDiff借助扩散模型直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 感觉这个论文可能能shapE差不多同时期工作,但是shapE是生成任意种类。 本文提出了一种新颖的单图像视图合成方法NerfDiff,该方法利用神经辐射场 …...

ASP.net Core EntityFramework Code EF code 汇总

Entity FrameWork EF 总结 EF Core EF Core 如果实体模型很多,全部放在 上下文中的 OnModelCreating(ModelBuilder modelBuilder) 不太好维护 可以把实体模型 分离出去,每个类创建一个实体模型 public class BookConfiguration :IEntityT…...

AtCoder Beginner Contest 384 Solution

文章目录 ABCDEFG A void solve() {string s; char x, y;qr(n, x, y, s);for(auto i: s) {if(i ! x) i y;cout << i;} }B void solve() {qr(n, m);for (int i 1; i < n; i) {int x, y;qr(x, y);x--;if(1600 - x * 400 < m && m < 2799 - x * 400) m…...

c# TaskScheduler

这里记录下 TaskScheduler 的简单用法。 使用场景&#xff1a; 使用 Task 的时候&#xff0c;大家知道用 TaskFactory.StartNew 可以用来创建一个 Task 。这里如果创建了 3 个&#xff0c;那么这3个 Task 就各自放飞直接运行了。 class Program {private static TaskFactory…...

FFMPEG视频转图片

用FFMPEG视频转图片&#xff0c;并且for循环 import os import subprocess# 输入文件夹和输出文件夹路径 input_folder r"I:\xxx" output_base_folder r"D:\xxx\YOLO\data\video" output_subfolder_name "20240609"# 创建输出子文件夹 output…...

激活函数-swiGLU

swiGLU&#xff08;Switch Gated Linear Unit&#xff09;简介 swiGLU 是一种改进的激活函数模块&#xff0c;主要用于深度学习中的 Transformer 模型和其他神经网络架构。它在 GLU&#xff08;Gated Linear Unit&#xff09; 的基础上进行了修改&#xff0c;以提升模型的表现…...

PCIe学习笔记

PCIE高速串行数据总线 当拿到一块板子 比如你要用到PCIE 首先要看这块板子的原理图 一般原理图写的是 PCI express 表示PCIE 以下是Netfpga为例下的PCIE插口元件原理图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/01dc604fbdc847e8998a978c83c7b2eb.png 一般主…...

制作容器镜像

容器基础镜像制作 由于项目使用麒麟操作系统&#xff0c;需要在麒麟桌面操作系统和服务器操作系统里编译代码&#xff0c;如果每次都在物理机和虚拟机里编译太不方便&#xff0c;也无法使用常用的 jenkins k8s 组成的 CI/CD 编译环境&#xff0c;如果基于整个ISO太大了&#…...

mysql系列4—mysql数据库设计和查询优化

背景 数据库作为持久层需要从磁盘读写数据&#xff0c;是整个系统的短板&#xff0c;其性能会直接体现在产品性能上。因此数据库的设计和优化再怎么强调也不为过。本文将从数据库设计和查询优化两个角度思考如何提高数据库性能&#xff0c;内容包括数据库范式与表设计、基本字…...

音视频入门基础:MPEG2-TS专题(16)——PMT简介

一、引言 PMT&#xff08;Program Map Table&#xff09;与PAT表成对出现&#xff0c;其PID由PAT表给出。通过PMT表可以得到该节目包含的视频和音频信息&#xff0c;从而找到音视频流&#xff1a; 二、PMT表中的属性 根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第79页&#x…...

2024小迪安全信息收集第三课

目录 一、Web应用-架构分析-WAF&蜜罐识别 二、Web应用-架构分析-框架组件指纹识别 #Web架构 开源CMS 前端技术 开发语言 框架组件 Web服务器 应用服务器 数据库类型 操作系统信息 应用服务信息 CDN信息 WAF信息 蜜罐信息 其他组件信息 #指纹识别 #WAF识别…...

ESP32-C3 入门笔记07: ESP-NOW动态绑定MAC地址. (ESP-IDF + VSCode)

ESP-NOW 简介 ESP-NOW [gitbuh] ESP-NOW 是一种由乐鑫公司定义的无连接 Wi-Fi 通信协议。在 ESP-NOW 中&#xff0c;应用程序数据被封装在各个供应商的动作帧中&#xff0c;然后在无连接的情况下&#xff0c;从一个 Wi-Fi 设备传输到另一个 Wi-Fi 设备。 CTR 与 CBC-MAC 协…...

Windows如何安装go环境,离线安装beego

一、安装go 1、下载go All releases - The Go Programming Language 通过网盘分享的文件&#xff1a;分享的文件 链接: https://pan.baidu.com/s/1MCbo3k3otSoVdmIR4mpPiQ 提取码: hxgf 下载amd64.zip文件&#xff0c;然后解压到指定的路径 2、配置环境变量 需要新建两个环境…...

【Unity技巧】如何设置屏幕最小宽度

在 Unity 中&#xff0c;设置屏幕最小宽度可以通过调整 Canvas 的 CanvasScaler 组件来控制 UI 元素的缩放&#xff0c;并确保 UI 在不同屏幕宽度下始终能保持适当的布局。 不过&#xff0c;如果你想要限制游戏的实际窗口宽度&#xff0c;通常是通过代码来实现的。例如&#x…...

【新版】阿里云ACP云计算题库及答案解析

阿里云ACO云计算考试提醒都是选择题&#xff0c;70道单选题30道单选题&#xff0c;聪明的小伙伴都知道刷题备考加深记忆&#xff0c;给大家分享一波阿里云ACP云计算题库及答案&#xff0c;希望对大家顺利拿到阿里云ACP云计算高级工程师证书有所帮助&#xff01; 1、设计云上架…...

【蓝桥杯每日一题】推导部分和——带权并查集

推导部分和 2024-12-11 蓝桥杯每日一题 推导部分和 带权并查集 题目大意 对于一个长度为 ( N ) 的整数数列 A 1 , A 2 , ⋯ , A N A_1, A_2, \cdots, A_N A1​,A2​,⋯,AN​ &#xff0c;小蓝想知道下标 ( l ) 到 ( r ) 的部分和 ∑ i l r A i A l A l 1 ⋯ A r \sum_{…...

【Linux服务器nginx前端部署详解】ubantu22.04,前端Vue项目dist打包

本文主要讲一下在Linux系统环境下&#xff08;以ubantu22.04为例&#xff09;&#xff0c;如何用nginx部署前端Vue项目打包的dist静态资源。有些具体的命令就不展开讲了&#xff0c;可以自行查看其他博主的文章&#xff0c;我主要讲整体的步骤和思路。 一、ubantu系统安装ngin…...

Groovy 语法快速入门

文章目录 1. Groovy 的特点2. 基本语法2.1. 变量2.2. 字符串2.3. 条件语句 3. 集合操作3.1. 列表&#xff08;List&#xff09;3.2. 映射&#xff08;Map&#xff09; 4. 循环语句4.1. 普通循环4.2. 闭包遍历 5. 方法定义6. 闭包&#xff08;Closure&#xff09;6.1. 定义与调用…...

vue3 Textarea在光标定位处,增加一定的关键词。

1、经常碰到这种情况&#xff0c;有一些是系统预留的关键词可以选择&#xff0c;当用户把光标定位到什么地方&#xff0c;我们就要在这个位置插入指定的关键词。 2、光标定位在今天的前面&#xff0c;那么我们点击【逗号】按钮&#xff0c;在这个位置增加一个逗号。 3、代码&…...

硬件设计-电源轨噪声对时钟抖动的影响

目录 定义 实际案例 总结 定义 首先了解抖动的定义&#xff0c;在ITU-T G.701中有关抖动的定义如下&#xff1a; 数字信号重要瞬间相对于其理想时间位置的短期非累积变化。 抖动是时钟或数据信号时序的短期时域变化。抖动包括信号周期、频率、相位、占空比或其他一些定时特…...

Graspness 端到端抓取点估计 | 环境搭建 | 模型推理测试

在复杂场景中实现抓取检测&#xff0c;Graspness是一种端到端的方法&#xff1b; 输入点云数据&#xff0c;输出抓取角度、抓取深度、夹具宽度等信息。 开源地址&#xff1a;https://github.com/rhett-chen/graspness_implementation?tabreadme-ov-file 论文地址&#xff1…...

大模型呼入机器人的缺点是什么?(转)

大模型呼入机器人的缺点是什么&#xff1f;(转) 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/FreeIPCC/FreeIPCC 大模型呼入机器人在提供高效、自动化服务的同时&#xff0c;也存在一些缺点。以下是对其缺点的详细归纳&#…...

ASP.NET |日常开发中连接Oracle数据库详解

ASP.NET &#xff5c;日常开发中连接Oracle数据库详解 前言一、安装和配置 Oracle 数据访问组件1.1 安装ODP.NET&#xff08;Oracle Data Provider for.NET&#xff09;&#xff1a;1.2 引用相关程序集&#xff1a; 二、配置连接字符串2.1 连接字符串的基本组成部分&#xff1a…...

Kaggler日志-Day4

进度24/12/14 昨日复盘&#xff1a; Pandas课程完成 Intermediate Mechine Learning2/7 今日记录&#xff1a; Intermediate Mechine Learning之类型变量 读两篇讲解如何提问的文章&#xff0c;在提问区里发起一次提问 实战&#xff1a;自己从头到尾首先Housing Prices Compe…...

onnx算子的注册详解及案例 (完整版)

文章目录 1. 介绍1.1 导出onnx不成功1.2 分析和解决方案2. 案例2.1 Asinh算子注册2.1.1 导出onnx2.1.2 算子注册2.2 自定义算子的注册2.1 直接导出自定义算子2.2 自定义算子的注册并导出2.3 导出带deformable conv 的onnx2.3.1 直接导出deformable conv2.3.2 注册并导出deforma…...

2024生命科学前沿技术

前沿技术是指高技术领域中具有前瞻性、先导性和探索性的重大技术&#xff0c;是未来高技术更新换代和新兴产业发展的重要基础&#xff0c;是国家高技术创新能力的综合体现。选择前沿技术的主要原则一是代表世界高技术前沿的发展方向。二是对国家未来新兴产业的形成和发展具有引…...

游戏引擎学习第47天

仓库: https://gitee.com/mrxiao_com/2d_game 昨天我们花了一点时间来修复一个问题&#xff0c;但基本上是在修复这个问题的过程中&#xff0c;我们决定添加一个功能&#xff0c;那就是在屏幕上控制多个实体。所以如果我有一个手柄&#xff0c;我可以添加另一个角色&#xff0…...

1.编写 Prompt 的原则

一、环境配置 使用 OpenAI 的 ChatGPT API&#xff0c;需要有 API_KEY&#xff0c;并安装 OpenAI 库。安装命令&#xff1a;pip install openai 和 pip install zhipuai。配置方法&#xff1a;直接设置 openai.api_key 或通过环境变量设置。 二、两个基本原则 2.1 原则一&am…...

【JavaEE】网络(2)

一、网络编程套接字 1.1 基础概念 【网络编程】指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff1b;当然&#xff0c;我们只要满足进程不同就行&#xff0c;所以即便是同一个主机&#xff0c;只要是不同进程&#xff0c;基于网络来传…...

SAS - Subtractive Port

在SAS&#xff08;串行连接SCSI&#xff0c;Serial Attached SCSI&#xff09;协议中&#xff0c;subtractive port 是一种特殊类型的端口&#xff0c;主要用于设备间的路由功能。它的作用是在路径选择过程中充当默认路径&#xff0c;以处理未明确指定路径的请求。以下是它的定…...

Unity3D项目为什么要使用FairyGUI

前言 Unity3D项目选择使用FairyGUI的原因是多方面的&#xff0c;主要涵盖性能优化、设计模式、编辑器支持、跨平台兼容性以及丰富的功能特性。以下是对这些方面的详细解析以及相关的代码实现。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一…...

Pytest接口自动化测试框架Python自动化测试开发

一、引言 在软件开发过程中&#xff0c;接口测试是确保软件各个组件之间数据传输和功能交互正常工作的重要环节。通过接口测试&#xff0c;可以提高软件的整体质量和稳定性。Pytest是一个流行的Python自动化测试框架&#xff0c;提供了丰富的断言方法和灵活的测试组织结构&…...

MySQL追梦旅途之性能优化

1、索引优化 索引可以显著加速查询操作&#xff0c;但过多或不适当的索引也会带来负面影响&#xff08;如增加写入开销&#xff09;。因此&#xff0c;选择合适的索引至关重要。 创建索引&#xff1a; 为经常用于WHERE子句、JOIN条件和ORDER BY排序的列创建索引。 CREATE I…...

数字校园:信息时代的教育新形态

现如今&#xff0c;我们生活在一个信息爆炸的时代&#xff0c;每一天都有海量的信息产生。而在教育领域&#xff0c;也正在经历一场数字化的变革&#xff0c;这就是所谓的“数字校园”。数字校园可不是简单的把课本搬到电脑上那么简单&#xff0c;它其实是一个综合性的平台&…...

数字产业化和产业数字化到底是什么?

“数字产业化”和“产业数字化”在很多官方文件和领导人讲话中都是成对出现的&#xff0c;这两个术语看起来非常相似&#xff0c;但它们作为数字经济的两个重要组成部分&#xff0c;既有联系又有区别。 在谈数字产业化和产业数字化之前&#xff0c;我这里需要先给大家介绍一个概…...

每日十题八股-2024年12月14日

1.类加载器有哪些&#xff1f; 2.双亲委派模型的作用 3.讲一下类加载过程&#xff1f; 4.讲一下类的加载和双亲委派原则 5.什么是Java里的垃圾回收&#xff1f;如何触发垃圾回收&#xff1f; 6.判断垃圾的方法有哪些&#xff1f; 7.垃圾回收算法是什么&#xff0c;是为了解决了…...

大模型呼入机器人有哪些功能特点?(转)

大模型呼入机器人有哪些功能特点&#xff1f;(转) 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 大模型呼入机器人&#xff0c;作为现代通信技术与人工智能深度融合的产物&#xff0c;正逐渐成为企业提升服务…...

EasyExcel设置表头上面的那种大标题(前端传递来的大标题)

1、首先得先引用easyExcel的版本依赖&#xff0c;我那 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency> 2、然后得弄直接的实体类&#xff0c;&…...

[笔记] 编译LetMeowIn(C++汇编联编程序)过程

文章目录 前言过程下载源码vs2017 创建空项目 引入编译文件改项目依赖属性改汇编编译属性该项目还需注意编译运行 总结 前言 编译LetMeowin 项目发现是个混编项目&#xff0c;c调用汇编的程序&#xff0c;需要配置一下&#xff0c;特此记录一下 过程 下载源码 首先下载源码…...

(三)机器学习 - 标准差/方差

标准差 标准差是统计学中一个非常重要的概念&#xff0c;它用来衡量一组数据的离散程度&#xff0c;即数据点与平均值之间的偏离程度。标准差越大&#xff0c;表示数据点越分散&#xff1b;标准差越小&#xff0c;表示数据点越集中。 标准差的计算步骤如下&#xff1a; 计算数…...