Androguard分析工具-API

反编译

使用Androguard的API分析APK/DEX/ODEX/AXML/ARSC

打开APK

这基于你想分析什么类型的应用。如果你有一个传统的APK文件,第一件事就是引入APK模块

from androguard.core.bytecodes import apk

并且打开你的文件

= apk.APK("pathtoyouruberfile.apk")

但是也许你没有到你文件系统的路径只有一个原生的缓冲

= apk.APK(rawbuffer, raw=True)

对于APK class你有不同的选项但是也许你会遇到python zipmodule方面的错误。你可以尝试加载我们修改的模块使用zipmodule选项。

= apk.APK(rawbuffer, raw=True, zipmodule=2)

但是如果你的文件是一个DEX或是ODEX格式,你可以这样做:

from androguard.core.bytecodes import dvm
= dvm.DalvikVMFormat(rawbuffer)
= dvm.DalvikVMFormat(open("pathtoyourfile.dex", "r").read())
= dvm.DalvikOdexVMFormat(open("pathtoyourfile.odex", "r").read())
# you have only the apk and want to analyse the dex file in the apk
= apk.APK(rawbuffer, raw=True)
= dvm.DalvikVMFormat(a.get_dex())

AXML/ARSC

获取所有的类

当你有一个DalvikVMFormat的对象,你可以访问所有的类

= 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)

获取所有的方法

你可以直接从类中访问所有的方法

= dvm.DalvikVMFormat(a.get_dex())
for current_method in d.get_methods():

print current_method

每一个i现在的方法对象,并且你有大量的方法来获取信息(类名,描述,代码)

获得所有的属性

= 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类:

= dvm.DalvikVMFormat(open(TEST, "r").read())
= 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

四种格式

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(翻译)