Press "Enter" to skip to content

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

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

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

 

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

 

 

一、APK拆包

 

一般的方法有两种

 

 

    1. 由google开发的apktool。

 

    1. 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 + '
')

 

通过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('
')
        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('
')  # 去掉列表中每一个元素的换行符
                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('
')  # 去掉列表中每一个元素的换行符
                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 + '
')
# 对单个文件拆包出权限,并写入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('
')  # 去掉列表中每一个元素的换行符
            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('
')  # 去掉列表中每一个元素的换行符
                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

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注