摘要:后文將圍繞做一些介紹。盡管如此,的使用對新手而言仍然充滿了困難。本系列文章基本為個人見解,難免有錯誤與誤解,如有客觀錯誤歡迎提出。
前言
說到Android的污點分析框架,網上的搜索結果大多指向靜態的FlowDroid與動態的TaintDroid。盡管由于加固、混淆等技術使得針對Android的靜態分析越來越困難,但靜態分析的無先驗分析能力無法被動態分析取代,使得靜態分析仍有發揮空間。后文將圍繞FlowDroid做一些介紹。
值得注意的是,雖然FlowDroid還在被Secure Software Engineering Group維護更新,但其核心算法仍然是2014的版本。在各大會議上已經提出了數十種新的靜態污點分析算法,相比FlowDroid在一些數據集或是DroidBench上有著更快的運行速度以及更優的精準度。但FlowDroid仍然是公共資源中可獲取的靜態污點分析工具的唯一選擇,因為很多paper提供的源代碼幾乎沒有注釋與文檔,導致使用極其困難;另外科研人員往往僅在有限的測試集上進行了運行,所以去使用這樣的程序不可避免的會遇到Bug。相比之下,FlowDroid作為被持續維護的一款框架,其穩定性上具備了一定的保證,同時其底層的Soot框架強大的功能與較為完善的文檔,使得FlowDroid上手難度相對較低。
盡管如此,FlowDroid的使用對新手而言仍然充滿了困難。網絡上FlowDroid的教程大多是一些cmd命令的說明,而我需要將其作為程序的一部分,甚至還需要對源代碼進行一些修改,導致我不得不花費大量的時間去閱讀源代碼以知悉其中的一些細節以及一些未被文檔直接提及的自定義接口。因此,我希望將閱讀過程中看到的東西做記錄與分享,以便有需要的人可以省去一些功夫。
本系列文章基本為個人見解,難免有錯誤與誤解,如有客觀錯誤歡迎提出。
FlowDroid是一款使用Java實現的針對Android的靜態污點分析框架,發表于PLDI"2014(論文鏈接),截止撰文時間在Google Scholar上顯示已有1200+的引用,目前為Android靜態污點分析的主流框架,代碼開源并提供于GitHub(倉庫鏈接)。
FlowDroid在數據流分析部分并無太大的創新,主要基于發表在POPL"1995上的IFDS算法(論文鏈接)實現,其主要貢獻在于針對Android程序的LifeCycle、Callback等特點做了各種各樣的處理,感興趣的可以去閱讀論文進行查閱。
首先自然是Java的配置,如果沒有配置并且不會配置,請查找網上其他教程,本文不再贅述。
FlowDroid的配置方法有兩種,可以直接下載相關jar包,也可以使用maven配置依賴。jar包可以去FlowDroid的GitHub上release頁面進行下載,僅需soot-infoflow-android-classes.jar和soot-infoflow-classes.jar兩個文件即可,另外去Soot的倉庫下載包含了heros與jasmin的sootclasses-trunk-jar-with-dependencies.jar,將上述三個包加入項目依賴便完成了FlowDroid的配置。關于如何將jar包加入依賴,如有困惑請根據Java編程環境自行查詢。
整個FlowDroid最頂層的類便是soot.jimple.infoflow.android.SetupApplication,大部分的設置與運行都可以通過操作這個類的實例進行。SetupApplication既可以在調用runInfoflow()時傳入配置參數,也可以在初始化SetupApplication時或初始化后傳入配置參數。SetupApplication的初始化函數以及runInfoflow函數有多種不同參數類型的實現,可以查閱源碼后根據情況選擇,這里僅提供我自己使用的一種方式:
InfoflowAndroidConfiguration conf = new InfoflowAndroidConfiguration(); // androidDirPath是你的android sdk中platforms目錄的路徑 conf.getAnalysisFileConfig().setAndroidPlatformDir(androidDirPath); // apkFilePath是你要分析的apk的文件路徑 conf.getAnalysisFileConfig().setTargetAPKFile(apkFilePath); // sourceSinkFilePath是source點與sink點的聲明文件,后文會作說明 conf.getAnalysisFileConfig().setSourceSinkFile(sourceSinkFilePath); // apk中的dex文件有對方法數量的限制導致實際app中往往是多dex,不作設置將僅分析classes.dex conf.setMergeDexFiles(true); // 設置AccessPath長度限制,默認為5,設置負數表示不作限制,AccessPath會在后文解釋 conf.getAccessPathConfiguration().setAccessPathLength(-1); // 設置Abstraction的path長度限制,設置負數表示不作限制,Abstraction會在后文解釋 conf.getSolverConfiguration().setMaxAbstractionPathLength(-1); SetupApplication setup = new SetupApplication(conf); // 設置Callback的聲明文件(不顯式地設置好像FlowDroid會找不到) setup.setCallbackFile("res/AndroidCallbacks.txt"); setup.runInfoflow();關于Source、Sink
污點分析中的source點表示污點分析的起始點,而sink點表示污點分析的結束點。換言之,FlowDroid在“掃描”這個apk后,會從source點開始分析數據流,當數據流“流到”sink點時將其標注。FlowDroid中的source與sink均為類方法,在soot-infoflow-android下有提供一份SourcesAndSinks.txt的文件,是FlowDroid當時使用的一些可能涉及到訪問隱私數據的api,從里面很容易看出聲明文件的格式:
每一行作為獨立的聲明,%開頭的表示注釋,可以根據應用需求自行添加刪減Source與Sink的聲明。
因為Android中系統級的Callback并不會出現顯式地進行回調方法的調用,所以如果需要分析Callback方法需要在聲明文件中將其聲明,同樣在soot-infoflow-android下有提供一份AndroidCallbacks.txt文件,里面是一些常見的原生回調接口或類,如需添加參照格式即可。
AccessPath是數據流分析中一個專用術語,而Abstraction是FlowDroid用來表示污點分析在一個代碼語句的結果的類。關于它們的具體說明會在后面的文章中展開,這里僅需一個宏觀的了解,那兩個設置的數值越小,分析可能越快但效果可能越差,反之同理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75836.html
摘要:函數式編程,一看這個詞,簡直就是學院派的典范。所以這期周刊,我們就重點引入的函數式編程,淺入淺出,一窺函數式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數式編程就是關于如使用通用的可復用函數進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數式編程(Functional Programming),一...
摘要:我之前寫過關于的文章,,最近在工作中用到比較多了,頓時覺得確實是比較優秀的一個。 我之前寫過關于cypress的文章,https://segmentfault.com/a/11...,最近在工作中用到cypress比較多了,頓時覺得cypress確實是比較優秀的一個。 1. 軟件安裝. 2. 安裝cypress 安裝cypress客戶端:http://download.cypress...
摘要:接受另一個函數作為參數,然后用接受的這個新函數處理,將結果再次傳給,最后將實例化的新對象返回。空值檢查就是個不錯的例子這個實現里,只在為合法值非空時,傳入。但不論怎么變化,她們也都和一樣遵守上面提到的規則。 大多數關于monad的教程都和老太太的裹腳布一樣,又臭、又長,說不清、道不明。當然我也不偉大,沒法保證我寫的一定更明了,更生動,甚至更屌?不過我至少可以確定,我這篇更簡潔。浪費不了...
摘要:通過瀏覽器的,可以看到此次會話的請求內容和響應內容。是協議的一部分。真實的產品,一般是創建一個保證唯一的,不易猜測出來的字符串。因此需要數據持久化的多提供者的方案。 使用過幾種Web App開發語言和框架,都會接觸到Session的概念。即使是一個簡單站點訪問計數的功能,也常常使用Session來實現的。其他常用的領域還有購物車,登錄用戶等。但是,對Session一直是一知半解,知其然...
閱讀 2772·2021-10-14 09:42
閱讀 827·2021-10-11 10:57
閱讀 773·2019-08-30 15:54
閱讀 1914·2019-08-30 13:50
閱讀 1686·2019-08-30 11:19
閱讀 932·2019-08-29 12:38
閱讀 1425·2019-08-26 11:51
閱讀 1388·2019-08-26 10:48