一些必备工具:
1、一台root的android手机
2、下载"rom制作工具"超级好用
3、导出bootimg的工具,我用了“搞机助手",可以一键导出boot.img
4、linux下查看boot.img压缩方式的工具。
5、010 editor
步骤:
首先用搞机助手导出boot.img。
导出后在桌面可以找到boot.img。
提取到boot.img后,进行下一步
将boot.img用复制到bootimg.exe的同一文件夹下
输入命令:.\bootimg.exe --unpack-bootimg
生成如下:
提取这个kernel文件
用linux(我用windows安装了子系统的方式)安装binwalk
git clone https://github.com/devttys0/binwalk
cd binwalk
python setup.py install
安装好后,因为我的linux是windows子系统,所以找了一下安装路径在,binwalk在:
C:\Users\Administrator\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\su\binwalk
下面。把kernel文件复制到该文件下面,执行 binwalk kernel
输入:binwalk -e kernel --run-as=root,开始解压缩
生成文件
下面开始对文件内容进行修改
将541C文件导入010 editor ,CTRL+F 查找Text:TracerPid:
我的红米A8 安装的是android10系统,发现与网上的大部分教程都不一致:
网上大部分的系统里面都是这种:
"TracerPid:\t%d\n"
翻看了红米A8的源代码,发现是这种形式的:
tracerpid 没有%d这个借记符号
seq_put_decimal_ull(m, "\nTracerPid:\t", tpid);
所以我这个需要另辟蹊径了。
用IDA打开文件
设置处理器类型为ARM Little-endian,点ok后,弹下图
在ROM start address和Loading address填0xc0008000,点ok,没有函数名,不方便定位代码。
在ida中搜索(我已经导入了android的内核的函数文件所以可以识别出函数),在红米源代码中定位到调用函数在proc_pid_status函数中,所以直接找该函数去修改
我们只需要 把 BL _task_pid_nr_ns 替换为MOV R0, #0,机器码为00 00 A0 E3,指令的文件偏移为(C03559F0-C0008000 = 34d9f0)。
打开010editor,找到该位置
修改为
修改好后,将541c文件在ubuntu下用命令重新压缩gzip格式
gzip -n -f -9 541C
发现用这个命令压缩的基本一致,红米这个内核压缩包有crc32校验,必须把压缩号的文件覆盖到原来的541C.gz里面去,
在原压缩包里搜索gz的尾部特征码: F7 DF 2F 9A B1 CC C8 90 95 01
把新的压缩包的所有内容覆盖到原压缩包到特征码的位置位置。
这个就与原压缩包一模一样了。
然后重新写入到kernel文件里面去,用python脚本:
with open(r"./541c.gz","rb") as f:
content = f.read()
with open(r"./kernel","rb") as f:
f.seek(0xA7D110)#地址查看前面截图,把压缩包后面剩余的原样添加进去的意思
content += f.read()
with open(r"./kernel_new","wb") as f:
f.write(content)