基于python深度学习的apk风险预测脚本
基于python深度学习的apk风险预测脚本
为了有效判断安卓apk有无恶意操作,利用python脚本,通过解包apk文件,对其中xml文件进行特征提取,通过机器学习构建模型,预测位置的apk包是否有风险。

一、APK拆包
一般的方法有两种
- 由google开发的apktool。
- python的androguard包。
网上关于apktool的教程比较多,但是笔者在尝试使用后发现,
apktool是基于java开发的,而机器学习由python控制,虽然可以利用python控制apktool,但有点多此一举。
apktool对apk进行完全解包,浪费太多时间,在我准备构建的模型中有很多内容并不会使用。
固使用快速又强大的androguard。
from androguard.core.bytecodes import apk
import re
def get_permissions_one(filename):
app = apk.APK(filename)
permission = app.get_permissions()
with open(re.sub(r'.apk', '', filename) + '.txt', 'w', encoding='UTF-8')as f:
for temp in permission:
f.write(temp + '\n')
通过app.get_permissions()提取所有权限,利用正则写入txt文件。
关于androguard的更多命令可以看这篇博客,也可以看官方的API说明文档,本脚本只需要get_permissions()函数。、
先使用任意apk进行测试,执行结果如下:

得到了写入权限的txt文件。
网上有挺多恶意、正常apk例子,笔者是在网站下载的。
二、标准权限获取
之前提到实现类似功能的博客中,采用了动态标准。在解包apk文件的时候,每次遇到了新的权限,就将权限写入标准权限的列表。而笔者在尝试了几个常见apk(qq、微信等)后发现,由于安卓有各类延申的os,而不同软件又有各自生态,有各种各样权限。笔者认为太多的权限会导致最后的模型不准确,固选择直接从网上找了个安卓权限大全,进行正则提取。大全网址
import re
with open("带安卓权限.txt", "r", encoding='utf-8') as f: # 打开文件
data = f.read() # 读取文件
temp = re.findall(r'android.permission.(.+?),', data)
print(len(temp))
with open('带安卓权限简述.txt', 'w')as f1:
i = 0
while i < len(temp):
f1.write('android.permission.' + temp[i])
f1.write('\n')
i = i + 1
有三条不满足标准,手动补上
com.android.browser.permission.READ_HISTORY_BOOKMARKS
com.android.browser.permission.WRITE_HISTORY_BOOKMARKS
com.android.alarm.permission.SET_ALARM
于是得到了120条标准权限。

三、对照并得出抽象值
笔者对数据的抽象是这样设计的:
由于权限一共有120条,在解包万任一文件后,创建一个120*[0]的数组,将提取后txt中每条权限与标准权限对比,当匹配到相同的权限时,令全[0]的数组中对应元素为[1],这样就完成了数据抽象化。
关键代码:
def power_compare(filename):
standard = get_ready()
list = list_dir_read_txt(filename)
apk = []
for txt in list:
with open(txt, 'r')as f:
temp = [0] * 120
for line in f.readlines():
line = line.strip('\n') # 去掉列表中每一个元素的换行符
for i, power in enumerate(standard):
if line == power:
temp[i] = 1
apk.append(temp)
return apk
四、对抽象值进行处理
虽然用列表进行搜索,一个一个匹配挺蠢的,但是这么做确实是最简单的,直接贴代码吧。
def power_compare(filename):
standard = get_ready()
list = list_dir_read_txt(filename)
apk = []
for txt in list:
with open(txt, 'r')as f:
temp = [0] * 120
for line in f.readlines():
line = line.strip('\n') # 去掉列表中每一个元素的换行符
for i, power in enumerate(standard):
if line == power:
temp[i] = 1
apk.append(temp)
return apk
五、通过算法得到模型
使用sklearn,简单暴力。
第一次只用了朴素贝叶斯,其他的算法也就改个名称换个参数,差不多(大概吧)
sklearn只认numpy里的数组,强转一下,扔进去就完事了,笔者第一次学习,也没分训练组和测试组,只体验了一下流程。
from data_get import *
import numpy as np
from sklearn.naive_bayes import GaussianNB
safe, dangerous = data_get()
clf = GaussianNB()
train = np.asarray(safe + dangerous)
target = np.asarray(len(safe)*[0] + len(dangerous)*[1])
clf.fit(train, target)
六、完整代码
之前省略了挺多正则处理还有读写文件,全扔这里了,希望对你有帮助。
data_get.py
# -*— codeing = utf-8 -*-
from androguard.core.bytecodes import apk
import re
import os
def get_permissions_one(filename):
app = apk.APK(filename)
permission = app.get_permissions()
with open(re.sub(r'.apk', '', filename) + '.txt', 'w', encoding='UTF-8')as f:
for temp in permission:
f.write(temp + '\n')
# 对单个文件拆包出权限,并写入txt文件
def get_safe_permissions():
print('开始读取安全文件')
list = list_dir_read_apk('安全文件')
for file in list:
get_permissions_one(file)
print('读取完毕!')
# 读取安全文件并记录其权限
def get_dangerous_permissions():
print('开始读取危险文件')
list = list_dir_read_apk('危险文件')
for file in list:
get_permissions_one(file)
print('读取完毕!')
# 读取危险文件并记录其权限
def list_dir_read_apk(file_dir):
dir_list = os.listdir(file_dir)
file = []
for cur_file in dir_list:
path = os.path.join(file_dir, cur_file)
if os.path.isfile(path):
if re.findall(r'.apk', path):
file.append(path)
if os.path.isdir(path):
# 递归读取所有照片夹子目录内容
list_dir_read_apk(path)
return file
# 读取目标文件夹内所有apk文件,并记录每一个的地址
def list_dir_read_txt(file_dir):
dir_list = os.listdir(file_dir)
file = []
for cur_file in dir_list:
path = os.path.join(file_dir, cur_file)
if os.path.isfile(path):
if re.findall(r'.txt', path):
file.append(path)
if os.path.isdir(path):
# 递归读取所有照片夹子目录内容
list_dir_read_apk(path)
return file
# 读取目标文件夹内所有txt文件,并记录每一个的地址
def get_ready():
power = []
with open('带安卓权限简述.txt', 'r')as f:
for line in f.readlines():
line = line.strip('\n') # 去掉列表中每一个元素的换行符
power.append(line)
return power
# 读入所有权限文件,写入集合文件,方便搜索
def power_compare(filename):
standard = get_ready()
list = list_dir_read_txt(filename)
apk = []
for txt in list:
with open(txt, 'r')as f:
temp = [0] * 120
for line in f.readlines():
line = line.strip('\n') # 去掉列表中每一个元素的换行符
for i, power in enumerate(standard):
if line == power:
temp[i] = 1
apk.append(temp)
return apk
# 比较权限,并写入数组
def data_get():
apk_safe = power_compare('安全文件')
apk_dangerous = power_compare('危险文件')
return apk_safe, apk_dangerous
# 获得数据
data_set.py
# -*— codeing = utf-8 -*-
from data_get import *
import numpy as np
from sklearn.naive_bayes import GaussianNB
safe, dangerous = data_get()
clf = GaussianNB()
train = np.asarray(safe + dangerous)
target = np.asarray(len(safe)*[0] + len(dangerous)*[1])
clf.fit(train, target)
七、参考文献
| 文献 | 链接 |
|---|---|
| 类似项目 | https://www.jianshu.com/p/670023af50f6 |
| androguard官方文档 | https://docs.koodous.com/yara/androguard/ |
| apk例子 | https://www.unb.ca/cic/datasets/invesandmal2019.html |
| 一个牛逼的完整的项目,以后有机会复现 | https://aistudio.baidu.com/aistudio/projectdetail/1562926?shared=1 |
| 一开始想自制数据集,后来发现没那么麻烦 | https://zhuanlan.zhihu.com/p/354146564 |
| sklearn官方文档,没看懂 | https://sklearn.apachecn.org/docs/master/37.html |
| 类似项目,写的很好,没看懂 | https://www.jianshu.com/p/0bf2eb488afa |
基于python深度学习的apk风险预测脚本的更多相关文章
- 利用python深度学习算法来绘图
可以画画啊!可以画画啊!可以画画啊! 对,有趣的事情需要讲三遍. 事情是这样的,通过python的深度学习算法包去训练计算机模仿世界名画的风格,然后应用到另一幅画中,不多说直接上图! 这个是世界名画& ...
- 基于深度学习的建筑能耗预测01——Anaconda3-4.4.0+Tensorflow1.7+Python3.6+Pycharm安装
基于深度学习的建筑能耗预测-2021WS-02W 一,安装python及其环境的设置 (写python代码前,在电脑上安装相关必备的软件的过程称为环境搭建) · 完全可以先安装anaconda(会自带 ...
- 解析基于keras深度学习框架下yolov3的算法
一.前言 由于前一段时间以及实现了基于keras深度学习框架下yolov3的算法,本来想趁着余热将自己的心得体会进行总结,但由于前几天有点事就没有完成计划,现在趁午休时间整理一下. 二.Keras框架 ...
- 时间序列深度学习:seq2seq 模型预测太阳黑子
目录 时间序列深度学习:seq2seq 模型预测太阳黑子 学习路线 商业中的时间序列深度学习 商业中应用时间序列深度学习 深度学习时间序列预测:使用 keras 预测太阳黑子 递归神经网络 设置.预处 ...
- 参考分享《Python深度学习》高清中文版pdf+高清英文版pdf+源代码
学习深度学习时,我想<Python深度学习>应该是大多数机器学习爱好者必读的书.书最大的优点是框架性,能提供一个"整体视角",在脑中建立一个完整的地图,知道哪些常用哪些 ...
- 7大python 深度学习框架的描述及优缺点绍
Theano https://github.com/Theano/Theano 描述: Theano 是一个python库, 允许你定义, 优化并且有效地评估涉及到多维数组的数学表达式. 它与GPUs ...
- 蛋白质组DIA深度学习之谱图预测
目录 1. 简介 2. 近几年发表的主要工具 1.DeepRT 2.Prosit 3. DIANN 4.DeepDIA 1. 简介 基于串联质谱的蛋白质组学大部分是依赖于数据库(database se ...
- 好书推荐计划:Keras之父作品《Python 深度学习》
大家好,我禅师的助理兼人工智能排版住手助手条子.可能非常多人都不知道我.由于我真的难得露面一次,天天给禅师做底层工作. wx_fmt=jpeg" alt="640? wx_fmt= ...
- Predicting effects of noncoding variants with deep learning–based sequence model | 基于深度学习的序列模型预测非编码区变异的影响
Predicting effects of noncoding variants with deep learning–based sequence model PDF Interpreting no ...
随机推荐
- GPIO引脚速度的应用匹配
GPIO 引脚速度: GPIO 引脚速度又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同 ...
- 读vue-cli3 官方文档的一些学习记录
原来一直以为vue@cli3 就是创建模板的工具,读了官方文档才知道原来这么有用,不少配置让我长见识了 Prefetch 懒加载配置 懒加载相信大家都是知道的,使用Import() 语法就可以在需要的 ...
- 并发控制--context篇
目录 1. 前言 2 Context 实现原理 2.1 接口定义 2.1 cancelCtx 2.1.1 Done()接口实现 2.1.2 Err()接口实现 2.1.3 cancel()接口实现 2 ...
- 一次PHP大马提权
记一次PHP提权 发现 PHP大马:指木马病毒:PHP大马,就是PHP写的提取站点权限的程序:因为带有提权或者修改站点功能,所以称为叫木马. 自从师哥那里听说过之后,一直感叹于PHP大马的神奇...但 ...
- 基于Nginx实现负载均衡的部署
Nginx(enginex)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器. nginx官方网站:http://nginx.org/ nginx plus收费软件, ...
- 干货:详解C++ sort函数的cmp参数!
学算法的第一天你在学冒泡.桶排 在你还没搞明白快排和归并的时候 你已经学到了数据结构最后的堆排序和希尔排序 可以说排序是很多竞赛生的噩梦-- 于是它诞生了 void std::sort() Sort ...
- vue 手写倒计时,样式需要自己调。( 亲测可用,就是没有样式 )
先写一个 js 文件,这个文件是工具类文件,需要单独开一个js // 计算出时间戳的具体数据:比如将85400转化为 n天n时n分n秒 export function formateTimeStamp ...
- K8S的核心概念
1.Pod -- 是最小部署单元 -- 是一组容器的集合 -- Pod中的容器共享网络 -- 生命周期是短暂的 2.controller -- 确保预期的pod副本的数量 -- 确保所有的node运行 ...
- 浅析Is-a,Has-a与like-a
在面向对象的设计领域里,有很多设计思路,主要有三种:is-a.has-a.like-a. 这三种在java的类.接口.抽象类中很多体现,下面简述一下其定义. 1.Is-a(继承关系) is-a,顾名思 ...
- Linux内核中的Workqueue机制分析
1. 什么是workqueue Linux中的workqueue(工作队列)主要是为了简化在内核创建线程而设计的.通过相应的工作队列接口,可以使开发人员只关心与特定功能相关的处理流程,而不必关心内核线 ...