安卓恶意应用识别(四)(特征处理与分类模型构建)——终结

news2024/9/22 4:50:45

前言

前面三章将数据初步整理出来:
1.安卓恶意应用识别(一)(Python批量爬取下载安卓应用)
2.安卓恶意应用识别(二)(安卓APK反编译)
3.安卓恶意应用识别(三)(批量反编译与属性值提取)
未涉及到任何机器学习部分,我们知道机器学习中特征选择是一个重要步骤,需要筛选出显著特征,摒弃非显著特征,这样可以提高训练速度,减少噪声干扰,提升模型效果。

1. 特征生成的方法

关于如何生成特征,我在一文归纳Python特征生成方法(全)中找到了相关信息。
在这里插入图片描述
如上图所示,根据生成方式可以分为分组聚合方式和转换方式。其中,分组聚合方式就是求原始数据的相关数学统计量,而转换方式就是将原始数据根据数据类型进行转换从而生成特征。

2. 字符串特征生成

由于上三篇基础得到的属性值为字符串,因此本章仅对字符串类型的数据进行特征生成,引用文献数据特征处理之文本型数据(特征值化一)。

先装一下sklearn包,发现仍然no moudle,于是查阅运行报错no module named sklearn,再安装一个模块叫scikit-learn,就没报错了。
这里仅仅对benign1中.xml文件的uses-permission的属性值做了特征生成,可以看到下图生成了稀疏矩阵(特征值矩阵)
上代码理解:

import re
from collections import Counter
from xml.dom.minidom import parse
from sklearn.feature_extraction.text import CountVectorizer
from character_handle.frequency_order import sample_get
def counter(arr):
    return Counter(arr)
list_uses_permission = []
# 加载XML,并提取属性值

xmldom = parse(sample_get.get_file("benign1"))

for element in xmldom.getElementsByTagName("uses-permission"):
    a = element.getAttribute("android:name")
    b = re.findall(r'\w{1,}', a)[-1]
    list_uses_permission.append(b)
count_v = CountVectorizer()
data = count_v.fit_transform(list_uses_permission)
# 输出标签为uses-permission的属性值(顺序)
print(list_uses_permission)
# 输出属性值列表(汇按照英文字母表的顺序排列)
print(count_v.get_feature_names())

# 输出词条列表对应的值化数据
print(data.toarray())

在这里插入图片描述
当然了,上面的只是在benign1中一个例子,因而每个属性值在这个矩阵中只会出现一次。但在实际训练之前,我们在确定了需要用到哪些经典特征值后,是需要以一个xml文件中是否出现这些经典特征值为依据来保存特征向量集合的。

3. 数据处理

首先说一下,目前我处理获取这些样本是需要比较大的内存的,我也不知道如何去改善他,除非反编译一个.xml文件后就将其他文件删除,这样全部获得的就是.xml文件,不需要占用很大空间,这种方法就自己去自动化实现了。本文主要基于大内存,我买了一张1个T的移动硬盘,所以这些样本,包括安装包等等都能装下,以便以后需要分析不同的文件使用,如果只是学方法,看到前面这些就够了。

3.1 原数据获取

本节主要把之前缺少的数据处理给补上,我又继续在360助手网站上爬取下载了安卓应用928个(其中有两个被腾讯管家报风险软件),暂且将其全部视为良性应用。然后,在github中(自行查看)下载了501个恶意应用暂且当作实验。
在这里插入图片描述
把恶意应用全部重命名,方法见Python 文件夹批量重命名,和良性应用相统一。
在这里插入图片描述

3.2 反编译数据获取

同样的,批量反编译良性和恶性应用的apk:

import datetime
import os
import subprocess
import threading


def execCmd(cmd):
    try:
        print("命令%s开始运行%s" % (cmd, datetime.datetime.now()))
        # os.system(cmd)
        subprocess.Popen(cmd, shell=True, stdout=None, stderr=None).wait()
        print("命令%s结束运行%s" % (cmd, datetime.datetime.now()))
    except:
        print('%s\t 运行失败' % (cmd))

def batchDecompile(cmds):
    if cmds:
        # if if_parallel:
            # 并行
            threads = []
            for cmd in cmds[0:20]:
                th = threading.Thread(target=execCmd, args=(cmd,))
                print("start !!!!!!!!")
                th.start()
                threads.append(th)

            # 等待线程运行完毕
            for th in threads:
                # 现在有 A, B, C 三件事情,只有做完 A 和 B 才能去做 C,而 A 和 B 可以并行完成。
                th.join()
                print("OK!!!!!!!!!!!")
            del cmds[0: 20]
            return batchDecompile(cmds)
   

# 需要执行的命令
cmds = ["F: & cd F:\\benign_apk & " + "apktool.bat d -f " + "benign" + str(i) + ".apk" for i in range(276,929)]
# 良性应用有929个,因为我之前不会彻底批量化,只能手动批量化处理了275个,现在这个程序是能够直接批量化处理到底的
batchDecompile(cmds)

这是一个漫长的时间,等待二者都全部反编译完成后。

3.3 特征获取

我们在上述批量化反编译中已经得到了500个良性和500个恶意样本,接着对其进行权限属性提取(代码在第2节有),每个样本都是一个列表,其中包含多个(可能重复)的属性值

# 如下
benign_samples = [ ["send_msg","call"..."call" .. ], [  samples2  ], ... ,[samples  n] ]
malicious_samples = [ ["send_msg","call"..."call" .. ], [  samples2  ], ... ,[samples  n] ]

然后,再对其进行特征向量获取,我在这里使用了改进的TF-IDF算法[1](见参考引文)对特征进行提取:

# 计算单个特征属性在正例样本中和在反例样本中的TF-IDF平均值差异
def compute_feature_difference(positive_samples, negative_samples):
    vectorizer = TfidfVectorizer()

    # 将文档转换为TF-IDF特征向量
    positive_tfidf_matrix = vectorizer.fit_transform([" ".join(sample) for sample in positive_samples])
    negative_tfidf_matrix = vectorizer.transform([" ".join(sample) for sample in negative_samples])

    # 计算平均值
    positive_avg_tfidf = positive_tfidf_matrix.mean(axis=0)
    negative_avg_tfidf = negative_tfidf_matrix.mean(axis=0)

    # 计算差异
    tfidf_difference = np.abs(positive_avg_tfidf - negative_avg_tfidf)
    return tfidf_difference


# 选择差异绝对值前5%的特征作为特征子集
def select_top_features(tfidf_difference):
    # 计算前5%特征属性的数量
    top_percentage = 0.05
    num_top_features = int(tfidf_difference.shape[1] * top_percentage)

    # 获取前5%特征属性的索引
    top_feature_indices = np.argsort(tfidf_difference.A1)[::-1][:num_top_features]
    return top_feature_indices


# 使用你的改进版TF-IDF算法将文档转换为TF-IDF矩阵
tfidf_difference = compute_feature_difference(positive_samples, negative_samples)
selected_features = select_top_features(tfidf_difference)

# 使用选定的特征子集构建TF-IDF特征矩阵
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform([" ".join(sample) for sample in positive_samples + negative_samples])
tfidf_matrix_selected = tfidf_matrix[:, selected_features]

# 标签:1表示正例,0表示负例
labels = [1] * len(positive_samples) + [0] * len(negative_samples)

构建好样本之后,就可以开始带入机器学习模型进行分类了:

# 创建SVM分类器
svm_classifier = SVC(kernel='linear', random_state=42)

# 定义交叉验证的评估指标(这里使用准确度)
scoring = make_scorer(accuracy_score)

# 进行十折交叉验证
cross_val_scores = cross_val_score(svm_classifier, tfidf_matrix_selected, labels, cv=10, scoring=scoring)

# 打印每折交叉验证的准确度
print("Cross-Validation Accuracy Scores:", cross_val_scores)

# 打印平均准确度
print("Mean Accuracy:", np.mean(cross_val_scores))

以下为十折交叉验证得到平均的准确率,因为我跑的时候只用了200个样本(良性100,恶意100),所以可能结果不尽如人意,你们可以尝试自己修改样本个数,筛选前百分之k,作为特征子集,以提高分类器的效率。
在这里插入图片描述
以上算法的思想来自于:
[1]潘建文,张志华,林高毅等.基于特征选择的恶意Android应用检测方法[J/OL].计算机工程与应用:1-10[2023-10-25].http://kns.cnki.net/kcms/detail/11.2127.tp.20221104.1411.008.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1132275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一张Lambda大数据架构架构图

架构图 大数据的架构包括了Lambda架构和Kappa架构,Lambda架构分解为三层:即批处理层、加速层和服务层;Kappa架构不同于Lambda同时计算流计算和批计算并合并视图,Kappa只会通过流计算一条的数据链路计算并产生视图。 该系统的大数…

1024程序员节|是时候,展示真正的实力了!

“代码改变世界,开源创造未来” 一年一度的程序员节如期而至! 在由“0”和“1”构建的二进制世界里 运行程序的硬件进制基础是“1024” 因此,将每一年的10月24日定为“程序员节” 而作为码出每一个1024的程序员 则是这个“二进制世界”里…

*Django中的Ajax jq的书写样式1

导入插件,导入jquery,json是添加的json文件 Ajax的get请求与post请求 urls.py path(in3/,views.in3), views.py def in3(request):return render(request,07.html) 要返回数据的path没有写,html就是下面图片中控制台的内容,记得传递参数…

图片gif怎么做?这一招分分钟制作

在现代的通讯工具中,gif动态表情已经是人们日常必不可少的一种交流工具了。当我们想要自己制作gif动画图片的时候该怎么办呢?这时候,只需要使用GIF中文网的gif图片制作(https://www.gif.cn/)功能,上传多张静…

MySQL恢复不小心误删的数据记录(binlog)-生产实操

同事操作删除生产数据时,未及时备份导致误删除部份数据。现通过mysql的binlog日志回滚数据。 1.由于我们第一时间找到相应的操作时间的大概在12点~13点之间操作删除了product和product_item表的部份数据。因此我们只要找到这期间的binlog文件就行了, 脚…

【字符串】【字符串和字符数组的相互转化】Leetcode 541 反转字符串 II

【字符串】【toCharArray & String st new String(ch)】Leetcode 541 反转字符串 II 字符串和字符数组的相互转化:star:解法1 字符串和字符数组的相互转化⭐️ 解法1 时间复杂度O(N) 这个解法的时间复杂度是O(N),其中N是字符串的长度。…

美颜SDK集成指南:为应用添加视频美颜功能

随着社交媒体和直播应用的兴起,视频美颜功能已成为用户追求的一项热门特性。用户希望能够在拍摄照片或进行实时视频直播时,使用美颜功能来增强其外观。为了满足这一需求,开发者可以考虑集成美颜SDK,为其应用增加这一吸引人的功能。…

花生供应链中的沙门氏菌、大肠杆菌和肠杆菌: 从农场到餐桌

1.1Title:Salmonella, Escherichia coli and Enterobacteriaceae in the peanut supply chain: From farm to table 1.2 Author: Nascimento M. S. 1.3 机构:Campinas University 1.4 分区/影响因子:Q1/6.475 1.5 期刊:FOOD RESEARCH INT…

linux,windows命令行输出控制指令,带颜色的信息,多行刷新,进度条效果,golang

一、带颜色的信息 linux 颜色及模式编号 // 前景 背景 颜色 // --------------------------------------- // 30 40 黑色 // 31 41 红色 // 32 42 绿色 // 33 43 黄色 // 34 44 蓝色 // 35 45 紫红色 // 36 46 青蓝色 // 37 47 白色 // // 模式代码 意义 //…

接口测试到底怎么做,5分钟时间看完这篇文章彻底搞清楚!

01、通用的项目架构 02、什么是接口 接口:服务端程序对外提供的一种统一的访问方式,通常采用HTTP协议,通过不同的url,不同的请求类型(GET、POST),不同的参数,来执行不同的业务逻辑。…

SpringBoot中对Spring AOP的实现

文章目录 SpringBoot中对Spring AOP的实现AOP简介引入依赖AOP体系与概念编写AOP切面类启动SpringBoot项目然后访问controller控制器对环绕通知放行execution表达式的含义通过注解方式定义切点 SpringBoot中对Spring AOP的实现 AOP简介 AOP (Aspect Oriented Programming), 面…

模拟线程死锁现象:两个线程同时抢两个互斥锁

下面业务逻辑的分析 1.如果 flag 为 T,线程 A 就会先得到 / 持有 o1 对象锁,然后尝试去获取 o2 对象锁 2.如果线程 A 得不到 o2 对象锁,就会 Blocked 3.如果 flag 为 F ,线程 B 就会先得到 / 持有 o2 对象锁,然后尝试去…

【python】numpy常用属性

文章目录 np.rangenp.quantilenp.digitizenp.randomrandseedpermutation np.uniquenp.zerosnp.sumnp.logtransposebool判断 首先导入numpy import numpy as npnp.range np.range(start, end, step): 获取指定区间和步长的列表。 np.arange(0, 1, 0.1) # 区间: [0, 1), 步长…

大疆 dji mini4pro 不同充电器头 充电速度

协议 dp100w 头线 充电功率33.2w 指示灯快闪 一加手机官方充电头线(协议:wrap65w闪充) 12.1w 指示灯慢闪 官方 DJI Mini 4 Pro - 技术参数 - DJI 大疆创新 总结 买pd快充协议的头线即可。

(三)库存超卖案例实战——使用redis分布式锁解决“超卖”问题

前言 在上一节内容中我们介绍了如何使用mysql数据库的传统锁(行锁、乐观锁、悲观锁)来解决并发访问导致的“超卖问题”。虽然mysql的传统锁能够很好的解决并发访问的问题,但是从性能上来讲,mysql的表现似乎并不那么优秀&#xff…

ATA-8061射频功率放大器在心室导管式扩压电式测力传感器中的应用

心室导管式扩压电式测力传感器是一种广泛应用于心血管领域的关键设备,用于测量心脏内部的压力变化。本文将主要介绍关于压电式测力传感器的相关知识概念,以及功率放大器在心室导管式扩压电式测力传感器研究中的重要应用。我们通过对传感器原理和功率放大…

使用 JDAudioCrawler 将下载的音频存储到本地存储

前言 在当今数字化时代,音频数据的获取和处理变得越来越重要。本文将访问网易云音乐为案例,介绍如何使用JDAudioCrawler这个强大的工具,将音频数据存储下载到本地存储中。将详细介绍实现的流程和代码细节。 什么是 JDAudioCrawler DAudioC…

2023运营级别网赚网盘平台搭建(源码+教程)

023运营级别网赚网盘平台搭建(源码教程) 为什么要自己搭建网盘,现在许多大厂的网盘,文件都添加了许多限制,有好多文件会遭到和谐,而且大部分网盘也都会限速,不开通VIP是很难用的!这…

【Docker】Docker Compose服务依赖与健康检查

docker compose环境变量 为增加安全性,在前面的python例子中增加redis的密码校验,密码从环境变量中获取: from flask import Flask from redis import StrictRedis import os import socketapp Flask(__name__) redis StrictRedis(hostos…

企业在数字化转型时如何通过SD-WAN保证业务连续性

企业数字化建设离不开高品质的网络,随着信息化系统和应用的部署,传统网络线路逐渐暴露出不同的问题,包括: 线路资源利用率低易造成浪费 关键业务流量被抢占,缺乏保障 网络不可视,无法实时查看线路情况 故…