白帽分享||编译android打造万能调试机

2017-10-25 8,034
本文效果:

TracePid为0   规避某些反调试

ro.debuggable为1  可以不用重打包即可调试

1
环境搭建


(1). 环境介绍:

手机:nexus 5

ubuntu版本:15.10

android版本:4.4.4

android源码官网(这里有很多相关的资料,基本上按照官网的来就可以编译想编译的任何版本了)

http://source.android.com/source/

(2). 环境配置

配置环境得好好看看这篇,不同的android版本选择不同的环境

http://source.android.com/source/requirements.html

JDK环境配置 

(支持多版本,这个姿势正确点, 以后如果要编译其他版本的可以随时切换JDK版本)

ps:题外话,python也有类似的版本管理方案

http://www.cnblogs.com/butterfly-clover/p/5764587.html

. 添加软件源

sudo add-apt-repository ppa:webupd8team/java

.更新软件源

sudo apt-get update

.安装 jdk 6

sudo apt-get install oracle-java6-installer

.查看所有 jdk 安装版本

sudo update-java-alternatives -l

java-6-oracle 3 /usr/lib/jvm/java-6-oracle

java-7-oracle 4 /usr/lib/jvm/java-7-oracle

java-8-oracle 2 /usr/lib/jvm/java-8-oracle

.通过-s参数可以方便的切换到其它的java版本

$ sudo update-java-alternatives -s java-6-oracle


需要注意的是:

不同版本的android源码需要不同的jdk来编译,不然可能会在源码编译的时候报错jdk版本不对


CupcakeFroyo  (android1.5~android2.2.x) 使用JDK5

Gingerbreadkitkat (android2.3.x~android4.4.x)使用JDK6

LollipopMarshmallow (android5.x~android6.0) Open-JDK7

其他版本使用OpenJDK8

对应手机型号的支持版本在这里查询

http://source.android.com/source/build-numbers.html

我的版本属于kitkat,所以用jdk6编译

python环境

python环境Ubuntu 15.10已经安装了所以略过,如果没有需要安装python2.6~2.7

安装编译库环境

编译依赖的环境按照这里进行配置

http://source.android.com/source/initializing.html


官网上看起来Ubuntu15.10是不用再另外配置环境了,这点我没有进行尝试,我当时没有看到这个页面,所以我还是按照Ubuntu14.04的方式配置了环境

sudo apt-get install git-core gnupg flex bison gperf build-essential

  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386

  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache

  libgl1-mesa-dev libxml2-utils xsltproc unzip

okay环境都配置好了,下面开始下载源码

2
下载源码


(1). 官网教程

谷歌官网的教程在这里,我这边下载的比较慢(谷歌源)

http://source.android.com/source/downloading.html

(2). 配置清华大学的下载源

我们使用清华大学的源,速度飞快,在公司的网络,一个晚上就下载好了

1. 配置git

设置 github邮箱姓名使用 git 工具,配置github可以百度github配置本篇幅不在多余介绍

git config --global user.email "<你的 github email 地址>"

git config --global user.name "<你的 github name 名称>"

2.下载repo

我们后面会使用repo来进行源码下载,repo是什么?(请自行百度)

我这边是这样管理的,新建了一个android目录,然后在android目录下新建了一个aosp目录

我们的源码以后就下载到aosp目录了

cdandroid目录执行下面第2条代码

. git clone git://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/

git clone https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git

我这边试了下,好像只能用https的方式下载了, 所以我们选择方案2

3. 配置repo可执行

下载完毕后会得到一个 git-repo 项目,找到里面的 repo 文件

在我们的android目录下新建一个bin目录,同时复制repobin目录

最后在加上可执行的权限

chmod a+x repo

4. 修改repo,设置repo下载源为清华源

修改下载 URL

双击打开 repo,修改 REPO_URL

. REPO_URL = 'git://aosp.tuna.tsinghua.edu.cn/android/git-repo'

. REPO_URL = 'https://aosp.tuna.tsinghua.edu.cn/android/git-repo'

同理修改成方案2,httpsurl, 方案一现在不能用了

然后使用

export PATH=......./android/bin:$PATH   (给出全路径)

导出 bin 执行目录

5.下载源码

新建一个目标文件夹用于存放源码文件,命令行中用 cd 指令进入。执行下面指令

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

上面的版本号在这里查询

http://source.android.com/source/build-numbers.html#source-code-tags-and-builds 

最后执行下面的指令就可以开始下载源码了

repo sync


漫长的等待, 我晚上下班回家之前开始下载的,早上来就下载好了

记得设置不要睡眠(电源选项&亮度和锁屏)

(3)下载驱动文件

接下来在官网下载手机对应的驱动(如下):

https://developers.google.com/android/nexus/drivers#hammerhead

找到 Nexus 5 (GSM/LTE) binaries for Android 4.4.4 (KTU84P)

下面三个文件都要下载,解压后是三个.sh文件,放到安卓源码根目录下,

分别对三个文件chmod a+x 文件名 赋权限,然后分别执行三个文件,此时会生成 vendor文件夹。

3
 编译系统源码

android官网的编译介绍

http://source.android.com/source/building.html

aosp_arm-eng为模拟器

nexus5aosp_hammerhead-userdebug

编译完后操作系统路径为 out/target/product/hammerhead

编译时依次执行下面这些命令即可

source build/envsetup.sh                           # 设置编译环境

lunch aosp_hammerhead-userdebug        # 设置编译选项

export USE_CCACHE=1                           #  使用缓存,可以加快以后的编译速度

prebuilts/misc/linux-x86/ccache/ccache -M 100G   #使用 100GB 来作为缓存的空间

#设置缓存地址,可以不要这个命令而使用默认缓存路径

export CCACHE_DIR=/<path_of_yourt_choice>/.ccache   

make -j4

编译完后:


输出目录: out/target/product/hammerhead

4
下载编译内核源码

此时编译的操作系统自带默认的内核,要修改内核的话,得重新下载内核源码并修改编译。

在Android源码文件夹下创建kernel文件夹,并下载内核源码:

相关说明在这里:

http://source.android.com/source/building-kernels.html

(1). git clone https://android.googlesource.com/kernel/msm.git

(由于实验手机设备为Nexus 5,因此我们选择内核代码为msm.git

(2). checkout所选内核版本

cd ~/source/kernel/msn

git branch –a

git checkout remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1

(3). 修改内核调试标志,绕过反调试(Kernel proc)

要修改的文件: 

kernel/msm/fs/proc/base.c 

kernel/msm/fs/proc/array.c 

要修改对以下文件的写入 

Status,stat

修改点: 

1. base.c 285行改成如下: 

else { 

           if (strstr(symname, "trace")) { 

                return sprintf(buffer, "%s", "sys_epoll_wait"); 

           } 

           return sprintf(buffer, "%s", symname); 

      } 

2. array.c134行改成如下: 

      static const char * const task_state_array[] = { 

           "R (running)",        /*    0 */ 

           "S (sleeping)",       /*    1 */ 

           "D (disk sleep)",     /*    2 */ 

           "S (sleeping)",       /*    4 */ 

           "S (sleeping)", /*     8 */ 

           "Z (zombie)",         /*  16 */ 

           "X (dead)",           /*  32 */ 

           "x (dead)",           /*  64 */ 

           "K (wakekill)",       /* 128 */ 

           "W (waking)",         /* 256 */ 

      };  

array.c187行改成如下: 

      "Gid:t%dt%dt%dt%dn", 

                get_task_state(p), 

                task_tgid_nr_ns(p, ns), 

                pid_nr_ns(pid, ns), 

                ppid, /*tpid*/0, 

                cred->uid, cred->euid, cred->suid, cred->fsuid, 

                cred->gid, cred->egid, cred->sgid, cred->fsgid); 

    修改完成后,按下面步骤编译内核,刷入系统

4、修改Makefile文件支持交叉编译器,编译内核。可用内核初始化脚本如下:

kernel源码目录新建build.sh

export PATH='/media/bingghost/data/android/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin':$PATH

export ARCH=arm

export SUBARCH=arm

export CROSS_COMPILE=arm-eabi-

make hammerhead_defconfig

make -j4

--------执行build.sh-------------

chmod 777 build.sh

./build.sh

编译成功后可以看到下面的输出:


编译完内核后,内核生成的路径为:kernel/msm/arch/arm/boot目录下的zImage-dtb文件(nexus 5是这个文件,nexus 4zImage文件,请注意别弄错了),把该文件复制到源码下的device/lge/hammerhead-kernel夹下(注意:nexus 4则为mako-kernel文件夹),覆盖掉同名文件,然后重新按上面步骤编译一次安卓源码(这时候编译很快完成)即可

5
刷机

刷机过程可以参考这篇文章

http://blog.csdn.net/bingghost/article/details/53308694

(1). 检测 USB 端口

1. 配置好adbfastboot的环境变量,android sdk里面均有

2. 检测adbfastboot能否正常识别手机

         adb devices

         fastboot devices

有型号的输出则能识别,不能则需要按照下面进配置

(2). 配置USB端口

如果上面的检测usb不通过,则按照下面的方法来配置

stackoverflow上的介绍

http://stackoverflow.com/questions/7641939/android-fastboot-waiting-for-devices

将下面的内容保存为51-android.rules,OWNER="xxx", xxx修改成你的用户名

# adb protocol on passion (Nexus One)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM==
"usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM==
"usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM==
"usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM==
"usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM==
"usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM==
"usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM==
"usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"
# adb protocol on manta (Nexus 10)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"
# adb protocol on hammerhead (Nexus 5)
SUBSYSTEM==
"usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee1", MODE="0600", OWNER="<username>"

修改51-android.rules,添加如下2,注意OWNER修改成自己的用户名

# fastboot protocol on manta (Nexus 5)

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0666", OWNER="<bingghost>"

# fastboot protocol on manta (Nexus 5)

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", OWNER="<bingghost>"

放到 Ubuntu /etc/udev/rules.d/51-android.rules

修改完后用命令

sudo service udev restart

重启服务进程,重新拨插数据线再

fastboot devices

查看是否识别出来

(3). 刷机

1. 进入bootload模式

手机关机之后, 按住下音量键和电源键(同时按住不放)

2. 解锁bootload

fastboot oem unlock

3. 刷机

插上手机连接上电脑,确认正常连接上电脑后,进行刷机

转到源码img生成路径

cd source/out/target/product/hammerhead/

adb reboot bootloader

fastboot -w flashall


大概两分钟后,系统刷成功




本文作者:饿了么SRC

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/63132.html

Tags:
评论  (0)
快来写下你的想法吧!

饿了么SRC

文章数:4 积分: 10

饿了么安全应急响应中心。

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号