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

前言

前面三章将数据初步整理出来:
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 threadingdef 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.05num_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.hqwc.cn/news/150763.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

喜讯 | 同立海源CGT核心原料CD28单抗完成FDA DMF备案

喜 讯 GOOD NEWS 近日,北京同立海源生物科技有限公司(简称“同立海源”)的CGT核心原料CD28单抗成功获得美国FDA DMF备案,DMF备案号:038820。 您的细胞治疗研究项目在进行临床申请或新药注册的文件中可直接引用DMF备…

【C语言】字符函数与字符串函数

简单不先于复杂,而是在复杂之后。 目录 0. 前言 1. 函数介绍 1.1 strlen 1.1.1 介绍 1.1.2 strlen 函数模拟实现 1.1.2.1 计数器方法 1.1.2.2 递归方法 1.1.2.3 指针 - 指针方法 1.2 strcpy 1.2.1 介绍 1.2.2 strcpy 函数模拟实现 1.3 strcat 1…

Google play 应用下架、封号常见原因:8.3/10.3分发协议及恶意软件政策问题浅析

相信大多数谷歌Android开发者都遭遇过应用下架、账号被封的情况,尤其对于想通过上传马甲包、矩阵方式来获得更多收益的开发者来说,想必应用下架、拒审、账号被封已经是家常便饭了,同时也为此烦恼。 造成这种情况的原因有很多,且每…

浅谈信息化与数字化

一、信息化/数字化的概念 信息化、数字化按字面意思理解,这两个词的确代表了不同的含义。但是也不可否认,在目前我们可以接触到的信息平台来看。信息化、数字化很多时候都被混在一起了。 那么,既然今天要聊这个话题。我们得先把这两个词分清…

【k8s】kubeadm安装k8s集群

一、环境部署 master192.168.88.10docker、kubeadm、kubelet、kubectl、flannelnode01192.168.88.20docker、kubeadm、kubelet、kubectl、flannelnode02192.168.88.30docker、kubeadm、kubelet、kubectl、flannelhub.lp.com192.168.88.40 docker、docker-compose harbor-offli…

软考高项(十四)项目沟通管理 ★重点集萃★

👑 个人主页 👑 :😜😜😜Fish_Vast😜😜😜 🐝 个人格言 🐝 :🧐🧐🧐说到做到,言出必行&am…

EtherNet Ip工业RFID读写器与欧姆龙PLC 配置示例说明

一、准备阶段 POE交换机欧姆龙PLC 支持EtherNet Ip协议CX-Programmer 9.5配置软件 二、配置读卡器 1、打开软件 2、选择网卡,如果多网卡的电脑请注意对应所接的网卡,网卡名一般为“Network adapter Realtek PCIe GBE Family” 3、点击“选择网卡”&…

SEACALL海外呼叫中心系统的优势包括

SEACALL海外呼叫中心系统的优势包括 封卡封号问题解决 海外呼叫中心系统通过API开放平台能力,定制电话营销系统,提供多项功能如自动拨打、智能应答、真人语音交互等,帮助企业克服员工离职率高、客户资源流失严重等挑战。 - 高级管理者操控 …

基于SSM的二手车交易系统

基于SSM的二手车交易系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 摘要 基于SSM(Spring、SpringMVC、MyBatis&a…

Linux权限及Xshell运行原理

目录 1.Linux中的用户 1.1 用户分类 1.2 用户切换 2.权限的概念 2.1 权限概念以及表示 2.2 文件属性以及类型 2.2.1 文件属性 2.2.2 文件类型 2.3 Linux下的角色 3.权限的修改 3.1 chmod 3.2 chown 3.3 chgrp 4.目录权限 5.权限掩码 5.1 默认权限 5.2 起始权限…

Vue(uniapp)父组件方法和子组件方法执行优先顺序

涉及到的知识点:watch监控:先看问题,父组件从后端通过$ajax获取数据,在将父组件将值传输给子组件,使用子组件使用created钩子函数获取数据,按自己的想法应该是父组件先获取后端数据,在传入给子组…

Spring Cloud之微服务

目录 微服务 微服务架构 微服务架构与单体架构 特点 框架 总结 SpringCloud 常用组件 与SpringBoot关系 版本 微服务 微服务:从字面上理解即:微小的服务; 微小:微服务体积小,复杂度低,一个微服…