1. 程式人生 > >對MobSF的原始碼進行分析

對MobSF的原始碼進行分析

前言

如上篇文章http://blog.csdn.net/leehdsniper/article/details/51317900所述,首先我們需要分析MobSF的原始碼,明白一個apk的靜態分析的步驟是什麼。經過分析,如何將apk檔案解壓就是進行apk行為分析的第一步,確切的說應該是第二步,第一步應該是去殼。但是為了簡單起見,去殼這一步就暫時忽略。

首先從MobSF的原始碼分析開始

  • 執行MobSF
    首先從網頁入手進行分析,啟動服務端後開啟127.0.0.1:8000,進入開發者模式:
    這裡寫圖片描述
    可以看到,中間的Update&Analyse按鈕屬於一個表單,這個表單採用POST的方式向伺服器傳遞資料。簡單猜想一下,傳遞的資料必定是上傳的.apk檔案,傳到哪裡表單頭中並沒有說明,那麼肯定是使用javascript程式碼完成上傳動作。
    在本頁的javascript程式碼中,可以看到使用AJAX技術上傳了檔案:
    這裡寫圖片描述


    顯然這個檔案被Post到../Upload/頁面。
    但是通過搜尋整個原始碼資料夾,並沒有發現Upload頁面,雖然之前沒有使用過Django框架,但是有Flask的經驗,猜想必定有一個定義url的檔案,在MobSF的資料夾,果然找到了一個urls.py檔案:
    這裡寫圖片描述
    打開發現果然沒錯,這裡詳細描述了http訊息和在伺服器上的處理方法(函式)之間的關係:
    這裡寫圖片描述

  • 分析在apk檔案在伺服器上的處理流程
    從urls.py檔案中,可以看到,點選上傳按鈕後,處理apk的函式是MobSF.views.Upload,找到MobSF資料夾下的views.py,開啟找到其中的Upload函式:
    這裡寫圖片描述

  • 上傳檔案進行分析
    上傳一個apk進行分析,可以在伺服器終端看到如下執行日誌:
    這裡寫圖片描述

    和Upload函式中的提示資訊進行核對,發現完全一致:
    這裡寫圖片描述
  • 繼續沿著這條線走下去
    這個函式最終會向客戶端傳送一個json資料包,在這個資料包中包含了以下內容:
    response_data['url'] = 'StaticAnalyzer/?name='+request.FILES['file'].name+'&type=apk&checksum='+md5
    response_data['status'] = 'success'
    這裡寫圖片描述
    首先包含了一個URL,不管這個json在客戶端會產生什麼,總之Upload函式的功能在返回這個json資料包之後就完成了。那麼猜想客戶端必定還要向伺服器傳送訊息啟動分析。
    前面說過在urls.py檔案中,包含了所有的http請求和對應的處理方法,找到包含StaticAnalyser的專案:
    這裡寫圖片描述

    顯然,有一個StaticAnalyzer.views.StaticAnalyzer的函式負責靜態分析。
    在StaticAnalyser資料夾中的views.py中找到這個函式:
    這裡寫圖片描述
  • 正式開始
    將上面這個檔案中的函式摺疊起來,整個檔案的結構就非常清楚了。
    研究StaticAnalyser函式,就是研究整個靜態分析的過程:
    這裡寫圖片描述
    找到第一個呼叫的函式(前面計算md5值等部分就可以暫時忽略):
    line 389: FILES=Unzip(APP_PATH,APP_DIR)
    也就是說,apk檔案其實是一個zip檔案,為了將證實這一點,將一個字尾名為.apk的檔案字尾改為.zip,開啟
    這裡寫圖片描述
    顯然是這樣的,在裡面可以找到所有的apk原始碼。

結語

下一步就是實現對apk檔案的解壓,將使用zlib庫實現這一功能。
後續的任務就是一步一步實現StaticAnalyser函式其實是views.py檔案中的所有功能,並將他們整合到一起,再使用Qt做出圖形介面。