基于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。

  1. from androguard.core.bytecodes import apk
  2. import re
  3. def get_permissions_one(filename):
  4. app = apk.APK(filename)
  5. permission = app.get_permissions()
  6. with open(re.sub(r'.apk', '', filename) + '.txt', 'w', encoding='UTF-8')as f:
  7. for temp in permission:
  8. f.write(temp + '\n')

通过app.get_permissions()提取所有权限,利用正则写入txt文件。

关于androguard的更多命令可以看这篇博客,也可以看官方的API说明文档,本脚本只需要get_permissions()函数。、

先使用任意apk进行测试,执行结果如下:

得到了写入权限的txt文件。

网上有挺多恶意、正常apk例子,笔者是在网站下载的。

二、标准权限获取

之前提到实现类似功能的博客中,采用了动态标准。在解包apk文件的时候,每次遇到了新的权限,就将权限写入标准权限的列表。而笔者在尝试了几个常见apk(qq、微信等)后发现,由于安卓有各类延申的os,而不同软件又有各自生态,有各种各样权限。笔者认为太多的权限会导致最后的模型不准确,固选择直接从网上找了个安卓权限大全,进行正则提取。大全网址

  1. import re
  2. with open("带安卓权限.txt", "r", encoding='utf-8') as f: # 打开文件
  3. data = f.read() # 读取文件
  4. temp = re.findall(r'android.permission.(.+?),', data)
  5. print(len(temp))
  6. with open('带安卓权限简述.txt', 'w')as f1:
  7. i = 0
  8. while i < len(temp):
  9. f1.write('android.permission.' + temp[i])
  10. f1.write('\n')
  11. i = i + 1

有三条不满足标准,手动补上

  1. com.android.browser.permission.READ_HISTORY_BOOKMARKS
  2. com.android.browser.permission.WRITE_HISTORY_BOOKMARKS
  3. com.android.alarm.permission.SET_ALARM

于是得到了120条标准权限。

三、对照并得出抽象值

笔者对数据的抽象是这样设计的:

由于权限一共有120条,在解包万任一文件后,创建一个120*[0]的数组,将提取后txt中每条权限与标准权限对比,当匹配到相同的权限时,令全[0]的数组中对应元素为[1],这样就完成了数据抽象化。

关键代码:

  1. def power_compare(filename):
  2. standard = get_ready()
  3. list = list_dir_read_txt(filename)
  4. apk = []
  5. for txt in list:
  6. with open(txt, 'r')as f:
  7. temp = [0] * 120
  8. for line in f.readlines():
  9. line = line.strip('\n') # 去掉列表中每一个元素的换行符
  10. for i, power in enumerate(standard):
  11. if line == power:
  12. temp[i] = 1
  13. apk.append(temp)
  14. return apk

四、对抽象值进行处理

虽然用列表进行搜索,一个一个匹配挺蠢的,但是这么做确实是最简单的,直接贴代码吧。

  1. def power_compare(filename):
  2. standard = get_ready()
  3. list = list_dir_read_txt(filename)
  4. apk = []
  5. for txt in list:
  6. with open(txt, 'r')as f:
  7. temp = [0] * 120
  8. for line in f.readlines():
  9. line = line.strip('\n') # 去掉列表中每一个元素的换行符
  10. for i, power in enumerate(standard):
  11. if line == power:
  12. temp[i] = 1
  13. apk.append(temp)
  14. return apk

五、通过算法得到模型

使用sklearn,简单暴力。

第一次只用了朴素贝叶斯,其他的算法也就改个名称换个参数,差不多(大概吧)

sklearn只认numpy里的数组,强转一下,扔进去就完事了,笔者第一次学习,也没分训练组和测试组,只体验了一下流程。

  1. from data_get import *
  2. import numpy as np
  3. from sklearn.naive_bayes import GaussianNB
  4. safe, dangerous = data_get()
  5. clf = GaussianNB()
  6. train = np.asarray(safe + dangerous)
  7. target = np.asarray(len(safe)*[0] + len(dangerous)*[1])
  8. clf.fit(train, target)

六、完整代码

之前省略了挺多正则处理还有读写文件,全扔这里了,希望对你有帮助。

data_get.py

  1. # -*— codeing = utf-8 -*-
  2. from androguard.core.bytecodes import apk
  3. import re
  4. import os
  5. def get_permissions_one(filename):
  6. app = apk.APK(filename)
  7. permission = app.get_permissions()
  8. with open(re.sub(r'.apk', '', filename) + '.txt', 'w', encoding='UTF-8')as f:
  9. for temp in permission:
  10. f.write(temp + '\n')
  11. # 对单个文件拆包出权限,并写入txt文件
  12. def get_safe_permissions():
  13. print('开始读取安全文件')
  14. list = list_dir_read_apk('安全文件')
  15. for file in list:
  16. get_permissions_one(file)
  17. print('读取完毕!')
  18. # 读取安全文件并记录其权限
  19. def get_dangerous_permissions():
  20. print('开始读取危险文件')
  21. list = list_dir_read_apk('危险文件')
  22. for file in list:
  23. get_permissions_one(file)
  24. print('读取完毕!')
  25. # 读取危险文件并记录其权限
  26. def list_dir_read_apk(file_dir):
  27. dir_list = os.listdir(file_dir)
  28. file = []
  29. for cur_file in dir_list:
  30. path = os.path.join(file_dir, cur_file)
  31. if os.path.isfile(path):
  32. if re.findall(r'.apk', path):
  33. file.append(path)
  34. if os.path.isdir(path):
  35. # 递归读取所有照片夹子目录内容
  36. list_dir_read_apk(path)
  37. return file
  38. # 读取目标文件夹内所有apk文件,并记录每一个的地址
  39. def list_dir_read_txt(file_dir):
  40. dir_list = os.listdir(file_dir)
  41. file = []
  42. for cur_file in dir_list:
  43. path = os.path.join(file_dir, cur_file)
  44. if os.path.isfile(path):
  45. if re.findall(r'.txt', path):
  46. file.append(path)
  47. if os.path.isdir(path):
  48. # 递归读取所有照片夹子目录内容
  49. list_dir_read_apk(path)
  50. return file
  51. # 读取目标文件夹内所有txt文件,并记录每一个的地址
  52. def get_ready():
  53. power = []
  54. with open('带安卓权限简述.txt', 'r')as f:
  55. for line in f.readlines():
  56. line = line.strip('\n') # 去掉列表中每一个元素的换行符
  57. power.append(line)
  58. return power
  59. # 读入所有权限文件,写入集合文件,方便搜索
  60. def power_compare(filename):
  61. standard = get_ready()
  62. list = list_dir_read_txt(filename)
  63. apk = []
  64. for txt in list:
  65. with open(txt, 'r')as f:
  66. temp = [0] * 120
  67. for line in f.readlines():
  68. line = line.strip('\n') # 去掉列表中每一个元素的换行符
  69. for i, power in enumerate(standard):
  70. if line == power:
  71. temp[i] = 1
  72. apk.append(temp)
  73. return apk
  74. # 比较权限,并写入数组
  75. def data_get():
  76. apk_safe = power_compare('安全文件')
  77. apk_dangerous = power_compare('危险文件')
  78. return apk_safe, apk_dangerous
  79. # 获得数据

data_set.py

  1. # -*— codeing = utf-8 -*-
  2. from data_get import *
  3. import numpy as np
  4. from sklearn.naive_bayes import GaussianNB
  5. safe, dangerous = data_get()
  6. clf = GaussianNB()
  7. train = np.asarray(safe + dangerous)
  8. target = np.asarray(len(safe)*[0] + len(dangerous)*[1])
  9. 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. 二 MongoDB数据类型和$type操作符

    一.MongoDB中可以使用的类型如下表所示 二.$type操作符 举个例子:想获取指定集合中title为String类型的所有文档

  2. 并发控制--context篇

    目录 1. 前言 2 Context 实现原理 2.1 接口定义 2.1 cancelCtx 2.1.1 Done()接口实现 2.1.2 Err()接口实现 2.1.3 cancel()接口实现 2 ...

  3. nginx《一安装》

    linux上nginx相关 wget https://nginx.org/download/nginx-1.14.1.tar.gz tar -zxvf nginx-1.14.1.tar.gz ./co ...

  4. vscode Markdown Preview Enhanced 安装配置

    打开VSCode 打开Externsion,可通过Ctrl+Shift+X 选中 Markdown Preview Enhanced并install即可 配置Preview风格: Magage -&g ...

  5. Servlet学习笔记(三)之HttpServletResponse

    init() 方法中参数 ServletConfig 对象使用 通过ServletConfig 获得 ServletContext对象 使用 HttpServletRequest 与HttpServl ...

  6. jenkins AWS CodeDeploy不停机部署

    此项目的特点是把Jenkins与CodeDeploy相结合做的CICD做的蓝绿发布,CI与CD 是分开的,CI构建完以后以BuildNumber的形式把war包存至AWS的S3桶中.同时在java项目 ...

  7. Pytest系列(3) - setup和teardown的详细使用

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 用过unittest的童鞋都 ...

  8. fwm环境APP菜品数据加载失败的优化操作

    1)在项目的.env文件中添加如下一行: RESPONSE_CACHE_ENABLED=true 2)拷贝 laravel-worker.conf.example,将laravel字段替换为域名,并执 ...

  9. CSS导航菜单(二级菜单)

    index.html <div class="nav"> <ul> <li> <a href="#">Java& ...

  10. webService动态调用及返回至处理

    http://www.cnblogs.com/xffy1028/archive/2012/05/07/2487595.html using System; using System.Collectio ...