专栏首页difcareer的技术笔记修改手机的ro.debuggable配置0x01:获取boot.img0x02:修改boot.img0x03:boot.img相关0x04:变砖后的自救

修改手机的ro.debuggable配置0x01:获取boot.img0x02:修改boot.img0x03:boot.img相关0x04:变砖后的自救

我们自己编译的源码刷机ro.debuggable就是为1,这个时候所有的进程都可以远程调试。但是自己编译的源码里面没有GooglePlay,有些应用的部分功能又依赖于GooglePlay。那怎么办呢?

有人发布过工具,通过ptrace方式,动态修改了内存值,将ro.debuggable改为1,那工具在高版本上似乎没有适配不起作用,而且是临时解决方案,重启手机就失效了。

下面说一种通过刷机永久解决方案。

虽然说刷机有风险,但是你要是按照正确的姿势来,也没有那么多风险(注意看完全文再实践)

环境: nexus6p 刷了Google发布的7.1.2(N2G48C)OTA,其他版本也没什么问题。

ro.debuggable的配置位于/default.prop, /default.prop又来源于手机每次启动时boot.img中ramdisk的挂载,所以想要直接通过修改/default.prop是不可行的(被覆盖)。 只有修改boot.img中的内容才可以。

0x01:获取boot.img

我本地就有OTA文件,所以可以直接从里面解压出boot.img,如果没有OTA文件,那就是只能从手机中导出boot.img。

如何导出?

  1. 首先,手机得root,才能有权限访问,如何root,参考:nexus5 android5.0.1 使用TWRP Recovery安装supersu,其他版本Root搜索 版本+twrp 即可找到解决方案。
  2. 手机root后,执行adb root让adb 运行在root权限下,假如之后的adb shell没有进入root的shell环境,说明没成功,此时,可以通过安装adbd-insecure来解决,它通过对adbd的一些修改,让adbd能运行在root权限下。
  3. 查找boot.img位置, 在/dev/block子目录下通过by-name查看,手机不同,具体路径可能会不同。
#  ls -al /dev/block/platform/soc.0/f9824900.sdhci/by-name/
total 0
drwxr-xr-x 2 root root  920 1970-03-19 13:19 .
drwxr-xr-x 4 root root 1000 1970-03-19 13:19 ..
lrwxrwxrwx 1 root root   20 1970-03-19 13:19 DDR -> /dev/block/mmcblk0p8
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 aboot -> /dev/block/mmcblk0p10
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 abootbak -> /dev/block/mmcblk0p16
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 apdp -> /dev/block/mmcblk0p22
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 boot -> /dev/block/mmcblk0p34
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 cache -> /dev/block/mmcblk0p38
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 cmnlib -> /dev/block/mmcblk0p25
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 cmnlibbak -> /dev/block/mmcblk0p27
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 devinfo -> /dev/block/mmcblk0p17
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 dpo -> /dev/block/mmcblk0p28
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 frp -> /dev/block/mmcblk0p41
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 fsc -> /dev/block/mmcblk0p29
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 fsg -> /dev/block/mmcblk0p18
lrwxrwxrwx 1 root root   20 1970-03-19 13:19 hyp -> /dev/block/mmcblk0p6
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 hypbak -> /dev/block/mmcblk0p15
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 keymaster -> /dev/block/mmcblk0p24
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 keymasterbak -> /dev/block/mmcblk0p26
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 keystore -> /dev/block/mmcblk0p40
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 limits -> /dev/block/mmcblk0p19
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 metadata -> /dev/block/mmcblk0p33
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 misc -> /dev/block/mmcblk0p39
lrwxrwxrwx 1 root root   20 1970-03-19 13:19 modem -> /dev/block/mmcblk0p1
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 modemst1 -> /dev/block/mmcblk0p20
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 modemst2 -> /dev/block/mmcblk0p21
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 msadp -> /dev/block/mmcblk0p23
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 oem -> /dev/block/mmcblk0p36
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 oeminfo -> /dev/block/mmcblk0p31
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 persist -> /dev/block/mmcblk0p32
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 persistent -> /dev/block/mmcblk0p42
lrwxrwxrwx 1 root root   20 1970-03-19 13:19 pmic -> /dev/block/mmcblk0p7
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 pmicbak -> /dev/block/mmcblk0p11
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 recovery -> /dev/block/mmcblk0p35
lrwxrwxrwx 1 root root   20 1970-03-19 13:19 rpm -> /dev/block/mmcblk0p5
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 rpmbak -> /dev/block/mmcblk0p14
lrwxrwxrwx 1 root root   20 1970-03-19 13:19 sbl1 -> /dev/block/mmcblk0p2
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 sbl1bak -> /dev/block/mmcblk0p12
lrwxrwxrwx 1 root root   20 1970-03-19 13:19 sdi -> /dev/block/mmcblk0p3
lrwxrwxrwx 1 root root   20 1970-03-19 13:19 sec -> /dev/block/mmcblk0p9
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 ssd -> /dev/block/mmcblk0p30
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 system -> /dev/block/mmcblk0p43
lrwxrwxrwx 1 root root   20 1970-03-19 13:19 tz -> /dev/block/mmcblk0p4
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 tzbak -> /dev/block/mmcblk0p13
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 userdata -> /dev/block/mmcblk0p44
lrwxrwxrwx 1 root root   21 1970-03-19 13:19 vendor -> /dev/block/mmcblk0p37

可以看到boot -> /dev/block/mmcblk0p34

  1. adb pull /dev/block/mmcblk0p34 boot.img,这一步就需要adbd运行在root下才行,如果不想弄adbd,也可以在root下,将这个文件复制到sdcard再pull。

注意:一定要保存好没有修改的boot.img,用于变砖后的自救。

0x02:修改boot.img

之前我都是通过一些脚本进行修改,最近发现 Image Kitchen for Android这个app,将解压、修改、打包放到了手机上,更方便,于是推荐这种方式。

  1. adb push boot.img /sdcard/
  2. 参考修改default.prop debuggable用于真机调试的方法一文做修改,得到image-new.img。
  3. adb pull /sdcard/image-new.img
  4. adb reboot bootloader
  5. fastboot flash boot image-new.img
  6. fastboot reboot

搞定。

0x03:boot.img相关

虽然Image Kitchen for Android帮我们做了解压,修改,打包的事情,但是我们也可以进一步了解一下boot.img,通过[TOOL] Boot.img tools [unpack, repack, ramdisk]获取到相关工具。

  1. 查看boot.img信息
$ ./boot_info boot.img
Page size: 4096 (0x00001000)
Kernel size: 11161941 (0x00aa5155)
Ramdisk size: 1508718 (0x0017056e)
Second size: 0 (0x00000000)
Board name:
Command line: 'androidboot.hardware=angler androidboot.console=ttyHSL0 msm_rtb.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 boot_cpus=0-3 no_console_suspend buildvariant=user'
Base address: 31457024 (0x01dfff00)

其实boot.img 就是linux kernel + ramdisk。

  1. 解压boot.img
$ ./split_boot boot.img
Page size: 4096 (0x00001000)
Kernel size: 11161941 (0x00aa5155)
Ramdisk size: 1508718 (0x0017056e)
Second size: 0 (0x00000000)
Board name:
Command line: 'androidboot.hardware=angler androidboot.console=ttyHSL0 msm_rt                                  b.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 boot_cpus=0-3 no_co                                  nsole_suspend buildvariant=user'
Base address: (0x01dfff00)

得到解压结果:

image.png

image.png

可以看到手机的根目录就是根据ramdisk挂载的。其中有我们的default.prop。

  1. 修改及重打包 这个工具集里面还有其他的工具,里面就有打包。注意在重打包的时候,一定要严格填写我们在1中看到的信息,这样打出来的boot.img才可以正常使用。

0x04:变砖后的自救

假如你刷入修改后的boot.img,手机起不来了,别急,你可以将没有修改的boot.img刷回去就行了。

文中提到的工具及apk: https://github.com/difcareer/AndroidImgTool

参考文档: 修改default.prop debuggable用于真机调试的方法

[TOOL] Boot.img tools [unpack, repack, ramdisk]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android Inline Hook 详解前言原理分析

    网上有几篇关于Android inline hook的文章,这篇尤其不错,还有对应的示例代码。为了方便调试看结果,我将其改为gradle工程,代码见这里。你需要...

    用户2930595
  • 使用 IDA 破解某app的签名校验

    最近在分析某app的网络通信逻辑,其中的加密解密都在so中完成,且有签名校验,抠取so到写的demo中运行会crash。

    用户2930595
  • Nexus5 bootloader内容初探及延伸思考编译使用

    在Android启动过程分析-从按下电源键到第一个用户进程[转载]中,我们知道BootLoader是在操作系统前执行的程序,有没有很好奇它到底有些啥内容呢?

    用户2930595
  • Java EE之SSM框架整合开发 -- (2) Spring IoC

    本章主要讲解内容:Spring IoC的基本概念、Spring IoC容器、依赖注入的类型。

    浩Coding
  • 腾讯云服务器怎么购买(领取腾讯云优惠券)

    现在购买腾讯云服务器的用户越来越多了,毕竟云服务器已经是广大站长和企业做网站的首选,而腾讯云服务器,依靠腾讯的强大技术支撑,在市场上广受好评,那么腾讯云服务器如...

    勤劳的小蜜蜂
  • Spring Cloud Stream 重点与总结

    原本想开个Spring Cloud Stream系列文章连载,写Spring Cloud Stream算是个人夙愿了——首先这是个人非常喜欢的组件,它屏蔽了各种...

    用户1516716
  • Spring Cloud Stream 重点与总结

    原本想开个Spring Cloud Stream系列文章连载,写Spring Cloud Stream算是个人夙愿了——首先这是个人非常喜欢的组件,它屏蔽了各种...

    乱敲代码
  • 8.Smack类库

    六月的雨
  • 高活跃度全能型架构师——做开源、写书写博客、玩社区

    码云Gitee
  • 选择使用Spring框架的原因(Spring框架为企业级开发带来的好处有哪些)?

    唐怀瑟

扫码关注云+社区

领取腾讯云代金券