技术背景:
Android手机获得Root权限,其实就是让/system和/data分区获得读写的权限.这两个分区的权限配置,一般在根分区的init.rc文件中,修改这个文件可永久获得root权限.
众所周知,市面上绝大部分的Android手机文件系统有三个分区,分别是/,/system,/data.根分区(/)是打包为ramdisk.img后,再与kernel的zImage打包为boot.img.boot.img在EMMC/NAND中以RAW DATA的形式存在,且除使用烧写工具外,无法读写.正因如此,根分区(/)在每次开机时都会从存储器中加载到RAM, 所以根分区(/)是难以不刷机破解的.
那么如何破解?
获得boot.img,解压boot.img得到ramdisk.img, 再由ramdisk.img解压得到root目录(/),修改其中的init.rc文件,再打包,最终得到新的boot.img.最后利用烧写工具将boot.img烧写到手机即可
具体分析:
一.提取boot.img
(1).扒官方的rom:下载rom包,解压缩可以看到里面的boot.img文件
关于rom包,里面的文件:
boot.img Linux内核和基本文件系统的内核包
system.img 是系统的/system目录
recovery.img 是系统恢复程序所用的镜像
userdata.img 是系统的/data目录
(2).真机中提取(这里以Samsung Galaxy S4 为例)
msm 代表高通的芯片
这个msm_sdcc.1是外接的SD卡挂载的目录,by-name指的是这个sd卡分区的名称
现在可以通过dd命令将boot.img提取出来
用split_boogimg.pl 将提取的boot.img分解出来,可以得到boot.img-kernel
二.逆向分析boot.img-kernel
一般来说,这个kernel内核文件都是一个gzip的压缩格式,偶尔也会有其他的压缩算法.比如S5的压缩算法是lzop
为什么是这样的情况呢?简要说下:
Kernel被载入内存后是以压缩的状态存放在磁盘之上的,他头上的一段代码就是为了初始化并且解压缩的一段代码.这段代码把自身压缩的一部分代码解压出来.放到真正内核所在的位置上.所以他所用的压缩算法要从他头上那段来指定的.所以如果今后厂商使用一些自己的压缩算法,那么还是非常不好分析的.
这样一般我们解压缩之后,就能得到真正的zImage这样的一个二进制文件.
现在真正的可以用IDA来分析一下它.载入IDA发现
分析的效果并不理想,因为我们没有内核的符号表.
那么符号表的在哪里呢?
为什么地址都是0呢?
因为有一个patch 在/proc/sys/kernel/kptr_restrict默认为1,就隐藏了symbol
那么我们将其置0就可以正常打印
再次用IDA载入,手动添加地址
现在就可以真正的分析zImage文件啦~~~
Android手机获得Root权限,其实就是让/system和/data分区获得读写的权限.这两个分区的权限配置,一般在根分区的init.rc文件中,修改这个文件可永久获得root权限.
众所周知,市面上绝大部分的Android手机文件系统有三个分区,分别是/,/system,/data.根分区(/)是打包为ramdisk.img后,再与kernel的zImage打包为boot.img.boot.img在EMMC/NAND中以RAW DATA的形式存在,且除使用烧写工具外,无法读写.正因如此,根分区(/)在每次开机时都会从存储器中加载到RAM, 所以根分区(/)是难以不刷机破解的.
那么如何破解?
获得boot.img,解压boot.img得到ramdisk.img, 再由ramdisk.img解压得到root目录(/),修改其中的init.rc文件,再打包,最终得到新的boot.img.最后利用烧写工具将boot.img烧写到手机即可
具体分析:
一.提取boot.img
(1).扒官方的rom:下载rom包,解压缩可以看到里面的boot.img文件
关于rom包,里面的文件:
boot.img Linux内核和基本文件系统的内核包
system.img 是系统的/system目录
recovery.img 是系统恢复程序所用的镜像
userdata.img 是系统的/data目录
(2).真机中提取(这里以Samsung Galaxy S4 为例)
代码:
adb shell 进入真机, ls -l /dev/block/platform/msm_sdcc.1/by-name
这个msm_sdcc.1是外接的SD卡挂载的目录,by-name指的是这个sd卡分区的名称
现在可以通过dd命令将boot.img提取出来
代码:
dd if=/dev/block/mmcblk0p20 of=/sdcard/boot.img
用split_boogimg.pl 将提取的boot.img分解出来,可以得到boot.img-kernel
二.逆向分析boot.img-kernel
一般来说,这个kernel内核文件都是一个gzip的压缩格式,偶尔也会有其他的压缩算法.比如S5的压缩算法是lzop
为什么是这样的情况呢?简要说下:
Kernel被载入内存后是以压缩的状态存放在磁盘之上的,他头上的一段代码就是为了初始化并且解压缩的一段代码.这段代码把自身压缩的一部分代码解压出来.放到真正内核所在的位置上.所以他所用的压缩算法要从他头上那段来指定的.所以如果今后厂商使用一些自己的压缩算法,那么还是非常不好分析的.
这样一般我们解压缩之后,就能得到真正的zImage这样的一个二进制文件.
现在真正的可以用IDA来分析一下它.载入IDA发现
分析的效果并不理想,因为我们没有内核的符号表.
那么符号表的在哪里呢?
代码:
cat/proc/kallsyms
为什么地址都是0呢?
因为有一个patch 在/proc/sys/kernel/kptr_restrict默认为1,就隐藏了symbol
那么我们将其置0就可以正常打印
代码:
echo 0 > /proc/sys/kernel/kptr_restrict cat /proc/kallsyms > /data/local/tmp/syms.txt
再次用IDA载入,手动添加地址
现在就可以真正的分析zImage文件啦~~~