原文 http://bbs.pediy.com/showthread.php?t=207538
感谢作者整理,亲测可用 坐着用的mac 现在改成windows下操作
设备nexus5 系统android 4.4
如果 设备与上不符 按照以下方法获取boot.img
一、 提取ker内核文件
在提取zImage前,必须确保自己拥有root权限。(adb root 获取root权限)
输入命令:
adb shell
ls -l /dev/block/platform/msm_sdcc.1(具体设备具体定)/by-name,
找到boot这一项,记下路径
将boot导出为boot.img
dd if=/dev/block/mmcblk0p19 of=/data/local/boot.img
adb pull /data/local/boot.img boot.img
如果设备和系统的和给出符话直接 使用源码的boot.img更好
二.使用 bootimg.exe工具,解开boot.img
Bootimg 和boot.img文件放到同一目录
执行bootimg --unpack-bootimg 该命令会解包出内核:kernel和ramdisk.gz.
kernel就是内合文件 和zImage相同
将kernel文件复制为文件名为z.gz的文件,并使用010editor查找十六进制1f 8b 08 00,找到后把前面的数据全删掉,使z.gz文件变成标准的gzip压缩文件,这样子就可以使用gunzip解压了。
命令:gunzip.exe z.gz
生成文件z就是祼二进制文件zImage。
二、 提位、修改关键代码
zImage文件可以直接使用IDA去打开,但需要设置参数。
在上图,设置处理器类型为ARM Little-endian,点【ok】后,弹下图
在ROM start address和Loading address填0xc0008000,点【ok】,IDA显示效果如下图所示,没有函数名,不方便定位代码。
先回到root下的adb shell,输入命令:
echo 0 > /proc/sys/kernel/kptr_restrict
关闭符号屏蔽
再输入以下命令查看这两函数的地址
回到IDA,按g跳转到c01b083c(__task_pid_nr_ns)地址处,在光标放在在该函数处:
然后按x,弹出引用搜索框
在搜索框里,找到sub_c02b9ff8(proc_pid_status)地址对应的函数,双击它,如果IDA没有分析出该函数,就进行以下操作:
按shift+f12,搜索TracerPid,找到以下项
双击它,看到
再双击【DATA XREF: sub_c02b9ff8+190】,IDA就能分析出sub_c02b9ff8函数了,然后重新搜索sub_c01b083c的引用。找到后,双击它,得以下图:
经本人分析得到的修改方法是把MOVEQ R10, R0替换为MOV R10, #0,机器码 00 A0 A0 01 替换为 00 A0 A0 E3
指令的文件偏移为(C02BA568-C0008000=2B2568) (使用010editor修改)
及把BL sub_C01B083C替换为MOV R0, #0,机器码 AF DB FB EB 为00 00 A0 E3,
指令的文件偏移为(C02BA578-C0008000=2B2578)|(原文中错误的地方)
三、 刷回手机
刷回前需要先打包boot.img文件
使用命令压缩成z.gz:gzip -n -f -9 z
三、使用010editor将z.gz的二进制数据覆盖到原kernel文件的1F 8B 08 00处的位置(新的z.gz文件必须比原z.gz文件小,并且回写回去时不能改变原kernel文件的大小及修改原kernel文件后面的内容,否则会很麻烦),这时得到了kernel文件。
注:这个地方可以新建一个用010editor 新建hex文件 把 原kernel文件1F 8B 08 00处一起的数据复制到 新文件里 然后把 z.gz的数据添加复制到 新文件里 ,这时候 比对 原kernel和新文件
把原kernel文件中 多的数据 一个字节不少的赋值到新的文件中,这样就组成新的 kernel 文件 新文件和原kernel一样大。把原kernel文件删除 把新文件重命名为kernel
执行命令bootimg --repack-bootimg base ”cmdline” page_size padding_size
其中上述命令中的黑体部分为包命令的输出值。得到boot.img文件。
手机重启进入刷机模式,然后,执行命令fastboot flash boot boot.img。
完成刷机后,重新开机,就大功告成了。
四、 还原砖头
刷内核,不免会有刷成砖头的情况。
使用步骤1中提取到的原版boot.img,解包后会被命名为 bootold.img 在刷机模式下,执行fastboot flash boot bootold.img就还原系统了。
所以工具下载地址 http://pan.baidu.com/s/1bo8RUmN