Androguard的androdd.py模組在使用過程中可能遇到的問題
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分析圖例子如下:
參考部落格: