反编译
使用Androguard的API分析APK/DEX/ODEX/AXML/ARSC
打开APK
这基于你想分析什么类型的应用。如果你有一个传统的APK文件,第一件事就是引入APK模块
from androguard.core.bytecodes import apk
并且打开你的文件
a = apk.APK("pathtoyouruberfile.apk")
但是也许你没有到你文件系统的路径只有一个原生的缓冲
a = apk.APK(rawbuffer, raw=True)
对于APK class你有不同的选项但是也许你会遇到python zipmodule方面的错误。你可以尝试加载我们修改的模块使用zipmodule选项。
a = apk.APK(rawbuffer, raw=True, zipmodule=2)
但是如果你的文件是一个DEX或是ODEX格式,你可以这样做:
from androguard.core.bytecodes import dvm
d = dvm.DalvikVMFormat(rawbuffer)
d = dvm.DalvikVMFormat(open("pathtoyourfile.dex", "r").read())
d = dvm.DalvikOdexVMFormat(open("pathtoyourfile.odex", "r").read())
# you have only the apk and want to analyse the dex file in the apk
a = apk.APK(rawbuffer, raw=True)
d = dvm.DalvikVMFormat(a.get_dex())
当你有一个DalvikVMFormat的对象,你可以访问所有的类
d = dvm.DalvikVMFormat(a.get_dex())
for current_class in d.get_classes():
print current_class
当然你可以获得所有的方法在现在的类使用get_methods/get_fields(具体查看API文档http://doc.androguard.re/html/dvm.html)
获取所有的方法
你可以直接从类中访问所有的方法
d = dvm.DalvikVMFormat(a.get_dex())
for current_method in d.get_methods():
print current_method
每一个i现在的方法对象,并且你有大量的方法来获取信息(类名,描述,代码)
获得所有的属性
d = dvm.DalvikVMFormat(a.get_dex())
for current_field in d.get_fields():
print current_field
指令
我认为你会对从方法中获得指令=感兴趣。每一条指令都是一个指令对象,依赖于指令的形式。类可能不同但是主要对象会是指令。
而且,每一条指令表示了dex模式的定义,但是每一条指令将会有相似的结构(EncodedMethod -> DalvikCode -> DCode)
for method in a.get_methods() :
print method.get_class_name(), method.get_name(), method.get_descriptor()
code = method.get_code()
bc = code.get_bc()
idx = 0
for i in bc.get_instructions() :
print "\t", "%x" % idx, i.get_name(), i.get_output()
idx += i.get_length()
使用EncodeMethod的 get_instructions是个简单的方法
for method in a.get_methods():
print method.get_class_name(), method.get_name(), method.get_descriptor()
idx = 0
for i in method.get_instructions():
print "\t", "%x" % idx, i.get_name(), i.get_output()
idx += i.get_length()
Search
CFG
你可以构建CFG,因为你会获得指令。如果你有一个DalvikVMFormat对象并且你必须使用VManalysis类:
d = dvm.DalvikVMFormat(open(TEST, "r").read())
x = analysis.VMAnalysis(d)
现在你可以访问呢每一个方法的基本模块和下一个和之前的模块:
for method in d.get_methods():
g = x.get_method(method)
if method.get_code() == None:
continue
print method.get_class_name(), method.get_name(), method.get_descriptor()
idx = 0
for i in g.get_basic_blocks().get():
print "\t %s %x %x" % (i.name, i.start, i.end), '[ NEXT = ', ', '.join( "%x-%x-%s" % (j[0], j[1], j[2].get_name()) for j in i.get_next() ), ']', '[ PREV = ', ', '.join( j[2].get_name() for j in i.get_prev() ), ']'
for ins in i.get_instructions():
print "\t\t %x" % idx, ins.get_name(), ins.get_output()
idx += ins.get_length()
print ""
自动化分析
使用多线程分析多个android应用。因此我们有一个特殊的模块andrAuto,下面是主要。
from androguard.core.analysis import auto
# create the new analyser
aa = auto.AndroAuto(settings)
# run the analysis
aa.go()
# dump the result
aa.dump()
变量的设置是一个字典
class AndroLog:
def __init__(self, id_file, filename):
self.id_file = id_file
settings = {
"my": auto.DirectoryAndroAnalysis(options.directory),
"log": AndroLog,
"max_fetcher": 3,
}
指定了一个对象来分析所有的apps并且一个Log类。。。
图形化输出
Dot \Png\Gexf\Gml
四种格式