第 1 章 Android程序分析环境搭建

第 1 章 Android程序分析环境搭建

在实际的Android软件开发过程中,可能很多开发人员有过这样的经历:

  • 我有一个不错的idea,正在开发一款类似想法的软件,可是涉及到的一些功能上的具体代码细节却难以下手,我看到别人的程序中有这个功能,它们是如何实现的呢?
  • 我不小心安装了一个流氓软件,软件运行时会自动下载木马程序、恶意扣费、篡改手机系统,它是如何做到这些的呢?
  • 我按照网上介绍的方法来分析Android程序,可是根本就无法正确地反编译程序,或是反编译出的代码语法混乱,根本无法阅读。

这些场景都提出了一个疑问,那就是如何分析一个Android应用程序?如何掌握这些软件的架构思想?分析别人的程序在很多人看来是不能够接受的行为,在他们眼中这种行为都应被视为盗窃。其实任何技术的起源本身就是从学习开始的,用正确的态度对待程序分析技术是可以的。

如果说,开发Android程序是一种学问,那么分析Android程序更像是一门艺术。在浩瀚如海的反汇编代码中分析出程序的执行流程与架构思想是一件很了不起的事情,这需要分析人员有着扎实的编程基础与深厚的思维分析能力。分析软件的过程犹如一次艰难的旅程,这条旅程会有多长?该怎么走?会有多少崎岖险路?没有人知道,但是先行者已经为我们铺下了台阶,我们只需沿着它慢慢前行。

1.1 Windows分析环境搭建

搭建Windows分析平台的系统版本要求不高,Windows XP或以上即可。本书的Windows平台的分析环境采用Windows XP 32位系统,如果读者使用Windows 7或其他版本,操作上是大同小异的。

1.1.1 安装JDK

JDK是Android开发必须的运行环境,在安装JDK之前,首先到Oracle公司官网上下载它。下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/index.html,打开下载页面,目前最新版本为Java SE 6 Update 33,如图1-1所示。

{%}

图1-1 下载JDK

点击JDK下面的DOWNLOAD按钮进入下载页面,勾选“Accept License Agreement”单选框,然后点击jdk-6u33-windows-i586.exe进行下载。下载完成后双击安装文件,启动JDK安装界面,如图1-2所示。

{%}

图1-2 JDK安装界面

与安装其他Windows软件一样,JDK的安装过程也很简单,只需要不停点击下一步就可以顺利安装完成。安装完成后手动添加JAVA_HOME环境变量,值为“C:\Program Files\Java\jdk1.6.0_33”,并将“C:\Program Files\Java\jdk1.6.0_33\bin”添加到PATH变量中。如图1-3所示。

{%}

图1-3 设置Java环境变量

完成所有步骤后检查一下Java是否安装成功。单击“开始”按钮,选择“运行”,在出现的对话框中输入CMD命令打开CMD窗口,在CMD窗口中输入java –version,如果屏幕上出现如图1-4所示的提示,说明安装成功。

{%}

图1-4 查看Java是否正确安装

1.1.2 安装Android SDK

Android SDK是以zip压缩包的形式提供给开发人员的。首先到Android官网下载最新版本的SDK,下载地址为:http://developer.android.com/sdk/index.html。SDK提供了压缩包与安装文件两种方式供开发者下载,为了方便部署,本书采用下载安装文件的方式直接安装,目前Android SDK的最新版本为r20,完整下载地址为:http://dl.google.com/androidinstaller_r20-windows.exe

双击下载后的安装文件,将Android SDK安装到任意位置,本书安装环境为D:\android-sdk目录,然后将“D:\android-sdk\tools”与“D:\android-sdk\platform-tools”目录添加到系统的PATH环境变量中。添加完成后打开一个CMD窗口,输入“emulator -version”与“adb version”命令查看是否能成功运行。执行结果如图1-5所示。

{%}

图1-5 检查Android SDK是否正确安装

Android SDK安装成功后,需要通过SDK管理器下载具体版本的SDK,双击“D:\android-sdk\SDK Manager.exe”文件,打开Android SDK Manager,运行后如图1-6所示。

{%}

图1-6 Android SDK Manager运行界面

读者可以根据自己的需要选择相应的一个或多个版本进行下载,本书选择了2.2、2.3.3、4.0、4.0.3、4.1等几个版本,点击Install package按钮打开“Choose Package to Install”对话框,选择“Accept All”单选框,最后点击“Install”按钮开始下载,下载所需的时间根据网络环境差异可能会有所不同。

1.1.3 安装Android NDK

Android NDK是Google提供的开发Android原生程序的工具包。如今越来越多的软件与病毒采用了基于Android NDK动态库的调用技术,隐藏了程序在实现上的很多细节,掌握Android NDK程序的分析技术也成为了分析人员必备的技能,本书将会在第7章对Android NDK程序的特点以及分析技术进行详细的讲解。

Android NDK的下载地址为:http://developer.android.com/sdk/ndk/index.html,目前最新版本为R8,Windows平台下的完整下载链接为:http://dl.google.com/android/ndk/android-ndk-r8-windows.zip。将下载后的压缩包解压到硬盘任意位置,本书为D盘根目录。新建环境变量ANDROID_NDK,值为D:\android-ndk-r8,然后将ANDROID_NDK添加到PATH环境变量中,做好这一步,Android NDK就算安装完成了。

接下来测试配置是否正确,打开一个CMD窗口,进入目录“D:\android-ndk-r8\samples\ hello-jni”,输入“ndk-build”命令编译Android NDK中自带的hello-jni工程,如果输出如图1-7所示的结果,就说明Android NDK安装成功了。

{%}

图1-7 使用Android NDK编译hello-jni工程

1.1.4 Eclipse集成开发环境

Eclipse是Android开发推荐使用的IDE。它的下载地址为:http://www.eclipse.org/downloads,选择下载“Eclipse IDE for Java Developers”或“Eclipse for Mobile Developers”版本即可。强烈建议下载使用后者,后者自带了CDT(C/C++Development Tools)插件,并针对手机开发做了优化。

Eclipse是一款绿色软件,下载完成后解压到硬盘任意目录,本书为D盘根目录。进入“D:\eclipse”目录,运行eclipse.exe,Eclipse会根据前面设置的环境变量自动进行初始化,如果启动时没有提示错误说明安装成功。

1.1.5 安装CDT、ADT插件

如果读者使用的Eclipse是For Mobile Developers版本或自带CDT插件,可以跳过CDT插件的安装;否则需要手动安装CDT插件。安装Eclipse的插件比较简单,有在线安装与离线安装两种方式,步骤分别为:

  • 启动Eclipse,点击菜单“Help→Install New Software”打开Install对话框,在“Work With”旁边的编辑框中输入http://download.eclipse.org/tools/cdt/releases/juno并回车,稍等片刻后下面列表框就会解析出CDT插件。
  • 到Eclipse官网上手动下载最新版的CDT插件,目前最新8.1.0。下载地址为:http://www.eclipse.org/cdt/downloads.php。启动Eclipse,点击菜单“Help→Install New Software”打开Install对话框,点击界面上的Add按钮,打开Add Repository对话框,接着点击Archive按钮,选择下载的CDT压缩包,点击OK按钮返回。

无论采用上面哪一种方式进行安装,最终都会在Name下面的列表中列出可供安装的CDT插件,如图1-8所示, 全部勾选后点击Next按钮即可安装,在线安装耗费的时间根据网络环境差异可能有所不同。

{%}

图1-8 安装CDT插件

ADT插件是Google为Android开发提供的Eclipse插件,方便在Eclipse开发环境中创建、编辑、调试Android程序。安装过程与CDT插件类似。目前最新版本为20.0.0,官方下载地址为:http://dl.google.com/android/ADT-20.0.0.zip,在线安装的repository地址为:https://dl-ssl.google.com/android/eclipse/,读者可以按照上面的步骤自行完成安装。

ADT插件安装完成后需要进行相应的配置。点击Eclipse菜单项“Window-Preferences”,选择Android列表项,在右侧SDK Location处选择Android SDK的安装位置,如D:\android-sdk,展开Android列表项,选择NDK,在右侧NDK Location处选择Android NDK的安装位置,如D:\android-ndk-r8。设置完后点击OK按钮关闭对话框。到此,CDT与ADT插件就安装完成了。

1.1.6 创建Android Virtual Device

Android SDK中提供了“Android Virtual Device Manager”工具,方便在没有真实Android设备环境的情况下调试运行Android程序。

双击运行“D:\android-sdk-windows\ AVD Manager.exe”,点击“New”按钮,打开AVD创建对话框,在“Name”栏输入AVD的名称,如输入“Android2.3.3”,在Target一栏选择要模拟的Android版本,这里选择“Android 2.3.3 – API Level 10”,SD Card大小指定为256MB,其它选项保持不变,结果如图1-9所示。

{%}

图1-9 创建AVD

点击“Create AVD”按钮完成AVD的创建。选中创建的AVD,点击右侧的“Start”按钮,如果没有错误会成功启动这个Android虚拟设备。

如果使用真实Android设备来调试程序,需要先在设备的“设置→程序→开发”选项中开启“USB调试”,然后安装相应设备厂商提供的USB驱动程序。一份常见的USB驱动程序下载地址列表可以在http://developer.android.com/tools/extras/oem-usb.html中找到。安装完驱动后在命令提示符下输入“adb devices”就可以列出连接的Android设备了。

1.1.7 使用到的工具

分析Android程序需要用到很多工具,包括:反编译工具、静态分析工具、动态调试工具、集成分析环境等。所有的工具中,大多数是开源或免费的软件,笔者在此不详细列出使用到的工具,在每一章对知识点进行介绍时,会同时介绍相关工具的使用方法与下载地址。

1.2 Linux分析环境搭建

本书中介绍的Windows环境下的大多数操作,在Linux环境下同样适用。本节将介绍如何在Linux环境下搭建Android程序的分析环境。

1.2.1 本书的Linux环境

本书在写作时使用的Linux环境为Ubuntu 10.04 32位系统,在最后一章进行Android病毒分析时使用的是Ubuntu 12.04 32位系统。

1.2.2 安装JDK

首先在当前用户主目录下新建tools目录来存放Android分析常用的工具。

到Oracle官方网站下载JDK安装包。本书Ubuntu平台使用的版本为jdk-6u33-linux-i586,下载地址为http://www.oracle.com/technetwork/java/javase/downloads/index.html,将下载的jdk-6u33-linux-i586.bin文件放到/home/feicong/tools目录(feicong为本机用户名),打开一个终端环境输入以下命令:

cd tools
chmod +x ./jdk-6u33-linux-i586.bin
./jdk-6u33-linux-i586.bin

此时安装程序会自动将JDK安装到当前目录的jdk1.6.0_33目录下。接着设置环境变量,执行:

sudo gedit /etc/profile

在配置文件中加入如下部分:

export JAVA_HOME=/home/feicong/tools/jdk1.6.0_33
export JRE_HOME=/home/feicong/tools/jdk1.6.0_33/jre
export PATH=/home/feicong/tools/jdk1.6.0_33/bin:$PATH
export
CLASSPATH=.:/home/feicong/tools/jdk1.6.0_33/lib:/home/feicong/tools/jdk1.6.0_33/jre/lib

保存后退出,在终端提示符中输入如下命令使环境变量生效:

source /etc/profile

最后输入命令“java –version”验证JDK是否安装成功,如图1-10所示。

{%}

图1-10 验证JDK是否安装成功

1.2.3 在Ubuntu上安装Android SDK

Ubuntu上安装Android SDK与Windows安装步骤类似,首先到官方网站http://developer.android.com/sdk/index.html下载Android SDK,目前最新版本为r20,下载后将android-sdk_ r20-linux.tgz压缩包文件放到tools目录,执行以下命令进行解包:

tar zvxf android-sdk_r20-linux.tgz

解包完毕后就会在当前目录下出现android-sdk-linux目录了。这个目录的内容与Windows平台提供的工具类似。接着设置环境变量,执行:

sudo gedit /etc/profile

在配置文件中加入如下部分:

export PATH=/home/feicong/tools/android-sdk-linux/platform-tools:$PATH
export PATH=/home/feicong/tools/android-sdk-linux/tools:$PATH

保存后退出,在终端提示符中输入“source /etc/profile”使环境变量生效。输入“emulator→version”与“adb version”命令查看是否能成功运行。如果出现如图1-11所示的画面说明设置成功。

{%}

图1-11 测试Android SDK

配置好环境后就需要下载具体版本的SDK了,在终端提示符中输入android命令启动Android SDK Manager,接下来的下载步骤与Windows平台是一样的,具体操作这里就不再赘述了。

1.2.4 在Ubuntu上安装Android NDK

首先到Android官方网站http://developer.android.com/sdk/ndk/index.html下载Android NDK,目前Linux平台的最新版本为r18,将下载的android-ndk-r8-linux-x86.tar.bz2文件放到tools目录,在终端提示符下输入以下命令解包:

tar jxvf ./android-ndk-r8-linux-x86.tar.bz2

解包完毕后就会在当前目录下出现android-ndk-r8目录了。接着设置环境变量,执行:

sudo gedit /etc/profile

在配置文件中加入如下部分:

export ANDROID_NDK=/home/feicong/tools/android-ndk-r8
export PATH=/home/feicong/tools/android-ndk-r8:$PATH

保存文件后退出,在终端提示符中输入“source /etc/profile”使环境变量生效。接下来在终端提示符下进入android-ndk-r8/samples/hello-jni目录,然后输入ndk-build命令编译hello-jni工程,如果配置正确,执行结果如图1-12所示。

{%}

图1-12 使用Android NDK编译工程

1.2.5 在Ubuntu上安装Eclipse集成开发环境

首先到Eclipse官方网站http://www.eclipse.org/downloads/下载Eclipse IDE for Java Developers版本,将下载到的eclipse-jee-indigo-SR2-linux-gtk.tar.gz文件放到tools目录,输入以下命令解包:

tar zxvf ./eclipse-jee-indigo-SR2-linux-gtk.tar.gz

解包完毕后就会在当前目录下出现eclipse目录。目录中的eclipse文件就是主程序,为方便以后使用可以在桌面上建立快捷方式。

1.2.6 在Ubuntu上安装CDT、ADT插件

Ubuntu上安装CDT、ADT插件与Windows平台上的安装步骤是一样的,读者可以参考1.1.5小节内容进行安装,这里不再赘述。

1.2.7 创建Android Virtual Device

Linux版的Android SDK没有提供可视化的AVD Manager管理工具,创建AVD可以使用android命令。在终端提示符下输入“android list targets”列出本机已经下载好的SDK,本机输出结果如下:

feicong@feicong-ubuntu:~/tools$ android list targets
     Available Android targets:
     ……
----------
id: 2 or "android-8"
     Name: Android 2.2
     Type: Platform
     API level: 8
     Revision: 3
     Skins: WVGA800 (default), HVGA, QVGA, WVGA854, WQVGA432, WQVGA400
     ABIs : armeabi
----------
id: 3 or "android-10"
     Name: Android 2.3.3
     Type: Platform
     API level: 10
     Revision: 2
     Skins: WVGA800 (default), HVGA, QVGA, WVGA854, WQVGA432, WQVGA400
     ABIs : armeabi

     ……
----------
id: 6 or "android-15"
     Name: Android 4.0.3
     Type: Platform
     API level: 15
     Revision: 3
     Skins: WSVGA, WVGA800 (default), HVGA, QVGA, WVGA854, WXGA720, WXGA800, WQVGA432, WQVGA400
     ABIs : armeabi-v7a

每一个id对应一个版本的SDK。这个id在创建AVD时会使用到。创建AVD的命令格式为“android create avd --name <your_avd_name> --target <targetID>”,比如想要创建Android系统版本为2.3.3且名称为android2.3.3的AVD只需在终端提示符下输入如下命令:

android create avd --name android2.3.3 --target android-10

创建AVD完成后可以使用emulator来启动它,在终端提示符下输入命令:

emulator -avd android2.3.3

最终运行效果如图1-13所示。

{%}

图1-13 Android模拟器运行界面

如果使用真实Android设备来调试程序,还需要做一些工作。首先需要在设备的“设置→程序→开发”选项中开启“USB调试”,接着将设备连接电脑,在终端提示符中输入lsusb命令查看连接的USB设备。我的测试机型为Moto XT615,命令执行后会得到如下输入。

feicong@feicong-ubuntu:~$ lsusb
Bus 003 Device 002: ID 15d9:0a4c Dexon
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 005: ID 0bda:0158 Realtek Semiconductor Corp. Mass Storage Device
Bus 001 Device 004: ID 22b8:2de6 Motorola PCS
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

其中22b8为Vendor id值,2de6为Product id。不同的设备厂商Vendor id值不同。可以在http://developer.android.com/tools/device.html#VendorIds找到一份常见设备厂商的Vendor id列表。Product id则是具体产品的id值。同一厂商的不同设备Vendor id相同而Product id不同。记录下Vendor id与Product id值,然后编辑udev规则文件/etc/udev/rules.d/70-android.rules,没有则创建,内容如下。

SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", MODE="2de6", GROUP="plugdev"

其中的22b8与2de6根据自己的Vendor id与Product id值进行相应的更改,修改保存后退出,在终端提示符中输入命令“adb devices”就能列出配置好的Android设备了。

1.2.8 使用到的工具

本书讲解Android程序分析时使用到的工具大多数是跨平台的,这些工具同时拥有Windows版本与Linux版本,笔者在介绍它们时会给出相应工具的下载地址,并且给出其安装方法。另外,本书中也有个别的工具是与平台相关的,笔者在书中都有详细的说明。

1.3 本章小结

本章主要介绍了分析Android程序时常用到的一些工具,熟练掌握这些工具的使用是分析Android程序的基础,接着介绍了Windows平台与Ubuntu平台下Android开发环境的搭建,为后面的分析环境做准备。在学习完本章后,读者可以自行下载本章所提及到的工具,动手练习如何使用它们,这些工具的具体使用会在本书后面章节逐一进行介绍。

目录