androguard主要用来进行静态分析,提供了一组工具包(py文件),辅助分析人员快速分析APK文件 ,其中 androdd.py用于生成apk文件中每个类的方法的调用流程图,可以选择生成.dot格式的,另外还可以是PNG和JPG中的一种,但是在使用过程中可能会遇到如下问题:
1、AttributeError: ‘Dot’ object has no attribute ‘write_PNG’
具体如下图所示:
解决办法:在Wiki上提示的选择图形格式时“-f PNG”使用的大写字母,实际运行时发现会报如图所示的错误。这是因为选择不论png还是jpg都会和write拼成一个函数,而这个函数是小写的,所以png或者jpg必须用小写的才行。
2、IOError: [Errno 36] File name too long: ‘./out/android/support/v4/app/NotificationCompatHoneycomb/add-Landroid_content_ContextLandroid_app_NotificationLjava_lang_CharSequenceLjava_lang_CharSequenceLjava_lang_CharSequenceLandroid_widget_RemoteViewsILandroid_app_PendingIntentLandroid_app_PendingIntentLandroid_graphics_Bitmap-Landroid_app_Notification.png’
具体如下图所示:
解决办法:这是因为android自带方法生成的调用流程图文件的文件名长度过长(Linux系统的文件名长度限制为256),从而造成程序终止。可以通过修改androdd.py的代码来解决这个问题。
在androdd.py文件中,通过如下代码生成文件名:
filename = output_name + valid_class_name( method.get_class_name() )
因此,可以通过设置一个文件名长度上限,如128,并在执行前判断文件名的长度,如果文件名不超过上限,就继续操作,否则截取文件名:
if len(filename) >= 128:
filename = filename[0:128]
另外,在分析代码的时候主要分析的是应用程序的代码,因此如果只希望生成与应用程序相关的代码的调用流程图,而不希望生成android自带的代码块的调用流程图(这也很浪费时间),则可加上一句判断:
if valid_class_name( method.get_class_name() )[0:7] != "android":
......
最终代码如下图所示:
我解决上述问题之后,顺利生成的png分析图例子如下:
参考博客: