标 题:【共享】安卓源码 内核修改编译(修改内核调试标志绕过反调试) 作 者:koflfy 时 间:2016-10-26,18:05:19 链 接:http://bbs.pediy.com/showthread.php?t=213481 经过两天的时间,安卓操作系统源代码终于完全编译完毕 为了绕过一些反调试,修改了内核的几个调试标志。 感谢同学们的辉哥和群友们f8.如误或遗露,欢迎网友跟贴指正。
编译环境: Ubuntu14.04.4for64http://releases.ubuntu.com/14.04/ubuntu-14.04.4-desktop-amd64.iso jdk-6u45-linux-x64http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin?AuthParam=1467420548_35233aa4ba06eb66eb56a2a30757134b
手机:nexus5 官方指导网站:http://source.android.com/source/index.html 编译OS:Ubuntu14或者Mac 安装vim编辑器 sudoapt-getinstallvim
一、环境配置 安装JDK 在//usr/java在主目录下建立安装路径(不是home目录),并将下载jdk该路径下的文件: mkdir/usr/java jdk-6u45-linux-x64这是自解压文件linux上安装如下: chmod755jdk-6u45-linux-x64.bin (注意,这一步必须在jdk-6u45-linux-x64.bin目录下)) ./jdk-6u45-linux-x64.bin 配置JDK,编辑/etc/profile文件 sudovim/etc/profile 添加以下内容 exportJAVA_HOME=/usr/java/jdk1.6.0_45 exportJAVA_BIN=/usr/java/jdk1.6.0_45/bin exportPATH=$PATH:$JAVA_HOME/bin SSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar exportJAVA_HOMEJAVA_BINPATHCLASSPATH 让/etc/profile文件修改后立即生效,可使用以下命令: ./etc/profile 注意: .和/etc/profile有空格. 重启查看java版本 java-version 屏幕输出: javaversion"1.6.0_45" Java(TM)SERuntimeEnvironment(build1.6.0_45-b06) JavaHotSpot(TM)64-BitServerVM(build20.45-b01,mixedmode) 安装编译库 sudoapt-getinstallgit-coregnupgflexbisongperfbuild-essential\ zipcurlzlib1g-devgcc-multilibg -multiliblibc6-dev-i386\ lib32ncurses5-devx11proto-core-devlibx11-devlib32z-devccache\ libgl1-mesa-devlibxml2-utilsxsltprocunzip
配置USB端口(查后面fastboot手机问题在模式下不识别,文件内容需要修改,不能直接用于Nexus5)下载51-android.rules文件(见附件,下载后查看.doc删除扩展名),放到Ubuntu的/etc/udev/rules.d/51-android.rules目录下,并根据手机型号配置最后一个(username将字符串改为自己的用户名)repo源码使用repo下载源码工具。不需要以下方法FQ的,假如你觉得自己VPN如果足够强大,可以直接按照官网的指导下载设置github使用邮箱名称git工具(不必要)gitconfig--globaluser.email"<你的github的email地址>"gitconfig--globaluser.name"<你的github的name名称>"
下载repo工具(清华源)gitclonegit://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/gitclonehttps://aosp.tuna.tsinghua.edu.cn/android/git-repo.git得到一个git-repo项目,找到里面的repo复制文件~/bin/repo给予执行命令chmoda x~/bin/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'然后使用exportPATH=~/bin:$PATH导出bin用于存储源码文件的执行目录下载源码,命令行中用cd指令进入。执行以下指令repoinit-uhttps://aosp.tuna.tsinghua.edu.cn/android/platform/manifest-bandroid-4.4.4_r1-b后面的参数刚刚发现branch号repo更新使用reposync下载指令即可完成,也可以使用以下脚本exportPATH=~/bin:$PATHreposync-j4while["$?"!"!="0"];dosleep30reposync-j4done接下来在(如下):https://developers.google.com/android/nexus/drivers#hammerhead找到Nexus5(GSM/LTE)binariesforAndroid4.4.4(KTU84P)下载以下三个文件,解压后有三个.sh将文件放入Android源码目录,分别对三个文件进行处理chmoda x文件名授权,然后分别执行三个文件,此时生成vendor文件夹。编译代码如果前一步没有问题,可以直接用下面的指令编译(aosp_arm-eng为模拟器,nexus5为aosp_hammerhead-userdebug),编译后,操作系统路径out/target/product/hammerhead下。sourcebuild/envsetup.sh#设置编译环境lunchaosp_hammerhead-userdebug#设置编译选项exportUSE_CCACHE=1#使用缓存,未来的编译速度可以加快prebuilts/misc/linux-x86/ccache/ccache-M100G#使用100GB作为缓存空间exportCCACHE_DIR=/<path_of_yourt_choice>/.ccache#设置缓存地址,可以不要这个命令而使用默认缓存路径make-j4
初始化脚本如下:(init)exportJAVA_HOME=/usr/local/java/jdk1.6.0_45exportJRE_HOME=$JAVA_HOME/jreexportCLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/libexportPATH=$JAVA_HOME/bin:$JE_HOME/bin:$PATH. build/envsetup.shlunch aosp_hammerhead-userdebugmake -j4
此时编译的操作系统自带默认的内核,要修改内核的话,得重新下载内核源码并修改编译。在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/msngit branch –agit checkout remotes/origin/android-msm-hammerhead-3.4-kitkat-rm13、(Kernel proc)
要修改的文件: kernel/msm/fs/proc/base.c kernel/msm/fs/proc/array.c
要修改对以下文件的写入 Status,stat,
修改点: base.c 第285行改成如下: else { if (strstr(symname, "trace")) { return sprintf(buffer, "%s", "sys_epoll_wait"); } return sprintf(buffer, "%s", symname); } 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:\t%d\t%d\t%d\t%d\n", 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文件支持交叉编译器,编译内核。可用内核初始化脚本如下:#How to buildexport PATH='/home/coffee/source/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin':$PATHexport ARCH=armexport SUBARCH=armexport CROSS_COMPILE=arm-eabi-make hammerhead_defconfigmake -j4编译成功后可以看到下面的输出:OBJCOPY arch/arm/boot/zImageKernel: arch/arm/boot/zImage is readyCAT arch/arm/boot/zImage-dtbKernel: arch/arm/boot/zImage-dtb is ready编译完内核后,内核生成的路径为:kernel/msm/arch/arm/boot目录下的zImage-dtb文件(nexus 5是这个文件,nexus 4是zImage文件,请注意别弄错了),把该文件复制到源码下的device/lge/hammerhead-kernel夹下(注意:nexus 4则为mako-kernel文件夹),覆盖掉同名文件,然后重新按上面步骤编译一次安卓源码(这时候编译很快完成)即可。
插上手机连接上电脑,确认正常连接上电脑后,进行刷机转到源码img生成路径cd source/out/target/product/hammerhead/Adb reboot bootloaderFastboot -w flashall大概两分钟后,系统即刷成功。
:在 bootloader 下连不上手机的参考前两面的配置 USB 端口一节编译指令部分编译的m:编译所有的模块mm:编译当前目录下的模块,当前目录下要有 Android.mk 文件mmm:编译指定路径下的模块,指定路径下要有 Android.mk 文件部分编译完以后,需要使用Make snod 来把编译的东东整合到镜像中Bootloader解锁 我们买来的Nexus4默认都是锁了bootloader的,但是为了烧自己编的系统或者其他第三方ROM就需要解锁bootloader,google提供了接口让开发者可以方便的解锁。 先把Nexus4关机,然后同时按下两个音量键和power键,一直按住直到界面上出现bootloader的画面。 这时用usb线连上手机,在shell里执行:$ fastboot oem unlockfastboot模式下不识别手机问题。但adb模式正常coffee @ coffee -pc:~$ lsusbBus 001 Device 010: ID 18d1:4ee0 Google Inc.Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB HubBus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual MouseBus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
修改51-android.rules内容为以下两种之一(mode必须是0666,idVendor 与 idProduct(如果有)要与实际一一对应)http://stackoverflow.com/questions/7641939/android-fastboot-waiting-for-devices# fastboot protocol on manta (Nexus 5)SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0666", OWNER="< coffee >"# fastboot protocol on manta (Nexus 5)SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", OWNER="<coffee>"修改完后用命令sudo service udev restart重启服务进程,重新拨插数据线再fastboot devices查看是否识别出来上面make步骤若出现 make:nothing to be done for 'droid'就mak clean一下。
附上手机USB识别的需要的51-android.rules文件:
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="coffee"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="coffee"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="coffee"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="coffee"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="coffee"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="coffee"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="coffee"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="coffee"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="coffee"
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="coffee"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="coffee"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="coffee"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="coffee"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="coffee"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="coffee"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="coffee"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="coffee"
# adb protocol on hammerhead (Nexus 5)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee1", MODE="0600", OWNER="coffee"d
今天翻了下自己的收集的资料,发现看雪上有一篇比较详细的关于Android的源码和内核源码编译的帖子。尽管已经了解了怎么折腾,但是还是记录一下,谢谢看雪的这位兄弟。不管怎样,Andorid的源码和内核源码的编译还是谷歌官方的文档为参考基准。