FlowDroid环境配置(macOS)
1 环境
平台版本:mac OS 10.12.3 (16D32); MacBook Pro (Retina, 13-inch, Early 2015);2.7 GHz Intel Core i5; 8 GB 1867 MHz DDR3
Eclipse版本:Eclipse Java EE IDE for WebDevelopers. Version: Mars.1 Release (4.5.1)
Java版本:java version"1.8.0_101"; Java(TM) SE Runtime Environment (build 1.8.0_101-b13);Java HotSpot (TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
2 步骤
首先,从GitHub上把FlowDroid的相关工程clone下来。这里我们需要五个工程:
Jasmin(https://github.com/Sable/jasmin)
Soot(https://github.com/Sable/soot)
Heros (https://github.com/Sable/heros)
soot-infoflow(https://github.com/secure-software-engineering/soot-infoflow)
soot-infoflow-android (https://github.com/secure-software-engineering/soot-infoflow-android)
下载完之后,你的eclipse应该包含下面几个工程,而且会出现一大堆的错误:
图 1,FlowDroid相关工程导入后的效果
图2,FlowDroid相关工程导入后的结果2
图一中的那些工程我们不需要,删掉就好了,真正用到的是下面的五个工程,下面的问题是如何去掉那些错误。这时我们可以先看一下各个工程之间的依赖关系:jasmin 和 heros 不依赖于任何工程,soot 依赖于jasmin 和heros,soot-infoflow 依赖于heros 和 soot,soot-infoflow-android 依赖于soot-infoflow 和 soot。总结下来其依赖关系就是:
图3,FlowDroid相关项目依赖关系
确定好依赖关系之后,我们就从头向下开始排查错误。先从jasmin 和 heros开始看,jasmin没错,就看heros了,打开项目工程之后发现pom.xml文件有错。
图4,heros中的错误
pom.xml是什么我也不知道,打开看看。
图5,pom.xml文件中的错误
图6,pom.xml文件中的错误2
图7,pom.xml文件中的错误3
所料不错的话这个pom.xml应该是和maven相关的配置文件,而且这个错误应该是告诉我们缺少了一些包。图5里面有一个:Click for details,不得不吐槽一下这个就是个大坑,你点了以后并不会显示detail,不如直接看图7里面的错误。图7现实有一个包没法读,于是我试着在相应路径下查找了一下这个包,确实是存在的,我也不知道为什么不能读。这里注意一点就是在Mac里进入maven的.m2文件路径下是需要su权限的。这条思路又陷入了死胡同,于是我从网上的资料得知可能是eclipse没有安装maven插件的缘故,我又安装了maven插件。
图8,安装maven插件
可是安装完插件之后还是不行,我感到无路可走了。
最后,我把heros项目Build Path的MavenDependence Path都删了,没错,就是整个remove掉,之后再把pom.xml文件删掉,这个项目就不会再报错了,而且这时你会发现后面的项目全都正常了,因为它们都对heros存在着直接或间接地依赖关系!(我不懂maven,上面的做法是我折腾了一天之后自己瞎碰出来的,有懂maven的大神看到了可以提出正确的解决方案)
把这件事搞定之后,还要配置环境变量,一个是ANDROID_JAR另一个是DROIDBENCH,第一个环境变量是你设置的某个版本的Android sdk的android.jar文件的路径,droidbench我也不知道是啥,它存在于soot-infoflow-android项目中。ANDROID_JAR应该是${Android SDK path}/sdk/platforms/android-22/android.jar这里也要注意你选择的版本,你要是使用android-16的jar文件来解析一个最低版本为22的apk可能会出错(我也没试过)。DROIDBENCH这个路径应该是${workspace}/soot-infoflow-android/test/soot/jimple/infoflow/android/test/droidBench。在我的电脑上的配置如下图所示。配好了之后别忘了让配置文件生效!
图9,环境变量的配置
3 测试
使用博客http://blog.csdn.net/liu3237/article/details/48827523中的例子来测试一下环境是否搭建成功。代码什么的直接copy就可以了,但是运行完之后程序可能会报错(也可能不会,原因我也不知道):程序会报一个运行时异常(这里忘了截图,我用语言叙述),告诉你找不到AndroidCallback文件(是AndroidCallback还是Callback我忘了,反正是个回调文件)位置就在你设置source和sink点的那个方法,即:
图10,设置源和泄露点的方法
抛出的异常会告诉你,这个找不到回调文件的错误就出在上面图中函数的那一行。既然是找不到这个文件我就试着导入一下吧,因为我正好看到在它存在于soot-infoflow-android里面有一个叫AndroidCallbacks.txt的文件,想来可能是那个它找不到的回调文件,然后我又发现在app对象下又一个方法名叫setCallbackFile,虽然没有doc文档解释,但是大概可以猜到是设置回调文件的函数,因为其形式参数就是一个字符串,表示回调文件路径。于是我做出了如下的设置:
图11,回调文件设置
这样试过之后,程序还是会报原来的错,这个问题困扰了我很久,一直没想明白。后来注意到错误的位置始终是图10中语句的位置,而且我在图10语句的后面写了一个输出函数,本是想要输出回调函数的路径,看看字符串写的有什么问题,可是执行后却发现根本没有输出,也就是说错误出现在图10语句调用的函数中,程序执行到这里就停止了,后面的语句不可能再被执行!所以图11的第二句话根本就没执行!最后我把设置回调文件的函数放在了前面,就像这样:
图12,改进的回调文件设置
这样设置一下,程序就跑出来了!
我自己写了一个空的app,然后用上述的程序去测试我的环境是否配好,这回终于可以了!
图13,测试结果
4 结尾
环境配置方法完全是自己试出来的,同时也参考了官方的guide还有很多别人的博客,如果有大神看出了什么缺陷还请不吝赐教。搞静态分析不易,欢迎交流!!!