Androguard使用说明

本篇源自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(_filesession = Noneraw = False 

分析一个Android应用程序并设置所有的东西,以便更快地进行分析!如果session为None,则根本不使用会话。这是默认行为。如果您希望以后继续工作,那么使用会话可能是个好主意。可以使用创建默认会话get_default_session()

参数:_file字符串用于文件名)或字节用于原始) - android应用程序的文件名或表示应用程序的缓冲区

session - 会话(默认值:无)

raw - 布尔值,如果提供原始字节而不是文件名

返回类型:返回APK,列表DalvikVMFormatAnalysis对象


androguard.misc.AnalyzeDex(filenamesession = None 

分析android dex文件并设置所有内容以便更快速地进行分析!

参数:filenamestring) - android dex文件的文件名或表示dex文件的缓冲区

session - 会话(默认无)

返回类型:返回(sha256hash DalvikVMFormat,, Analysis)的元组


androguard.misc.AnalyzeODex(filenamesession = None 

分析android odex文件并设置所有内容以便更快地进行分析!

参数:filenamestring) - android dex文件的文件名或表示dex文件的缓冲区

session - 要将ODex添加到的Androguard会话(默认值:无)

返回类型:返回(sha256hash DalvikOdexVMFormat,, Analysis)的元组


androguard.misc.RunDecompiler(ddxdecompiler_name 

在特定分析上运行反编译器

参数:d(DalvikVMFormat对象) - DalvikVMFormat对象

dx(VMAnalysisobject) - 格式分析

decompilerstring) - 要使用的反编译器类型(“dad”,“dex2jad”,“ded”)


androguard.misc.clean_file_name(filenameunique = Truereplace ='_'force_nt = False 

返回文件名版本,其中没有禁止的字符。在Windows上,这些是例如<,/,?,...

此功能的目的是允许将文件分发到不同的操作系统。

参数:filename - 要清理的字符串

unique - 检查文件名是否已被采用并将整数附加为唯一(默认值:True)

替换 - 替换字符。(默认:'_')

force_nt - 强制缩短NT系统上的路径(默认值:False)

返回:干净的字符串


androguard.misc.get_default_session()

如果配置中的会话为None,则从配置中返回默认会话或创建新会话。


androguard.misc.sign_apk(filenamekeystorestorepass 

使用jarsigner签署APK文件。

参数:filename - 磁盘上的APK文件以签名(路径)

keystore - 密钥库的路径

storepass - 您的密钥存储密码


androguard.session模块

androguard.session.Load(文件名

加载你的会话!

例:

s=session.Load("mysession.ag")

参数:filename字符串) - 保存会话的文件名

返回类型:会话的元素:)



androguard.session.Save(sessionfilename = 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(filenameraw_data = Nonedx = 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_classandroguard.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 = Nonedigest = 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(nameshort = Falsedelimiter ='

以人类可读的形式格式化X509证书的名称类型。

参数:name(dict或asn1crypto.x509.Name) - 用于返回DN的名称对象

shortboolean) - 使用简短形式(默认值:False)

delimiterstr) - 两部分之间的分隔符字符串或字符(默认值:',')

返回类型:str


androguard.util.read(filenamebinary = True 

打开并读取文件

参数:filename - 要打开和读取的文件名

binary - 如果文件应该读为二进制,则为True

返回:如果binary为True则为bytes,否则为str。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268