通过源码构建运行FlowDroid

Posted by Flight Tracer on June 4, 2016

新搭建了个人博客,文章全部转到http://blog.datarepo.cn上更新。

最近在研究Android软件的静态分析,FlowDroid是一个高精度的Android程序污点分析工具,能够分析apk文件,生成软件调用图。下面给出了FlowDroid通过源码进行构建和运行的过程。

1. 安装相关软件

安装JDK 1.7,并移除JDK 1.6(FlowDroid不能在JDK 1.6下运行)

sudo apt-get install openjdk-7-jdk openjdk-7-jre-headless 
sudo apt-get remove openjdk-6-jre openjdk-6-jre-headless  #(如果有的话)

安装Eclipse、Git和相关插件

sudo apt-get install eclipse git eclipse-egit

2. 导入Eclipse

下面介绍两种将FlowDroid导入Eclipse的方法。

手动下载项目

创建文件夹
本地创建文件夹,用于存放项目代码。

mkdir -p ~/workspace/flowdroid
cd ~/workspace/flowdroid

在GitHub中clone项目到本地

git clone https://github.com/Sable/heros.git
git clone https://github.com/Sable/jasmin.git
git clone https://github.com/Sable/soot.git
git clone https://github.com/secure-software-engineering/soot-infoflow.git
git clone https://github.com/secure-software-engineering/soot-infoflow-android.git

导入Eclipse
打开Eclipse选择 File -> Import -> General -> Existing Projects into Workspace,分别导入5个项目即可。

通过psf项目集导入

在Eclipse中使用URI导入团队项目集,能够一次性将5个项目同时导入到Eclipse中。5个项目包括:herosjasminsootsoot-infoflowsoot-infoflow-android。具体导入方法见下面截图:

URI: https://raw.githubusercontent.com/traceflight/Droidetect/master/develop/flowdroid.psf

  1. 打开 File -> Import -> Team -> Team Project Set flowdroid-import flowdroid-team-project-set

  2. 输入上面的URI -> 点击Finish flowdroid-input-uri flowdroid-cloning

3. 下载依赖文件

android.jar 文件

对于Android开发人员来说,该文件很熟悉,在android sdk文件夹下,文件结构通常为sdk/platforms/android-22/android.jar。如果本地没有,可在官方下载Android SDK,或者移步在我的项目中下载

DroidBench数据集

DroidBench是用于评估Android软件污点分析工具有效性的开源测试集,由EC SPRIDE Secure Software Engineering Group创建并维护。FlowDroid中的测试代码部分使用到了DROIDBENCH环境变量,在分析自定义软件时不需要该变量。因此,该数据集不是运行FlowDroid的必须文件。如果需要,可在其Github项目DroidBench中下载。

4. 配置项目

环境变量

FlowDroid在运行其测试程序时,需要用到两个环境变量:ANDROID_JARSDROIDBENCH。 Ubuntu中可在~/.profile中设置相应的环境变量。使用gedit ~/.profile命令编辑,添加如下内容:

export ANDROID_JARS=path/to/android.jar
export DROIDBENCH=path/to/droidbench

ANDROID_JARS指向Android SDK中某一版本的android.jar文件。 DROIDBENCH指向数据集所在的位置,本地中可在soot-infoflow-android/test/soot/jimple/infoflow/android/test/droidBench中找到,但其中的数据集不完整,无法完成所有的测试用例。完整的数据集在其官方项目DroidBench中下载。

其他配置

  • SLF4J文件重复问题 在项目herossoot-infoflow两个项目中的classpath文件中均有slf4j-simple-1.7.5.jar。因此在项目编译时会提示SLF4J文件重复,解决方法是在soot-infoflow项目的.classpath文件中删除对应行<classpathentry kind="lib" path="lib/slf4j-simple-1.7.5.jar"/>
  • 无法找到EasyTaintWrapperSource.txt soot-infoflow-anadroid项目编译时提示找不到文件EasyTaintWrapperSource.txt。该文件可在项目soot-infoflow根目录下找到,复制到soot-infoflow-anadroid的根目录下即可。

5. 运行FlowDroid分析软件

使用代码中的测试用例

soot-infoflow-anadroid项目提供了多个测试集,位于项目test文件夹下,分别为:droidBench数据集测试、insecureBank.apk测试、otherAPKs测试、sourceToSinks测试和xmlParser测试。使用方法为,右击对应的java文件,选择Run As -> JUnit Test。

分析自定义文件

分析自定义文件使用soot.jimple.infoflow.android.TestApps中的Test.java文件。该文件的输入包括两个参数:apk-file和android-jar-directory。配置方法如下:

  • 右击Test.java文件,选择Run As -> Run Configurations… flowdroid-test-config
  • 左侧选择Java Application里面的Test(如果打开Configurations后,左侧没有Test,可先执行Run As -> Java Application),右侧选择Arguments标签,里面写入两个参数,点击Apply、Run,即可得到分析结果。 flowdroid-test-run flowdroid-test-result