本blog是对http://sseblog.ec-spride.de/tools/flowdroid/项目的翻译和说明,参考的是主页上列的papers。
一个Android app可包含多个组件,如activity, service, content-provider 和broadcast receiver。其中activity负责成像,也就是人机交互,是我们分析的主要入口和场所。不像传统的Java程序,Android app里不带main函数,我们无法简单的像之前一样找到程序的入口和出口来画控制流图,但app里每个组件都有函数来反应此组件的生命周期(lifecycle),我们可以依托lifecycle来画出控制流图。我们先来看下一个activity里的lifecycle是什么样的,
(图片截取自AppIntent, CCS'13)
从图中可以看出activity可以从任何结点按任何顺序执行,并没有传统的单入口单出口结构。除了lifecycle函数activity里还可以带有各种event handler的callbacks,用于处理像UI交互之类的事件。callbacks可以看作居住在lifecycle函数间。
为了生成给定app的控制流图,我们可以对其生成一个虚拟main函数。通过一个例子我们能很清楚的看清背后的思想。
例子中的app只有一个activity用于把用户输在密码框中的内容通过短信发送出去。画横线的语句分别代表了source和sink。现在我们来生成它的控制流图
可以看到dummy main中把onCreatea当作入口,把onDestory作为出口,把原lifecycle图中的带分支的状态看作是抽象的模糊判断语句p,把激活callbacks的条件也同样看作是抽象的判断语句p。
说完了控制流图生成,接下来正式步入static analysis。整个analys