得到一个Android的CrackMe来考察逆向知识,分析后发现其关键函数位于native so库中,并且在函数开始时启动了线程进行TracerPid检测的反调试,当发现程序被调试时会直接杀死应用。虽然题目最后卡在了native 逆向与反调试绕过这里,下去后我学习了下如何绕过这个反调试。主要是两种:(1)patch so,直接修改关键值来绕过;(2)修改系统内核文件来将TracerPid写死为0。刚好我手头有一个之前做实验已root的红米 note 4,便决定采用修改系统内核的方式,一劳永逸。
有点目录不同,需要根据手机机型去确定目录ls -l /dev/block/platform/soc/xxxx.ufshc/by-name | grep boot su ls -l /dev/block/platform/soc/xxxx.ufshc/by-name | grep boot lrwxrwxrwx 1 root root 21 1970-01-01 08:01 boot -> /dev/block/mmcblk0p34 dd if=/dev/block/mmcblk0p34 of=/sdcard/boot.img adb pull /sdcard/boot.img boot.img
su ls -l /dev/block/platform/soc/xxxx.ufshc/by-name | grep boot lrwxrwxrwx 1 root root 21 1970-01-01 08:01 boot -> /dev/block/mmcblk0p34 dd if=/dev/block/mmcblk0p34 of=/sdcard/boot.img adb pull /sdcard/boot.img boot.img
取出来的 boot.img 是一个打包文件,包含了ramdisk,kernel 等很多东西,首先需要将其解开。这里我使用的是一个 github 上的工具 Android_boot_image_editor
https://github.com/cfig/Android_boot_image_editor git clone https://github.com/cfig/Android_boot_image_editor.git
git clone https://github.com/cfig/Android_boot_image_editor.git
2.2 解包 boot.img 把提取出来的 boot.img 拷贝到 ./Android_boot_image_editor 目录下: ./gradlew unpack解压 boot.img 解包后的文件在 build/unzip_boot 下: cd build/unzip_boot
binwalk 看一下 kernel 是怎么组织的:
可以看到,对于我的 kernel,gzip文件+设备文件。所以我们需要做的是提取出头部的 gzip,解压修改后拼接回去 提取 gzip(0x7xxxx根据实际情况修改,注意一下是python脚本,需要新建个py文件写入运行): with open("./kernel","rb") as f: content=f.read(0x7xxxx) with open("./kernel_core.gz","wb") as f: f.write(content)
with open("./kernel","rb") as f: content=f.read(0x7xxxx) with open("./kernel_core.gz","wb") as f: f.write(content)
因我的 010 Editor 在 win 下,把提取出来的 kernel_core.gz 拷贝到 win 下,并对解压后的 kernel_core 使用 010 Editor 进行修改: ctrl +f 查询 TracerPid 25 64 --> 30 09 (0\t) 注意:010 Editor 默认为覆盖模式,不需要删除 25 64 再进行输入 30 09,直接把光标定位到 25 前输入 30 09 即可。我就在这踩了坑,导致一直不成功…… 将修改好的 kernel_core 重命名为 kernel,拷贝回 kail 进行压缩: gzip -n -f -9 kernel 移动到Android_boot_image_editor-master/build/unzip_boot 目录下 原 kernel 进行拼接(0x7xxxxx记得替换成之前的查看到的): with open("./kernel.gz","rb") as f: content = f.read() with open("./kernel","rb") as f: f.seek(0x7xxxxx) content += f.read() with open("./kernel_new","wb") as f: f.write(content) 删除原 kernel 及多余文件,重命名 kernel_new 为 kernel 留下以下这些文件就可以了
with open("./kernel.gz","rb") as f: content = f.read() with open("./kernel","rb") as f: f.seek(0x7xxxxx) content += f.read() with open("./kernel_new","wb") as f: f.write(content)
cd root vi default.prop ro.secure=1 改成 ro.secure=0 ro.debuggable=0 改成ro.debuggable=1 如果系统版本是开发版的华ro.secure本来就是0
cd root vi default.prop
ro.secure=1 改成 ro.secure=0 ro.debuggable=0 改成ro.debuggable=1
./gradlew pack boot.img.signed 即为重打包后的文件:
https://dl.twrp.me/angler/(根据手机型号下载对应的版本,不知道就百度) 将得到的 boot.img.signed 修改为 boot-new.img 放入手机的随意一个文件夹 进入 twrp rec: 安装→刷入镜像,选择处理后的镜像刷如即可 adb reboot bootloader fastboot boot twrp-3.5.2_9-0-angler.img #如果twrp-3.5.2_9-0-angler.img 不在一个目录下需要带上盘符和目录 选择对应的boot-new.img安装即可
adb reboot bootloader fastboot boot twrp-3.5.2_9-0-angler.img #如果twrp-3.5.2_9-0-angler.img 不在一个目录下需要带上盘符和目录
今天的分享就到这里了,有时间给大家出后续,写的不好各位大佬喷轻点,麻烦各位大佬点点赞,谢谢大佬!
各位大佬给点点赞
哥哥,换个屏保吧,都裂开了
DeepMemory 怕刷成砖,用的n年前的红米note 4
能不能搞点有档次的机型?
jobs 穷哭了
大佬大佬 收藏了
优秀 🤣