• 源码编译绕过反调试


    参考师弟的贴子修改的, 基本我一次就弄好了, 没有遇到啥问题, 下面我主要是补充下他的帖子

    http://bbs.pediy.com/showthread.php?t=213481


    一. 环境搭建

    (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版本不对


    Cupcake到Froyo  (android1.5~android2.2.x) 使用JDK5

    Gingerbread到kitkat (android2.3.x~android4.4.x)使用JDK6

    Lollipop到Marshmallow (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环境都配置好了,下面开始下载源码


    二. 下载源码

    (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目录了


    cd到android目录执行下面第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目录,同时复制repo到bin目录

    最后在加上可执行的权限

    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,https的url, 方案一现在不能用了


    然后使用

    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文件夹。


    三. 编译系统源码

    android官网的编译介绍

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


    aosp_arm-eng为模拟器

    nexus5为aosp_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


    五. 下载编译内核源码

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

    在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.c第134行改成如下: 

          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.c第187行改成如下: 

          "Gid: %d %d %d %d ", 

                    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 4是zImage文件,请注意别弄错了),把该文件复制到源码下的device/lge/hammerhead-kernel夹下(注意:nexus 4则为mako-kernel文件夹),覆盖掉同名文件,然后重新按上面步骤编译一次安卓源码(这时候编译很快完成)即可


    六. 刷机

    刷机过程可以参考我之前的一篇文章

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


    (1). 检测 USB 端口

    1. 配置好adb和fastboot的环境变量,在android sdk里面均有

    2. 检测adb和fastboot能否正常识别手机

             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

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


     







  • 相关阅读:
    [文摘20070723]最经典的爱情观
    [转]ASP .Net C# 下 Word开发资料
    [引]如何藉由使用 Visual C# . NET 處理 Word 中的事件
    简单的搭建Web系统常用的框架页面
    Gentle 简单配置方法之一种
    在 可编辑的 Div 的 光标位置 插入 文字 或 HTML
    [转]使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
    VS2005 添加 Microsoft.Office.Tools.Word.dll 等引用
    要事第一 事不过三
    VC slider用法
  • 原文地址:https://www.cnblogs.com/bingghost/p/6111526.html
Copyright © 2020-2023  润新知