• 安卓恶意应用识别(三)(批量反编译与属性值提取)


    前言

    上篇说到对安卓APK反编译,本篇实现批量反编译和批量特征提取及计算,主要就是通过python代码与cmd进行批量化交互,我在写文章之前,尝试批量下载了安卓apk(大约10来个),发现现在这个应用软件不是一般的大啊,无奈电脑内存不太够,现仅将已下载10个apk作为示例展示。

    1. 批量反编译

    思路是这样:
    第一步:调用cmd,读取指定路径下的文件,path+benign+k(k=1,2…n),进行反编译
    第二步:结果就自动放到该文件夹目录下
    出现的问题是os.system调用了cmd后立马又关闭,无法持续执行命令,看到文章windows系统如何使用python执行多条命令行命令
    代码如下(我的cmd命令在pycharm中设定的就是malware_identification下):

    def oper_cmd(apk):
        cmd_str = "cd ../restore & "+"apktool.bat d -f " + apk
        print(cmd_str)
        return subprocess.Popen(cmd_str, shell=True, stdout=None, stderr=None).wait()
    for i in range(1,11):
        apk = "benign" + str(i) + ".apk"
        oper_cmd(apk)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    执行如下图,开始批量反编译:
    在这里插入图片描述
    批量反编译成功!
    在这里插入图片描述

    2. 单文件特征提取

    看到xml标签项和属性值,假设我们需要提取的特征就是属性值的最后一个字符串。
    在这里插入图片描述
    直接上提取代码,这里用到了xml.dom和正则表达式:

    # 获取xml文件当中某个标签的属性值
    import re
    from xml.dom.minidom import parse
    
    from character_handle.frequency_order import config_file
    
    xmldom = parse(config_file) # 加载XML
    
    
    for element in xmldom.getElementsByTagName("uses-permission"):
        a = element.getAttribute("android:name")
        b = re.findall(r'\w{1,}', a)[-1]
        print(b)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    成功取出,同理,更改TagName也可以获取其他标签的属性值。
    在这里插入图片描述
    多做一步,计算特征属性值出现的频次:

    # 获取xml文件当中某个标签的属性值
    import re
    from collections import Counter
    from xml.dom.minidom import parse
    
    from character_handle.frequency_order import sample_get
    def counter(arr):
        return Counter(arr)
    xmldom = parse(sample_get.get_file("benign1")) # 加载XML
    # 多做一步,将每个特征存储为一个list,然后count
    list_uses_permission = []
    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)
    c = counter(list_uses_permission)
    print(c)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    3. 批量文件特征提取

    # 批量获取多个文件夹中xml当中某个标签的属性值
    import re
    from collections import Counter
    from xml.dom.minidom import parse
    
    from character_handle.frequency_order import sample_get
    def counter(arr):
        return Counter(arr)
    list_uses_permission = []
    # 批量加载XML,并提取属性值
    for i in range(1,11):
        xmldom = parse(sample_get.get_file("benign%d"%i))
    
        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)
    c = counter(list_uses_permission)
    print(c)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述
    可以看到count函数已经帮助我们将频次顺序也归纳好了,这时候我们可以根据自己的需求去使用这些属性,end!
    下一篇学习一下如何将这些属性值转化为特征值和特征向量进行处理。

  • 相关阅读:
    Stream流、FiLe和IO流、
    南京邮电大学计算机考研资料汇总
    Android图像选择之 PictureSelector
    【AI视野·今日NLP 自然语言处理论文速览 第三十六期】Tue, 19 Sep 2023
    源码中的设计模式--工厂模式
    Flink SQL时间属性和窗口介绍
    vue返回上一页(后退)的几种方法与区别
    Linux运维常用网络端口(不断补充)
    [Machine Learning][Part 2]监督学习的实现
    为什么mac会卡顿,mac电脑卡顿怎么解决
  • 原文地址:https://blog.csdn.net/weixin_44165950/article/details/132881415