一些必備工具:
1而线、一臺(tái)root的android手機(jī)
2铭污、下載"rom制作工具"超級(jí)好用
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
生成如下:
提取這個(gè)kernel文件
用linux(我用windows安裝了子系統(tǒng)的方式)安裝binwalk
git clone https://github.com/devttys0/binwalk
cd binwalk
python setup.py install
安裝好后知市,因?yàn)槲业膌inux是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,開(kāi)始解壓縮
生成文件
下面開(kāi)始對(duì)文件內(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 沒(méi)有%d這個(gè)借記符號(hào)
seq_put_decimal_ull(m, "\nTracerPid:\t", tpid);
所以我這個(gè)需要另辟蹊徑了隅肥。
用IDA打開(kāi)文件
設(shè)置處理器類型為ARM Little-endian竿奏,點(diǎn)ok后,彈下圖
在ROM start address和Loading address填0xc0008000腥放,點(diǎn)ok泛啸,沒(méi)有函數(shù)名,不方便定位代碼秃症。
在ida中搜索(我已經(jīng)導(dǎo)入了android的內(nèi)核的函數(shù)文件所以可以識(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)。
打開(kāi)010editor聚请,找到該位置
修改為
修改好后荠雕,將541c文件在ubuntu下用命令重新壓縮gzip格式
gzip -n -f -9 541C
發(fā)現(xiàn)用這個(gè)命令壓縮的基本一致,紅米這個(gè)內(nèi)核壓縮包有crc32校驗(yàn)驶赏,必須把壓縮號(hào)的文件覆蓋到原來(lái)的541C.gz里面去炸卑,
在原壓縮包里搜索gz的尾部特征碼: F7 DF 2F 9A B1 CC C8 90 95 01
把新的壓縮包的所有內(nèi)容覆蓋到原壓縮包到特征碼的位置位置。
這個(gè)就與原壓縮包一模一樣了煤傍。
然后重新寫(xiě)入到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)