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


    前言

    上篇说到对安卓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!
    下一篇学习一下如何将这些属性值转化为特征值和特征向量进行处理。

  • 相关阅读:
    【教程】chrome关闭跨域策略cors、samesite,跨域带上cookie
    C++算法 —— 分治(2)归并
    如何使用HTML和CSS创建动画条形图?
    概率统计·随机变量的数字特征【数学期望、方差】
    如何避免写重复代码:善用抽象和组合
    MongoDB 对索引的创建查询修改删除 附代码
    数据结构与算法特训365天—深度优先搜索
    electron之快速上手
    【总结】攻击 AI 模型的方法
    Verilog 之 wire与reg 类型的变量
  • 原文地址:https://blog.csdn.net/weixin_44165950/article/details/132881415