最近做android应用的分析,用到了androguard。这是一个相当强大的android逆向工程和静态分析工具,使用python编写,其中的androdd.py用来生成apk文件的每个类的方法调用图,可以生成png,jpg以及dot文件。
在这里有一个bug,由于androdd.py中使用如下方法生成文件名:
filename = output_name + valid_class_name( method.get_class_name() )
部分文件名(尤其是android内核自带方法生成的文件)长度很长,而Linux系统对文件名长度限制为256,造成程序终止,如下图:
解决方法很直接,在执行前判断文件名的长度,手动设置一个上限:
if len(filename) >= 128:
filename = filename[0:128]
这里没有设置256,因为还要实际长度还要加上文件路径。
另外,其实自己写的方法不会有这么深的路径,因此文件名也不会这么长,而且分析的时候主要分析的是应用程序的代码,而不希望生成android自带的代码块(这也很浪费时间),因此如果只希望生成与应用程序相关的代码,则可加上一句判断:
if valid_class_name( method.get_class_name() )[0:7] != "android":
......
这样也基本不会发生文件名过长问题。
最终生成的png分析图例子如下:
可通过程序操作获取生成的dot文件。