在学习Android逆向的时候,总会用到Android的调试模式。一般情况下,Nexus 5手机上的Android系统是运行在user模式下的,为了方便对Android应用程序进行动态调试,因此采取一劳永逸的方法,修改手机系统ROM里的boot.img文件,将Nexus 5手机里的系统由user模式修改为debug模式。发现很多的同学都在Ubuntu下修改手机的boot.img文件,心里比较躁动,也就跟随别人的脚步,自己折腾一下,顺便做个记录了,方便以后查阅。
修改boot.img文件的折腾条件:
[手机型号]----谷歌手机 Nexus 5
[操作环境]----Linux系统 Ubuntu 15.4(x64 dvd版)
[手机系统]----谷歌官方适用于Nexus 5手机的Android 5.0版本,下载地址:https://dl.google.com/dl/android/aosp/hammerhead-lrx21o-factory-01315e08.tgz
Ubuntu系统和Java环境的配置是进行修改boot.img文件操作的一些基本条件,这里就不介绍了,需要的网上查一查。下面的操作就以谷歌Nexus 5手机配备谷歌官方的Android 5.0的ROM为例,进行修改boot.img文件的操作。
1.修改boot.img文件工具和boot.img文件文件的准备
从上面提供的boot.img的打包解包工具的下载地址下载需要的工具,放到boot_img_tool文件夹下的tools文件目录里,从上面提供下载的Nexus 5的官方Android 5.0的Rom里解压提取到boot.img文件直接放到boot_img_tool文件夹下,如图:
正如作者http://bbs.pediy.com/showthread.php?t=197334所言,确实网上很多所谓的boot.img的解包打包工具极其不靠谱,这位作者的工具还是靠谱的。在写这篇博文的时候,尝试了几个工具修改boot.img都不成功,将修改后的boot.img刷入Nexus 5手机以后,手机重启卡在了启动界面不能动弹。
2.使用工具 unpackbootimg 解包boot.img文件
A.执行命令,获取boot.img的解包结果参数:
cd /home/android/androidfile/boot_img_tool/
chmod +x ./tools/unpackbootimg
./tools/unpackbootimg -i boot.img
在使用 unpackbootimg命令 解包boot.img文件时,遇到提示“bash: ./tools/unpackbootimg: 权限不够”错误,后来发现需要给工具unpackbootimg文件添加执行权限就可以了。注意:在boot.img文件解包完成以后的结果参数要记下来,后面打包boot.img文件的时候会用到,如下图:
android@ubuntu:~/androidfile/boot_img_tool$ ./tools/unpackbootimg -i boot.img
Android magic found at: 0
BOARD_KERNEL_CMDLINE console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1
BOARD_KERNEL_BASE 00000000
BOARD_RAMDISK_OFFSET 02900000
BOARD_SECOND_OFFSET 00f00000
BOARD_TAGS_OFFSET 02700000
BOARD_PAGE_SIZE 2048
BOARD_SECOND_SIZE 0
BOARD_DT_SIZE 0
B.执行上面的命令只是为了获取解包后的结果参数,因为在后面的boot.img打包步骤中会用到这些结果参数并且一般的情况下手机设备的解包结果参数是不同的,具体的要按照实际的手机设备的解包结果参数为准,不能一概而论。获取到boot.img的解包结果参数以后,将解压释放得到的上面图中的标出的文件全部删除
执行下面的命令,对boot.img文件进行有效的解包,得到boot.img-kernel和boot.img-ramdisk.gz两个文件:
chmod +x ./tools/split-bootimg.pl
./tools/split-bootimg.pl boot.img
3.使用执行gzip命令解压boot.img-ramdisk.gz文件
继续执行命令:
mkdir ramdisk
cd ramdisk
gzip -dc ../boot.img-ramdisk.gz | cpio -i
创建文件ramdisk然后进入文件ramdisk,执行 gzip -dc ../boot.img-ramdisk.gz | cpio -i命令解压boot.img-ramdisk.gz文件,如下图:
4.修改 default.prop文件中的 ro.debuggable=1
在boot.img-ramdisk.gz解压后释放文件的ramdisk文件下,找 default.prop文件 以文本方式打开,修改 default.prop文件中的 ro.debuggable=0 这一行为ro.debuggable=1 ,就可以使修改后的系统运行在debug模式下;这里为了打开 内核root 执行adb root 命令,顺便修改 default.prop文件中的 ro.secure=1 这一行为ro.secure=0 然后保存退出。如下图:
5.使用工具mkbootfs 生成ramdisk.img文件
继续执行下面的命令:
cd ../
chmod +x ./tools/mkbootfs
./tools/mkbootfs ./ramdisk | gzip > ramdisk.img
6.使用工具mkbootimg对解包后的boot.img文件进行打包操作
根据步骤2中执行 ./tools/unpackbootimg -i boot.img 命令得到的各种结果参数信息,构建打包生成修改后的boot.img文件。
android@ubuntu:~/androidfile/boot_img_tool$ ./tools/unpackbootimg -i boot.img
Android magic found at: 0
BOARD_KERNEL_CMDLINE console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1
BOARD_KERNEL_BASE 00000000
BOARD_RAMDISK_OFFSET 02900000
BOARD_SECOND_OFFSET 00f00000
BOARD_TAGS_OFFSET 02700000
BOARD_PAGE_SIZE 2048
BOARD_SECOND_SIZE 0
BOARD_DT_SIZE 0
继续执行下面的命令:
chmod +x ./tools/mkbootimg
./tools/mkbootimg --base 0x00000000 --ramdisk_offset 0x02900000 --second_offset 0x00F00000 --tags_offset 0x02700000 --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' --kernel boot.img-kernel --ramdisk ramdisk.img -o newboot.img
上面的命令的的由来:
执行命令,顺利生成的 newboot.img文件:
7.Nexus 5 手机的Android 5.0版本系统的boot.img文件修改成功了。
在Windows系统环境将在Ubuntu下修改原boot.img文件成功生成的newboot.img文件,重新刷到Nexus 5手机上。PC端通过USB数据线连接到Nexus 5手机上,在PC端的cmd命令下执行 adb reboot-bootloader 命令手机重启或者重启手机同时按【音量下键+电源键】进入 Fastboot Mode模式,执行下面的命令脚本flash_no_data_debug.bat将修改后的.img文件newboot.img刷到Nexus 5手机上。
PATH=%PATH%;"%SYSTEMROOT%\System32"
fastboot flash bootloader bootloader-hammerhead-hhz12d.img
fastboot reboot-bootloader
ping -n 5 127.0.0.1 >nul
fastboot flash radio radio-hammerhead-m8974a-2.0.50.2.21.img
fastboot reboot-bootloader
ping -n 5 127.0.0.1 >nul
fastboot flash recovery recovery.img
fastboot reboot-bootloader
ping -n 5 127.0.0.1 >nul
fastboot flash boot newboot.img
fastboot reboot-bootloader
ping -n 5 127.0.0.1 >nul
fastboot flash system system.img
fastboot reboot-bootloader
ping -n 5 127.0.0.1 >nul
fastboot flash cache cache.img
fastboot flash userdata userdata.img
echo 刷机成功,按任意键重启手机...
pause >nul
fastboot reboot
exit
8.测试手机是否刷机成功并正常工作在debug模式下
很幸运刷机成功,手机开到开发者模式,USB数据线连接到Window电脑端正常,cmd命令行环境下执行;
adb shell
cat default.prop
以调试模式,使用命令:adb shell am start -D -n <包名>/<Activity名> 启动发布版的应用Cydia Substrate,启动成功,结果如下:
adb shell am start -D -n com.saurik.substrate/.SetupActivity
OK,笔记做完了,心里的事情也就落下了。
整个过程用到的所有的命令整理:
cd /home/android/androidfile/boot_img_tool/
chmod +x ./tools/unpackbootimg
./tools/unpackbootimg -i boot.img
chmod +x ./tools/split-bootimg.pl
./tools/split-bootimg.pl boot.img
mkdir ramdisk
cd ramdisk
gzip -dc ../boot.img-ramdisk.gz | cpio -i
cd ../
chmod +x ./tools/mkbootfs
./tools/mkbootfs ./ramdisk | gzip > ramdisk.img
chmod +x ./tools/mkbootimg
./tools/mkbootimg --base 0x00000000 --ramdisk_offset 0x02900000 --second_offset 0x00F00000 --tags_offset 0x02700000 --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' --kernel boot.img-kernel --ramdisk ramdisk.img -o newboot.img
adb shell
cat default.prop
adb shell am start -D -n com.saurik.substrate/.SetupActivity
整个过程用到的工具的下载地址:http://download.csdn.net/detail/qq1084283172/9631049。