基于python深度学习的apk风险预测脚本

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

一、APK拆包

一般的方法有两种

  1. 由google开发的apktool。
  2. python的androguard包。

网上关于apktool的教程比较多,但是笔者在尝试使用后发现,

  1. apktool是基于java开发的,而机器学习由python控制,虽然可以利用python控制apktool,但有点多此一举。

  2. 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风险预测脚本的更多相关文章

  1. 利用python深度学习算法来绘图

    可以画画啊!可以画画啊!可以画画啊! 对,有趣的事情需要讲三遍. 事情是这样的,通过python的深度学习算法包去训练计算机模仿世界名画的风格,然后应用到另一幅画中,不多说直接上图! 这个是世界名画& ...

  2. 基于深度学习的建筑能耗预测01——Anaconda3-4.4.0+Tensorflow1.7+Python3.6+Pycharm安装

    基于深度学习的建筑能耗预测-2021WS-02W 一,安装python及其环境的设置 (写python代码前,在电脑上安装相关必备的软件的过程称为环境搭建) · 完全可以先安装anaconda(会自带 ...

  3. 解析基于keras深度学习框架下yolov3的算法

    一.前言 由于前一段时间以及实现了基于keras深度学习框架下yolov3的算法,本来想趁着余热将自己的心得体会进行总结,但由于前几天有点事就没有完成计划,现在趁午休时间整理一下. 二.Keras框架 ...

  4. 时间序列深度学习:seq2seq 模型预测太阳黑子

    目录 时间序列深度学习:seq2seq 模型预测太阳黑子 学习路线 商业中的时间序列深度学习 商业中应用时间序列深度学习 深度学习时间序列预测:使用 keras 预测太阳黑子 递归神经网络 设置.预处 ...

  5. 参考分享《Python深度学习》高清中文版pdf+高清英文版pdf+源代码

    学习深度学习时,我想<Python深度学习>应该是大多数机器学习爱好者必读的书.书最大的优点是框架性,能提供一个"整体视角",在脑中建立一个完整的地图,知道哪些常用哪些 ...

  6. 7大python 深度学习框架的描述及优缺点绍

    Theano https://github.com/Theano/Theano 描述: Theano 是一个python库, 允许你定义, 优化并且有效地评估涉及到多维数组的数学表达式. 它与GPUs ...

  7. 蛋白质组DIA深度学习之谱图预测

    目录 1. 简介 2. 近几年发表的主要工具 1.DeepRT 2.Prosit 3. DIANN 4.DeepDIA 1. 简介 基于串联质谱的蛋白质组学大部分是依赖于数据库(database se ...

  8. 好书推荐计划:Keras之父作品《Python 深度学习》

    大家好,我禅师的助理兼人工智能排版住手助手条子.可能非常多人都不知道我.由于我真的难得露面一次,天天给禅师做底层工作. wx_fmt=jpeg" alt="640? wx_fmt= ...

  9. 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 ...

随机推荐

  1. clojure配置

    1.转换clojure工程为eclipse工程 Install Counterclockwise plugin in Eclipse (from eclipse marketplace). This ...

  2. java web课程设计(简单商城的前后端双系统,基于maven三模块开发)

    1.系统分析 1.1需求分析 实现一个简单但功能完整的商城项目,从设计到实现,规范化完成该项目,锻炼javaweb项目的编写能力,理解软件工程的软件设计思想 1.2编程技术简介 本次课程主要使用的软件 ...

  3. YARN的工作过程

    yarn的工作执行流程图 1.用户向YARN中提交应用程序 2.ResourceManager为该应用程序找到一个可用的NodeManager 并分配一个Container,然后在这个Containe ...

  4. 【SpringMVC】获取请求参数

    通过ServletAPI获取 test.html <a th:href="@{/testServletAPI(username='admin',password=123456)}&qu ...

  5. vue3.0入门(一)

    前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 使用方式 使用在线cdn 下载js文件并自托管,引入到项目后使用 使用npm安装后,用cli来构建项目 声明式渲染 Vue2需引入v ...

  6. CSS3 animaion 和 transition 比较

    animation是CSS3的动画属性,可以设置以下六种属性. transition是CSS3的过度属性,可以设置以下四种属性. 从属性上分析,animation可以设定循环次数. 其次,两者的触发条 ...

  7. Photoshop 批量修改图像大小

  8. openresty lua_ssl_trusted_certificate 问题

    lua_ssl_trusted_certificate 语法: lua_ssl_trusted_certificate 默认: no 环境: http, server, location 指定一个 P ...

  9. 洛谷P2338 Bessie Slows Down S 题解

    题目 [USACO14JAN]Bessie Slows Down S 题解 这道题其实蛮简单的,不知道为什么难度划到了提高+,个人觉得这难度大概就是普及左右. 具体说说怎么做吧,简单模拟一下即可,始终 ...

  10. adb 常用命令大全(6)- 模拟按键输入

    语法格式 input [<source>] <command> [<arg>...] 物理键 # 电源键 adb shell input keyevent 26 # ...