APK文件隐私合规检测-静态分析篇(2)

2024-08-13 209 0

本系列主要从隐私权限、第三方sdk、个人信息,三个方面展开对APP的隐私问题静态分析,主要探讨在没有成熟工具的情况下,如何使用androguard对一个APK文件进行分析。
本文主要涉及第三方sdk和个人信息的静态检查
阅读本文需要对python和Android有基础了解

检测第三方sdk

  • 主要解析APK文件,使用a.get_services()\get_activities()\get_providers()\get_receivers()找出manifest文件中的name特征,以及遍历dex文件中的classes目录,用来和已知的第三方sdk库做对比。
  • 极度依赖第三方sdk特征库,后续我会维护一个开源的第三方特征库地址,请持续关注
import os
from androguard.misc import AnalyzeAPK
from loguru import logger
logger.remove(handler_id=None) 
import json


def check_SDK(json_path, apk, dex, dx):
    with open(json_path, "r", encoding='utf-8') as f:
        row_data = json.load(f, strict=False)

    apkname = apk.get_package()
    services = apk.get_services() 
    activitys = apk.get_activities() 
    provides = apk.get_providers()   
    receivers = apk.get_receivers()   
    dexss = list(dx.classes.keys())  
    new_dess = [item[1:].replace("/", ".") for item in dexss]

    sdks = services + activitys + provides + receivers + new_dess
    newsdks = [sdk for sdk in sdks if apkname not in sdk]
    appksdks = list(set(newsdks))

    print("开始对称SDK")
    sdknames = []
    for key in row_data.keys():
        if key not in sdknames:
            values = row_data[key]
            for value in values:
                for sdk in appksdks:
                    if value in sdk:
                        sdknames.append(key)

    sdkname = list(set(sdknames))
    return sdkname

if __name__ == '__main__':

    file_path = sys.argv[1]
    file_path = file_path.replace("\\", "/") + "/"
    json_path = r"jison格式的第三方sdk"
    apks = [f for f in os.listdir(file_path) if f.endswith(".apk")]
    print("开始分析")
    for apk in apks:
        print(f"应用程序名称: {apk}")
        apk, dex, dx = AnalyzeAPK(os.path.join(file_path, apk))
        sdklist = check_SDK(json_path, apk, dex, dx)
        print(sdklist)
        print("结束")

个人信息检查

  • 查找关键词,例如身份证号、银行卡号等文字

    1. 通过androguard对apk的dex进行解析,使用get_methods()获取各个方法的字节码或源代码,并查找是否含有r关键词,并输出对应位置
    2. 关键词可能是Unicode编码也可能是ASCII码也可能是常见的中文编码
    3. 注意:这个方法只代表了源码中包含的敏感信息,不一定是真的收集的个人信息
    4. 分析包中中的xml文件,解压apk包后,会包含很多xml文件
    5. apk文件当作压缩包解析后,虽然能有目录结构发现一些xml文件,但很多xml文件都是经过二进制编码再压缩的,直接查看或使用python的lxml、xml.etree.ElementTree均无法成功解析
    6. 可以使用Android studio来检查xml,但效率极低
  • 调用收集个人信息的函数,例如getIMEI()等

    1. 通过androguard对apk的dex进行解析,使用get_methods()获取各个方法的字节码或源代码,并查找是否含对应的函数,并输出对应位置(同上)
    2. 需要自行维护个人信息获取的函数,后续我会维护一个函数库

个人认为,静态检查个人信息,不能算是通用的个人信息检查方法,只能作为学习参考

import os
import re
from androguard.misc import AnalyzeAPK
from loguru import logger
logger.remove(handler_id=None)  

def find_specific_text(txt, dx):

    for txtname in txt:
        path = os.path.join(file_path, txtname)
        with open(path, 'r', encoding='UTF-8') as c:
            lines = c.readlines()

    found_texts = []
    found = 0
    errorC = 0
    errorS = 0

    for method in dx.get_methods():
        meth = method.get_method()
        try:
            c = meth.get_code()  
            code = c.get_bc()
            n = code.get_instructions() 

            for idx, instruction in enumerate(n):
                method_c = instruction.get_output()  
                for word in lines:
                    word = word.replace('\n', '').replace(',', '').replace(';', '')
                    matches = re.findall(word, method_c, re.UNICODE) 
                    if matches:
                        found_texts.extend(matches)
                        print(meth.get_class_name() + "-" + meth.get_name() + "-" + str(meth.get_descriptor()))
                        print(method_c)
                        found += 1

        except AttributeError as e:
            # print("Error:", e)
            errorC += 1
    print(errorS)
    print(errorC)
    print(found_texts)
    return found_texts

if __name__ == '__main__':
    file_path = sys.argv[1]
    file_path = file_path.replace("\\", "/") + "/"
    apks = [f for f in os.listdir(file_path) if f.endswith(".apk")]
    txts = [t for t in os.listdir(file_path) if t.endswith(".txt")]  # 存放个人信息特征

    print("开始分析")
    for apk in apks:
        print(f"应用程序名称: {apk}")
        a, dex, dx = AnalyzeAPK(os.path.join(file_path, apk))
        find_specific_text(txts, dx)

  • 静态检测部分完结,两篇文章介绍了如何使用androguard从危险权限、第三方sdk和个人信息三个方面,静态检测APP的合规性、其中,危险权限和第三方sdk部分的内容能更好的支撑APP的合规工作,个人信息的检查部分仅应作为学习内容。
  • 后续还会展开动态检测篇章,这三方面的检查效果能在动态检测中得到加强。

4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

webpack打包站点,js文件名批量获取思路
加密对抗靶场enctypt——labs通关
【论文速读】| 注意力是实现基于大语言模型的代码漏洞定位的关键
蓝队技术——Sysmon识别检测宏病毒
内网渗透学习|powershell上线cs
LLM attack中的API调用安全问题及靶场实践

发布评论