本系列主要从隐私权限、第三方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("结束")
个人信息检查
-
查找关键词,例如身份证号、银行卡号等文字
- 通过androguard对apk的dex进行解析,使用get_methods()获取各个方法的字节码或源代码,并查找是否含有r关键词,并输出对应位置
- 关键词可能是Unicode编码也可能是ASCII码也可能是常见的中文编码
- 注意:这个方法只代表了源码中包含的敏感信息,不一定是真的收集的个人信息
- 分析包中中的xml文件,解压apk包后,会包含很多xml文件
- apk文件当作压缩包解析后,虽然能有目录结构发现一些xml文件,但很多xml文件都是经过二进制编码再压缩的,直接查看或使用python的lxml、xml.etree.ElementTree均无法成功解析
- 可以使用Android studio来检查xml,但效率极低
-
调用收集个人信息的函数,例如getIMEI()等
- 通过androguard对apk的dex进行解析,使用get_methods()获取各个方法的字节码或源代码,并查找是否含对应的函数,并输出对应位置(同上)
- 需要自行维护个人信息获取的函数,后续我会维护一个函数库
个人认为,静态检查个人信息,不能算是通用的个人信息检查方法,只能作为学习参考
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(#换成@)