1. 程式人生 > >逆向修改手機核心繞過反除錯

逆向修改手機核心繞過反除錯

逆向修改手機核心,繞過反除錯

Android應用反除錯裡最常用的一種反除錯方法是檢視/proc/self/status的資訊,如果TracerPid不為0,就判斷為正在被除錯。如果自己擁有核心原始碼,就可以自己編譯生成zImage去替換核心就能正常運行了,但可惜的是,很多手機的核心都不開源,為此只能自己去逆向修改。


一、  提取zImage核心檔案
在提取zImage前,必須確保自己擁有root許可權。
輸入命令:
ls -l /dev/block/platform/msm_sdcc.1(具體裝置具體定)/by-name,
找到boot這一項,記下路徑

將boot匯出為boot.img
dd if=/dev/block/mmcblk0p19 of=/data/local/boot.img


adb pull /data/local/boot.img boot.img
使用abootimg工具,該工具見附件解開boot.img

將zImage檔案複製為檔名為z.gz的檔案,並使用010editor查詢十六進位制1f 8b 08 00,找到後把前面的資料全刪掉,使kernel.gz檔案變成標準的gzip壓縮檔案,這樣子就可以使用gunzip解壓了。
命令:gunzip z.gz 
生成檔案z就是祼二進位制檔案zImage。
二、  提位、修改關鍵程式碼
zImage檔案可以直接使用IDA去開啟,但需要設定引數。

在上圖,設定處理器型別為ARM Little-endian,點【ok】後,彈下圖

在ROM start address和Loading address填0xc0008000,點【ok】,IDA顯示效果如下圖所示,沒有函式名,不方便定位程式碼。


先回到root下的adb shell,輸入命令:
echo 0 > /proc/sys/kernel/kptr_restrict
關閉符號遮蔽
再輸入以下命令檢視這兩函式的地址

回到IDA,按g跳轉到c01b083c(__task_pid_nr_ns)地址處,在游標放在在該函式處:

然後按x,彈出引用搜索框

在搜尋框裡,找到sub_c02b9ff8(proc_pid_status)地址對應的函式,雙擊它,如果IDA沒有分析出該函式,就進行以下操作:
按shift+f12,搜尋TracerPid,找到以下項

雙擊它,看到

再雙擊【DATA XREF: sub_c02b9ff8+190】,IDA就能分析出sub_c02b9ff8函數了,然後重新搜尋sub_c01b083c的引用。找到後,雙擊它,得以下圖:


經本人分析得到的修改方法是把MOVEQ R10, R0替換為MOV R10, #0,機器碼為00 A0 A0 E3,指令的檔案偏移為(C02BA568-C0008000=2B2568),及把BL sub_C01B083C替換為MOV R0, #0,機器碼為00 00 A0 E3,指令的檔案偏移為(C01B083C-C0008000=1A883C)。

我測試nesux5手機後,發現原作者這裡有誤,

修改應該是把BL sub_C01B083C替換為MOV R0, #0,機器碼為00 00 A0 E3,指令的檔案偏移為(C01B083C-C0008000=1A883C)。
這句錯了吧 ,你這樣修改變成了修改__task_pid_nr_ns函式的入口。。。
修改地址應該是 
.text:C02BA578 BL __task_pid_nr_ns
檔案偏移是 C02BA578 - C0008000=0x2B2578

三、  刷回手機
刷回前需要先打包boot.img檔案
使用命令壓縮成z.gz:gzip -n -f -9 z
使用010editor將z.gz的二進位制資料覆蓋到原zImage檔案的1F 8B 08 00處的位置(新的z.gz檔案必須比原z.gz檔案小,並且回寫回去時不能改變原zImage檔案的大小及修改原zImage檔案後面的內容,否則會很麻煩),這時得到了zImage檔案。
執行命令abootimg --create boot.img -f bootimg.cfg -k zImage -r initrd.img得到boot.img檔案。
手機重啟進入刷機模式,然後,執行命令fastboot flash boot boot.img。
完成刷機後,重新開機,就大功告成了。
四、  還原磚頭
刷核心,不免會有刷成磚頭的情況。
使用步驟1中提取到的原版boot.img,在刷機模式下,執行fastboot flash boot boot.img就還原系統了。