Android模拟器中构建TaintDroid

Posted by Flight Tracer on October 18, 2016

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

下载编译运行TaintDroid

1. TaintDroid项目介绍

TaintDroid是由William Enck等人开发并实现的Android系统的实时隐私监控系统,常被用于Android软件动态分析。论文TaintDroid: an information flow tracking system for real-time privacy monitoring on smartphones发表在国际会议Usenix Conference on Operating Systems Design & Implementation。

TaintDroid通过修改Android源代码实现相关功能,其支持的最新系统版本为Android 4.3。

2. 构建TaintDroid

Step 0: 安装相关软件

$ sudo apt-get install curl git libswitch-perl gperf flex

上述软件为必须软件,若在实践过程中出现问题,自行Google即可。

Step 1: 获取Android源代码

安装Repo

Repo是谷歌用Python脚本写的调用git的一个脚本。主要是用来下载、管理Android项目的软件仓库。 更多关于Repo的信息,参见Google开发网页。

下载repo工具

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

修改repo文件

$ gedit ~/bin/repo
//将 REPO_URL 一行替换成为:REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'

前面两步也可简化为

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ wget -P ~/bin https://raw.githubusercontent.com/traceflight/Android-related-repo/master/Repo-Script/repo
$ chmod a+x ~/bin/repo

配置Git

$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"

获得Android源代码

Android源代码托管的官方网站为:https://android.googlesource.com/platform/manifest。由于众所周知的原因,大陆无法访问,可使用清华大学开源软件镜像站代替使用。

建立工作目录:

$ mkdir -p ~/tdroid/tdroid-4.3_r1
$ cd ~/tdroid/tdroid-4.3_r1

初始化仓库,使用android 4.3

$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.3_r1

同步源码树(所需时间较长)

$ repo sync

编译源代码

源代码编译过程中可能出现各种问题,请Google相关问题。

$ . build/envsetup.sh
$ lunch 1
$ make -j4

运行模拟器

$ emulator

Step 2: 获取TaintDroid源代码

创建local_manifest.xml文件

$ mkdir ~/tdroid/tdroid-4.3_r1/.repo/local_manifests/
$ cd ~/tdroid/tdroid-4.3_r1/.repo/local_manifests/
$ touch local_manifest.xml
$ gedit local_manifest.xml

复制下列内容到文件local_manifest.xml中

<manifest>
  <remote name="github" fetch="git://github.com"/>
  <remove-project name="platform/dalvik"/>
  <project path="dalvik" remote="github" name="TaintDroid/android_platform_dalvik" revision="taintdroid-4.3_r1"/>
  <remove-project name="platform/libcore"/>
  <project path="libcore" remote="github" name="TaintDroid/android_platform_libcore" revision="taintdroid-4.3_r1"/>
  <remove-project name="platform/frameworks/base"/>
  <project path="frameworks/base" remote="github" name="TaintDroid/android_platform_frameworks_base" revision="taintdroid-4.3_r1"/>
  <remove-project name="platform/frameworks/native"/>
  <project path="frameworks/native" remote="github" name="TaintDroid/android_platform_frameworks_native" revision="taintdroid-4.3_r1"/>
  <remove-project name="platform/frameworks/opt/telephony"/>
  <project path="frameworks/opt/telephony" remote="github" name="TaintDroid/android_platform_frameworks_opt_telephony" revision="taintdroid-4.3_r1"/>
  <remove-project name="platform/system/vold"/>
  <project path="system/vold" remote="github" name="TaintDroid/android_platform_system_vold" revision="taintdroid-4.3_r1"/>
  <remove-project name="platform/system/core"/>
  <project path="system/core" remote="github" name="TaintDroid/android_platform_system_core" revision="taintdroid-4.3_r1"/>
  <remove-project name="device/samsung/manta"/>
  <project path="device/samsung/manta" remote="github" name="TaintDroid/device_samsung_manta" revision="taintdroid-4.3_r1"/>
  <remove-project name="device/samsung/tuna"/>
  <project path="device/samsung/tuna" remote="github" name="TaintDroid/android_device_samsung_tuna" revision="taintdroid-4.3_r1"/>
  <project path="packages/apps/TaintDroidNotify" remote="github" name="TaintDroid/android_platform_packages_apps_TaintDroidNotify"
      revision="taintdroid-4.3_r1"/>
</manifest>

获取源代码

$ cd ~/tdroid/tdroid-4.3_r1
$ repo sync
$ repo forall dalvik libcore frameworks/base frameworks/native frameworks/opt/telephony system/vold system/core device/samsung/manta device/samsung/tuna \
 packages/apps/TaintDroidNotify -c 'git checkout -b taintdroid-4.3_r1 --track github/taintdroid-4.3_r1 && git pull'

Step 3: 构建TaintDroid

创建buildspec.mk文件,并设置

$ cd ~/tdroid/tdroid-4.3_r1
$ touch buildspec.mk
$ gedit buildspec.mk

复制如下内容到buildspec.mk中

# Enable core taint tracking logic (always add this)
WITH_TAINT_TRACKING := true

# Enable taint tracking for ODEX files (always add this)
WITH_TAINT_ODEX := true

# Enable taint tracking in the "fast" (aka ASM) interpreter (recommended)
WITH_TAINT_FAST := true

# Enable additional output for tracking JNI usage (not recommended)
#TAINT_JNI_LOG := true

# Enable byte-granularity tracking for IPC parcels
WITH_TAINT_BYTE_PARCEL := true

修改core.mk文件

$ gedit ~/tdroid/tdroid-4.3_r1/build/target/product/core.mk

在第一个PRODUCT_PACKAGES字段最后添加

\
TaintDroidNotify

最后得到的PRODUCT_PACKAGES形如:

PRODUCT_PACKAGES += \
                    BasicDreams \
                    ...
                    voip-common \
                    TaintDroidNotify

构建TaintDroid(Android模拟器中)

$ cd ~/tdroid/tdroid-4.3_r1
$ . bulid/envsetup.sh
$ lunch full-eng      //Android emulator
$ make clean
$ make -j4

Step 4: 获得YAFFS2 XATTR内核支持

$ cd ~/tdroid
$ wget http://www.appanalysis.org/files/kernel-goldfish-xattr-2.6.29.zip //此处官方有误
$ unzip kernel-goldfish-xattr-2.6.29.zip

Step 5: 生成sdcard.img(可选)

很多应用安装时需要有SD卡支持,按照官方教程没有给出sdcard.img的生成方法。需要说明的是,不执行本步操作,正常情况下不影响系统和应用的执行。

生成sdcard.img需要使用Android的SDK中的工具mksdcard,该工具位于sdk根目录的tools文件夹中。创建方法如下

$ cd path_to_android_sdk/tools
$ ./mksdcard 1024M sdcard.img

将sdcard.img文件放置在指定文件夹下

$ cp path_to_android_sdk/tools/sdcard.img ~/tdroid/tdroid_4.3_r1/out/target/product/generic/

Step 6: 运行并测试TaintDroid

在运行TaintDroid之前,强烈建议先将构建的生成结果备份一下,这样可以快速的将TaintDroid恢复到刚刚构建的状态。需要备份的文件在~/tdroid/tdroid_4.3_r1/out/target/product/generic文件夹中,建议将其中除obj文件夹和symbols文件夹外的其他文件备份,并放置在其他文件夹中(如~/tdroid文件夹)。

运行TaintDroid

$ cd ~/tdroid
$ emulator -kernel kernel-goldfish-xattr-2.6.29

运行结果如下图

taintdroid-after-build

测试

向Android模拟器中安装软件,本文安装百度手机助手。使用Android的SDK中的adb工具:

$ cd path_to_android_sdk/platform-tools
$ ./adb install path/to/apk/file

启动TaintDroid

taintdroid-start

启动百度手机助手

taintdroid-openbaidu

可以看到TaintDroid的通知

taintdroid-notify

点击其中的一个通知,可以看到详细内容

taintdroid-notify-detail