本篇源自androguard官方文档,水平有限,存在误差,见谅。
安装
pip install -U androguard[magic,GUI]
apt install androguard
要解码AndroidManifest.xml或resources.arsc,可以使用 androaxml.py和androarsc.py。要获取有关证书的信息,请使用androsign.py。
如果要创建调用图,请使用androcg.py,或者如果需要控制流图,可以使用androdd.py。
Androlyze和python API
a, d, dx = AnalyzeAPK("examples/android/abcore/app-prod-debug.apk"),你得到的三个对象是a一个APK对象,d一个DalvikVMFormat对象数组和dx一个Analysis对象。
在APK对象内部,您可以找到有关APK的所有信息,例如包名称,权限,AndroidManifest.xml或其资源。
获取APK的权限 a.get_permissions()
获取AndroidManifest.xml中定义的所有活动的列表 a.get_activities()
获取包名称,应用程序名称和图标路径 a.get_package() a.get_app_name() a.get_app_icon()
获取数字版本和版本字符串,以及最小,最大,目标和有效的SDK版本 a.get_androidversion_code() ,a.get_androidversion_name(),a.get_min_sdk_version(),a.get_max_sdk_version(),a.get_target_sdk_version(),a.get_effective_target_sdk_version()
获取AndroidManifest.xml的解码XML a.get_android_manifest_axml().get_xml()
Analysis对象,包含有关一个或多个DEX文件中的类,方法,字段和字符串的所有信息。还可以获取每个方法,类,字段和字符串调用图和交叉引用(XREF)
dx.get_classes() 返回一个ClassAnalysis对象列表 其中一些标记为EXTERNAL,这意味着此类的源代码未在Analysis内部加载的DEX文件中定义。
XREFs
XREF是为四件事生成的:
类(Classes)
方法(Methods)
字段(Fields)
字符串(Strings)
XREF主要在两个方向上工作:xref_from和xref_to。
所有XREF都可以显示为有向图,如果某个对象A包含在其中xref_to,则被调用对象将包含A在其中 xref_from。
dx.classes['Ltests/androguard/TestActivity;'] ,从类中查询所有被调用的类tests.androguard.TestActivity。请记住,您需要提供类名作为带有正斜杠而不是点的类型格式。通过classes或者find_classes() 获得类。
迭代类中的所有方法并查询外部参照:
formethindx.classes['Ltests/androguard/TestActivity;'].get_methods():
print("inside method {}".format(meth.name))
for_,call,_inmeth.get_xref_to():
print(" calling -> {} -- {}".format(call.class_name,call.name))
字段的XREF
xref_read()和xref_write(),使用该方法find_fields()来查找字段。
获取tests.androguard.TestActivity中字段value的读取和写入:
for fieldindx.find_fields(classname='Ltests/androguard/TestActivity;',fieldname='^value$'):
print("Field: {}".format(field.name))
for _,methinfield.get_xref_read():
print(" read in {} -- {}".format(meth.class_name,meth.name))
for _,methinfield.get_xref_write():
print(" write in {} -- {}".format(meth.class_name,meth.name))
会话(Sessions)
sess=misc.get_default_session()
a,d,dx=misc.AnalyzeAPK("examples/android/abcore/app-prod-debug.apk",session=sess)
sess.show()
session.Save(sess,"androguard_session.ag")
sess=session.Load("androguard_session.ag")
使用JADX进行反编译
show_logging(level=logging.DEBUG)
a=APK("examples/android/TestsAndroguard/bin/TestActivity.apk")
d=DalvikVMFormat(a)
dx=Analysis(d)
decompiler=DecompilerJADX(d,dx)
d.set_decompiler(decompiler)
d.set_vmanalysis(dx)
for
mind.get_methods()[:10]:
print(m)
print(decompiler.get_source_method(m))
Android签名证书
在APK内部,有两个证书位置:
v1 aka JAR签名:文件META-INF夹中的PKCS#7文件
v2 aka APK签名:ZIP中包含DER编码证书的特殊部分
androsign.py --all --show examples/signing/apksig/golden-aligned-v1v2-out.apk 获取所有证书
Android二进制XML格式
Android使用特殊格式来保存XML和资源文件。资源文件也是源文件夹中的XML文件,但所有资源都打包到一个名为的资源文件中resources.arsc。底层格式是基于块的,并且能够存储几个不同的信息。
最常见的AXML文件是AndroidManifest.xml。此文件必须是每个APK的一部分,并包含有关该包的元信息。
Androguard能够解码这些文件,并且存在两种不同的解码工具:
1,androguard arsc用于解码resources.arsc。
2,androguard axml用于解码AndroidManifest.xml和所有其他XML文件
解码APK文件的AndroidManifest.xml,只需将APK文件作为参数:androguard axml
例如:androguard axml examples/android/TestsAndroguard/bin/TestActivity.apk
看原始的,未编译的XML文件,该文件可在此处找到:
cat examples/android/TestsAndroguard/AndroidManifest.xml
解码任何其他XML文件,只需将APK中的路径作为参数,或直接指定二进制XML文件:androguard axml examples/axml/test.xml
解码来自resources.arsc的信息
获取APK的所有字符串资源:
androguard arsc examples/android/TestsAndroguard/bin/TestActivity.apk --type string
列出所有资源类型:
androguard arsc examples/android/TestsAndroguard/bin/TestActivity.apk --list-types
子模块
androguard.misc模块
androguard.misc.AnalyzeAPK(_file,session = None,raw = False )
分析一个Android应用程序并设置所有的东西,以便更快地进行分析!如果session为None,则根本不使用会话。这是默认行为。如果您希望以后继续工作,那么使用会话可能是个好主意。可以使用创建默认会话get_default_session()。
参数:_file(字符串(用于文件名)或字节(用于原始)) - android应用程序的文件名或表示应用程序的缓冲区
session - 会话(默认值:无)
raw - 布尔值,如果提供原始字节而不是文件名
返回类型:返回APK,列表DalvikVMFormat和Analysis对象
androguard.misc.AnalyzeDex(filename,session = None )
分析android dex文件并设置所有内容以便更快速地进行分析!
参数:filename(string) - android dex文件的文件名或表示dex文件的缓冲区
session - 会话(默认无)
返回类型:返回(sha256hash DalvikVMFormat,, Analysis)的元组
androguard.misc.AnalyzeODex(filename,session = None )
分析android odex文件并设置所有内容以便更快地进行分析!
参数:filename(string) - android dex文件的文件名或表示dex文件的缓冲区
session - 要将ODex添加到的Androguard会话(默认值:无)
返回类型:返回(sha256hash DalvikOdexVMFormat,, Analysis)的元组
androguard.misc.RunDecompiler(d,dx,decompiler_name )
在特定分析上运行反编译器
参数:d(DalvikVMFormat对象) - DalvikVMFormat对象
dx(VMAnalysisobject) - 格式分析
decompiler(string) - 要使用的反编译器类型(“dad”,“dex2jad”,“ded”)
androguard.misc.clean_file_name(filename,unique = True,replace ='_',force_nt = False )
返回文件名版本,其中没有禁止的字符。在Windows上,这些是例如<,/,?,...
此功能的目的是允许将文件分发到不同的操作系统。
参数:filename - 要清理的字符串
unique - 检查文件名是否已被采用并将整数附加为唯一(默认值:True)
替换 - 替换字符。(默认:'_')
force_nt - 强制缩短NT系统上的路径(默认值:False)
返回:干净的字符串
androguard.misc.get_default_session()
如果配置中的会话为None,则从配置中返回默认会话或创建新会话。
androguard.misc.sign_apk(filename,keystore,storepass )
使用jarsigner签署APK文件。
参数:filename - 磁盘上的APK文件以签名(路径)
keystore - 密钥库的路径
storepass - 您的密钥存储密码
androguard.session模块
androguard.session.Load(文件名)
加载你的会话!
例:
s=session.Load("mysession.ag")
参数:filename(字符串) - 保存会话的文件名
返回类型:会话的元素:)
androguard.session.Save(session,filename = None )
保存您的会话以便以后使用它。
返回写入文件的文件名。如果没有给出文件名,将在当前工作目录中创建名为androguard_session_ <DATE> .ag的文件。 <DATE>是具有以下格式的时间戳:%Y-%m-%d_%H%M%S。
此函数将覆盖现有文件而不会询问。
如果无法写入文件,则返回None。
例:
s=session.Session()session.Save(s,"msession.ag")
参数:session - 要保存的Session对象
filename(字符串) - 输出文件名以保存会话
classandroguard.session.Session(export_ipython = False )
会话能够存储多个APK,DEX或ODEX文件,并可以腌制到磁盘以便以后恢复工作。
Sessions中使用的主要功能可能是add(),它将文件添加到会话中并对它们执行分析。
此后,该文件可以使用诸如收集 get_objects_apk(),get_objects_dex()或get_classes()。
add(filename,raw_data = None,dx = None )
将文件添加到会话的通用方法。
这是将文件添加到Session时使用的主要方法!
如果提供了APK文件,则也会分析所有DEX文件。对于DEX和ODEX文件,仅分析此文件(还应分析哪些内容)。
返回分析文件的SHA256。
参数:filename - 要加载的文件名
raw_data - 文件的字节,或者从文件名加载文件的无
dx - 已经存在的Analysis对象
返回:文件的sha256或失败时为None
addAPK(文件名,数据)
将APK文件添加到会话并对其运行分析。
参数:filename - (文件)APK文件的名称
data - APK文件的二进制数据
返回:一个SHA256校验和和APK对象的元组
addDEX(文件名,数据,dx =无)
将DEX文件添加到会话并运行分析。
参数:filename - DEX文件的(文件)名称
data - dex文件的二进制数据
dx - 现有的分析对象(可选)
返回:SHA256 Hash,DalvikVMFormat对象和Analysis对象的元组
addDEY(文件名,数据,dx =无)
将ODEX文件添加到会话并运行分析
get_all_apks()
产生一个APK的SHA256哈希元组列表和会话中所有分析的APK的APK对象。
get_analysis(current_class )
返回Analysis包含current_class的对象。
参数:current_class(androguard.core.bytecodes.dvm.ClassDefItem) - 要搜索的类
返回类型:androguard.core.analysis.analysis.Analysis
get_classes()
从DEX对象返回所有Java类作为DEX文件数组。
get_digest_by_class(current_class )
返回包含ClassDefItem的对象的SHA256哈希
返回此类所在的第一个摘要。例如,如果您分析了APK,则应该返回APK的摘要而不是DEX文件的摘要。
get_filename_by_class(current_class )
返回类所在的DEX文件的文件名。
返回此类所在的第一个文件名。例如,如果您分析了APK,则应该返回APK的文件名而不是DEX文件的文件名。
参数:current_class - ClassDefItem
返回:如果找不到类或文件名则无
get_format(current_class )
返回DalvikVMFormat给定的ClassDefItem。
参数:current_class - ClassDefItem
get_nb_strings()
返回所有Analysis对象中的字符串总数
get_objects_apk(filename = None,digest = None )
返回APK,DalvikVMFormat和指定APK的分析。
您必须指定文件名或摘要。可以使用两者,但在这种情况下仅使用摘要。
例:
s=Session()digest=s.add("some.apk")a,d,dx=s.get_objects_apk(digest=digest)
例:
s=Session()filename="some.apk"digest=s.add(filename)a,d,dx=s.get_objects_apk(filename=filename)
参数:filename - APK文件的文件名,仅用于摘要是None
摘要 - 由add()APK 返回的sha256哈希值
返回:元组(APK,[DalvikVMFormat],分析)
get_objects_dex()
产生包含其Analysis对象的所有dex对象
返回:元组(sha256,DalvikVMFormat,分析)
get_strings()
为所有唯一的Analysis对象生成所有StringAnalysis
isOpen()
测试此会话中是否分析了任何文件
返回:如果分析了任何文件,则为True,否则为False
reset()
重置当前会话,删除所有添加的文件。
save(filename = None )
保存当前会话,另请参阅Save()。
show()
将信息打印到有关当前会话的stdout。获取所有APK,所有DEX文件和所有Analysis对象。
androguard.util模块
androguard.util.get_certificate_name_string(name,short = False,delimiter =',' )
以人类可读的形式格式化X509证书的名称类型。
参数:name(dict或asn1crypto.x509.Name) - 用于返回DN的名称对象
short(boolean) - 使用简短形式(默认值:False)
delimiter(str) - 两部分之间的分隔符字符串或字符(默认值:',')
返回类型:str
androguard.util.read(filename,binary = True )
打开并读取文件
参数:filename - 要打开和读取的文件名
binary - 如果文件应该读为二进制,则为True
返回:如果binary为True则为bytes,否则为str。