首页
社区
课程
招聘
[分享]安卓源码+内核修改编译(修改内核调试标志绕过反调试)
2016-10-26 18:05 28239

[分享]安卓源码+内核修改编译(修改内核调试标志绕过反调试)

2016-10-26 18:05
28239
历经两天时间,终于完整的编译完安卓操作系统源码+内核,并修改了内核的几个调试标志以达到绕过一些反调试的目的。
在此感谢同学辉哥以及群友f8的指点,如有错误或者遗露的地方,欢迎网友跟贴指正。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
打赏
分享
最新回复 (54)
雪    币: 102
活跃值: (1575)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 1 2016-10-26 18:06
2
0
编译环境:
Ubuntu 14.04.4 for 64  http://releases.ubuntu.com/14.04/ubuntu-14.04.4-desktop-amd64.iso
jdk-6u45-linux-x64     http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin?AuthParam=1467420548_35233aa4ba06eb66eb56a2a30757134b
手机:nexus 5
官方指导网址
http://source.android.com/source/index.html
编译 OS : Ubuntu 14 或者 Mac

安装vim编辑器       
sudo apt-get install vim
一、环境配置
安装JDK
创建安装目录,在/usr/java下建立安装路径(主目录下,并非home目录),并将下载好的jdk文件考到该路径下:

mkdir /usr/java

jdk-6u45-linux-x64 这个是自解压的文件,在linux上安装如下:

chmod 755 jdk-6u45-linux-x64.bin

(注意,这个步骤一定要在jdk-6u45-linux-x64 .bin所在目录下)
./jdk-6u45-linux-x64.bin

配置JDK,编辑/etc/profile文件

sudo vim /etc/profile

在里面添加如下内容

export JAVA_HOME=/usr/java/jdk1.6.0_45
export JAVA_BIN=/usr/java/jdk1.6.0_45/bin
export PATH=$PATH:$JAVA_HOME/bin
SSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

让/etc/profile文件修改后立即生效 ,可以使用如下命令:
. /etc/profile
注意: . 和 /etc/profile 有空格.

重启查看java版本
java -version
屏幕输出:
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

安装编译库
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
雪    币: 102
活跃值: (1575)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 1 2016-10-26 18:07
3
0
配置 USB 端口(查看后面 fastboot模式下不识别手机问题,该文件内容需要修改不能直接用于Nexus5)
下载51-android.rules文件(见附件,下载后把.doc扩展名去掉就行),放到 Ubuntu 的/etc/udev/rules.d/51-android.rules 目录下,
并根据手机的机型进行配置(把最后一个username字符串改成自己用户名)

repo源码
使用 repo 工具进行源码下载。
下面的方法是不需要翻墙的, 如果你认为自己的 VPN 够强大的话可以直接按照官网的指导来下载
设置 github 邮箱姓名使用 git 工具
git config --global user.email "<你的 github 的 email 地址>"
git config --global user.name "<你的 github 的 name 名称>"
下载 repo 工具(清华的源)
git clone git://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/
git clone https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git

得到一个 git-repo 项目,找到里面的 repo 文件,复制到 ~/bin/repo 中
赋予执行命令
Chmod a+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'
然后使用
export PATH=~/bin:$PATH
导出 bin 执行目录

下载源码
新建一个目标文件夹用于存放源码文件,命令行中用 cd 指令进入。执行下面指令
repo init -u https://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-4.4.4_r1
-b 后面的参数是刚才查到的 branch 号

repo 更新使用 repo sync 指令即可完成下载,也可以使用下面的脚本

export PATH=~/bin:$PATH
repo sync -j4
while [ "$?" != "0" ]; do
  sleep 30
  repo sync -j4
done

接下来在官网下载手机对应的驱动(如下):
https://developers.google.com/android/nexus/drivers#hammerhead
找到 Nexus 5 (GSM/LTE) binaries for Android 4.4.4 (KTU84P)
下面三个文件都要下载,解压后是三个.sh文件,放到安卓源码目录下,分别对三个文件chmod a+x 文件名 赋权限,然后分别执行三个文件,此时会生成 vendor文件夹。

编译代码如果前面的步骤没出问题,那么用下面的指令就可以直接进行编译(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
以上可用初始化脚本如下:(init)
export JAVA_HOME=/usr/local/java/jdk1.6.0_45
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
. build/envsetup.sh
lunch aosp_hammerhead-userdebug
make -j4
雪    币: 102
活跃值: (1575)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 1 2016-10-26 18:09
4
0
此时编译的操作系统自带默认的内核,要修改内核的话,得重新下载内核源码并修改编译。在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-rm1

3、修改内核调试标志,绕过反调试(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 build
export PATH='/home/coffee/source/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

编译成功后可以看到下面的输出:
OBJCOPY  arch/arm/boot/zImage
Kernel:     arch/arm/boot/zImage is ready
CAT           arch/arm/boot/zImage-dtb
Kernel:     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文件夹),覆盖掉同名文件,然后重新按上面步骤编译一次安卓源码(这时候编译很快完成)即可。
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
exediy 1 2016-10-26 18:09
5
0
希望能出个完整的 教程.比如会有哪些需要注意这些.哪些错误可以怎么处理!编译环境的搭建.这样可以帮助到不少人
雪    币: 102
活跃值: (1575)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 1 2016-10-26 18:10
6
0
刷机
插上手机连接上电脑,确认正常连接上电脑后,进行刷机
转到源码img生成路径
cd source/out/target/product/hammerhead/
Adb reboot bootloader
Fastboot -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 unlock

fastboot模式下不识别手机问题。但adb模式正常
coffee @ coffee -pc:~$ lsusb
Bus 001 Device 010: ID 18d1:4ee0 Google Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 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一下。
上传的附件:
雪    币: 341
活跃值: (133)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
地狱怪客 2 2016-10-26 23:17
7
0
插一脚。。
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无边 2016-10-26 23:51
8
0
手把手的教程,实在是太详细了,赞一个,
不过我的Nexus4 直接不用设置,自动识别
雪    币: 93
活跃值: (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gugubupt 2016-10-27 09:51
9
0
mark
雪    币: 35
活跃值: (75)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
安东尼大木 2016-10-27 16:08
10
0
自己编译内核就能规避那些用syscall方式打开status,stat,wchan检测的技巧了,支持楼主!
雪    币: 8009
活跃值: (2804)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
netwind 13 2016-10-27 16:10
11
0
感谢楼主的教程!
雪    币: 2910
活跃值: (507)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
曲终人散 2016-10-28 13:36
12
0
也在学习
雪    币: 1110
活跃值: (281)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fishso 2016-10-28 18:04
13
0
感谢楼主,学习学习
雪    币: 187
活跃值: (551)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
Loopher 2016-10-28 18:10
14
0
感谢楼主的教程,刚好也准备做这个~先mark一下
雪    币: 2910
活跃值: (507)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
曲终人散 2016-10-28 22:33
15
0
编译运行的时间花了多少时间啊
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lovexy看雪 2016-10-28 22:40
16
0
膜拜大神装比
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
熟如陌路 2016-10-29 19:15
17
0
curl: (22) The requested URL returned error: 404 Not Found
Server does not provide clone.bundle; ignoring.
为何清华开源还会这样
雪    币: 1054
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶二哥 2016-10-30 22:02
18
0
默默的点个赞虽然我没看懂
雪    币: 5995
活跃值: (3470)
能力值: ( LV6,RANK:96 )
在线值:
发帖
回帖
粉丝
Imyang 1 2016-11-2 18:02
19
0
我完整编译Nexus5 6.0.1,一次差不多1小时40分钟。
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
amycode强 2016-11-4 09:40
20
0
mark 赞
雪    币: 244
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dapro 2016-11-10 14:46
21
0
mark,非常有用!
雪    币: 275
活跃值: (320)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
currwin 1 2016-11-10 16:30
22
0
这位同学笔记做得不错嘛。不过课件中有个地方是有问题的
git config --global user.email "<你的 github 的 email 地址>"
git config --global user.name "<你的 github 的 name 名称>"
这一步不是必要的。
雪    币: 275
活跃值: (320)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
currwin 1 2016-11-10 16:32
23
0
请百度清华源,里面有官方的指导。题主写的方法半年前还可以用,现在的话有一点的变化
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
熟如陌路 2016-11-10 18:25
24
0
这个不影响,我编译成功了  csdn上有篇帖子也不错
雪    币: 2375
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
petersonhz 2016-11-14 18:32
25
0
楼主编译后在手机上跑,还是模拟器上跑呢?
游客
登录 | 注册 方可回帖
返回