一些必備工具:
1、一臺root的android手機(jī)
2、下載"rom制作工具"超級好用
3、導(dǎo)出bootimg的工具,我用了“搞機(jī)助手",可以一鍵導(dǎo)出boot.img
4、linux下查看boot.img壓縮方式的工具。
5、010 editor
步驟:
首先用搞機(jī)助手導(dǎo)出boot.img。



導(dǎo)出后在桌面可以找到boot.img。
提取到boot.img后,進(jìn)行下一步
將boot.img用復(fù)制到bootimg.exe的同一文件夾下

輸入命令:.\bootimg.exe --unpack-bootimg
生成如下:

提取這個kernel文件
用linux(我用windows安裝了子系統(tǒng)的方式)安裝binwalk
git clone https://github.com/devttys0/binwalk
cd binwalk
python setup.py install
安裝好后,因為我的linux是windows子系統(tǒng),所以找了一下安裝路徑在,binwalk在:
C:\Users\Administrator\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\su\binwalk
下面。把kernel文件復(fù)制到該文件下面,執(zhí)行 binwalk kernel

輸入:binwalk -e kernel --run-as=root,開始解壓縮

生成文件
下面開始對文件內(nèi)容進(jìn)行修改
將541C文件導(dǎo)入010 editor ,CTRL+F 查找Text:TracerPid:

我的紅米A8 安裝的是android10系統(tǒng),發(fā)現(xiàn)與網(wǎng)上的大部分教程都不一致:

網(wǎng)上大部分的系統(tǒng)里面都是這種:
"TracerPid:\t%d\n"
翻看了紅米A8的源代碼,發(fā)現(xiàn)是這種形式的:
tracerpid 沒有%d這個借記符號
seq_put_decimal_ull(m, "\nTracerPid:\t", tpid);
所以我這個需要另辟蹊徑了。
用IDA打開文件

設(shè)置處理器類型為ARM Little-endian,點ok后,彈下圖

在ROM start address和Loading address填0xc0008000,點ok,沒有函數(shù)名,不方便定位代碼。
在ida中搜索(我已經(jīng)導(dǎo)入了android的內(nèi)核的函數(shù)文件所以可以識別出函數(shù)),在紅米源代碼中定位到調(diào)用函數(shù)在proc_pid_status函數(shù)中,所以直接找該函數(shù)去修改

我們只需要 把 BL _task_pid_nr_ns 替換為MOV R0, #0,機(jī)器碼為00 00 A0 E3,指令的文件偏移為(C03559F0-C0008000 = 34d9f0)。
打開010editor,找到該位置

修改為

修改好后,將541c文件在ubuntu下用命令重新壓縮gzip格式
gzip -n -f -9 541C
發(fā)現(xiàn)用這個命令壓縮的基本一致,紅米這個內(nèi)核壓縮包有crc32校驗,必須把壓縮號的文件覆蓋到原來的541C.gz里面去,

在原壓縮包里搜索gz的尾部特征碼: F7 DF 2F 9A B1 CC C8 90 95 01

把新的壓縮包的所有內(nèi)容覆蓋到原壓縮包到特征碼的位置位置。
這個就與原壓縮包一模一樣了。
然后重新寫入到kernel文件里面去,用python腳本:
with open(r"./541c.gz","rb") as f:
content = f.read()
with open(r"./kernel","rb") as f:
f.seek(0xA7D110)#地址查看前面截圖,把壓縮包后面剩余的原樣添加進(jìn)去的意思
content += f.read()
with open(r"./kernel_new","wb") as f:
f.write(content)