1. 程式人生 > >Androguard的androdd.py模組在使用過程中可能遇到的問題

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分析圖例子如下:
這裡寫圖片描述

參考部落格:

http://blog.csdn.net/clasnake/article/details/18089089