新搭建了个人博客,文章全部转到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个项目包括:heros
、jasmin
、soot
、soot-infoflow
、soot-infoflow-android
。具体导入方法见下面截图:
URI: https://raw.githubusercontent.com/traceflight/Droidetect/master/develop/flowdroid.psf
-
打开 File -> Import -> Team -> Team Project Set
-
输入上面的URI -> 点击Finish
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_JARS
和DROIDBENCH
。
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文件重复问题
在项目
heros
和soot-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…
- 左侧选择Java Application里面的Test(如果打开Configurations后,左侧没有Test,可先执行Run As -> Java Application),右侧选择Arguments标签,里面写入两个参数,点击Apply、Run,即可得到分析结果。