淺談android反調試之輪詢TracePid(解決方案是特色)


參考文章:
1.   http://bbs.pediy.com/thread-207538.htm


需求:

常見的Android 反調試方案其實並不多, 就那么幾種, 其中一種方案通過輪訓TracePid,  具體實現如下:
 
對於這種非反調試,我們通常的做法是這個找到這個輪訓線程,通過修改代碼,不讓這個運行,或者還有其他做法。 但是這些做法都需要我們去分析代碼, 修改代碼。 時間是寶貴的, 如何節省這些時間,讓我們把更多的經歷投放到程序的邏輯分析。 
試想一下,加入我們手機本身具有對這個反調試的抗體的話,我們就可以節省時間啦。

反反調試原理&&實現

如何讓我們的手機具備這樣反調試的抗體呢,試想一下tracepid 調試的狀態下,tracePid 仍然為0, 不就OK了!!!
我們需要修改手機內核內部的邏輯, 如果自己擁有內核源碼,就可以自己編譯生成zImage去替換內核就能正常運行了,但可惜的是,很多手機的內核都不開源,只有Google手機的內核,為此只能自己去逆向修改。
難點: 
1. 如何從手機中提取內核代碼
2.找到關於tracePid的邏輯
3.修改后,把修改的內核置換到手機


提取內核代碼

  1. 首先你得有一部root過的Android手機,   筆者用的公司里的測試機Lenvorn KT-30  先去找到系統boot的文件位置,這個路徑一定要和具體設備相關。 boot的文件位置 /dev/block/platform/[每個設備目錄不一樣]/by-name ;其中platform目錄中的子目錄因為每個設備都不一樣,所以需要注意,查看自己設備目錄名稱,
 2. 然后進入到by-name之后,使用  ls -l  命令查看詳情,找到一項BOOT,記住link的路徑地址,這里是/dev/block/mmcblk0p22 這里可能有人會遇到一個問題就是,看到多個BOOT,比如BOOT1,BOOT2,這里可以選擇BOOT即可,也有的人會發現沒這個選項,那么只能在刷個其他系統進行操作了
 3. 然后使用命令 將boot文件導出為boot.img

修改TracePid設置邏輯的代碼

  1. 我們已經從root過的手機提取出手機內核, 我們不能直接對boot.img 文件進行逆向分析, 因為這個文件是一個img文件,文件結構如下:

 2.我們使用bootimag工具解壓boot.img文件。 其實這些工具原理很簡單,就是解析boot.img文件格式罷了,因為boot和recovery映像並不是一個完整的文件系統,它們是一種android自定義的文件格式,該格式包括了2K的文件頭,后面緊跟着是用gzip壓縮過的內核,再后面是一個ramdisk內存盤,然后緊跟着第二階段的載入器程序(這個載入器程序是可選的,在某些映像中或許沒有這部分):
 解壓文件結果如下:
解壓之后有一個kernel文件,這個就是內核文件,而ramdisk.gz就是釋放到設備目錄內容,也就是initrd目錄,進入查看內容:

看到了吧,這就是最終設備的目錄結構,可以看到這里有init.rc啟動文件,default.prop配置文件等
 
3. 接下來我們就要對kernel內核文件進行特別處理了:將kernel文件復制為文件名為zImage.gz的文件,並使用010Editor工具,Ctrl+F快捷鍵查找十六進制內容1F 8B 08 00,找到后把前面的數據全刪掉,使zImage.gz文件變成標准的gzip壓縮文件,這樣子就可以使用gunzip解壓了。命令:gunzip zImage.gz;這時候獲取到了解壓之后的zImage才是我們要處理的最終文件。


4. IDA打開zImage內核文件進行修改, 有了上面一步得到的內核文件zImage,直接使用IDA打開,但是打開的時候需要注意設置選項:

然后設置開始地址為0xC0008000:這里為什么要設置成這個起始地址,因為Linux啟動內核的地址為0xC0008000

5. 打開之后,我們可以直接shift+F12,查看字符串內容,因為我們想改TracerPid值,所以直接搜字符串”TracerPid”值 雙擊進入,這時候我們可以記下這個地址,然后減去剛剛我們那個偏移地址0xC0008000:

查看字符串引用代碼,
 找到這個參數的指令: mov R7, R0 :   經本人分析得到的修改方法是把MOV R7, R0替換為MOV R7, #0,機器碼為00 A0 A0 E3,指令的文件偏移為(C022EBE8 - C0008000)
至少,內核文件修改成功
   
 

刷回手機

刷回前需要先打包boot.img文件
1.使用命令壓縮成z.gz:gzip -n -f -9 zImage
2.使用010editor將z.gz的二進制數據覆蓋到原zImage文件的1F 8B 08 00處的位置(新的z.gz文件必須比原z.gz文件小,並且回寫回去時不能改變原zImage文件的大小及修改原zImage文件后面的內容,否則會很麻煩),這時得到了zImage文件。

3.刷機boot.img文件.這里有一個坑,在刷機的時候用到的是fastboot命令,但是遇到最多的問題就是這個錯誤:

這個是因為設備還沒有啟動fastboot,關於每個設備啟動fastboot不一樣操作,比如小米是電源鍵+音量減,三星是音量減+HOME鍵+電源鍵;具體設備可以自行網上搜索即可。到了fastboot界面再次運行fastboot就可以了: fastboot flash boot boot-new.img

然后在運行fastboot reboot重啟設備即可。有的同學在操作的時候,始終進入fastboot失敗,導致fastboot命令運行錯誤,這個真解決不了那就換個手機試一下吧。這時候我們啟動設備,然后調試一個app,發現他的TracerPid值永遠都是0了,因為我之前將TracerPid改成’00’字符串了,也是可以的:

因為感覺不正規,所以就有重新改成了’0\t’值了。都是可以的。

注意:一定要保存原始提取的內核文件boot.img,當你把設備弄成磚頭啟動失敗的時候,可以在把這個原始的boot.img刷回去就可!









 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM