作者子炎
背景:
得到一個(gè)Android的CrackMe來考察逆向知識(shí),分析后發(fā)現(xiàn)其關(guān)鍵函數(shù)位于native so庫(kù)中,并且在函數(shù)開始時(shí)啟動(dòng)了線程進(jìn)行TracerPid檢測(cè)的反調(diào)試,當(dāng)發(fā)現(xiàn)程序被調(diào)試時(shí)會(huì)直接殺死應(yīng)用。雖然題目最后卡在了native 逆向與反調(diào)試?yán)@過這里,下去后我學(xué)習(xí)了下如何繞過這個(gè)反調(diào)試。主要是兩種:(1)patch so,直接修改關(guān)鍵值來繞過;(2)修改系統(tǒng)內(nèi)核文件來將TracerPid寫死為0。剛好我手頭有一個(gè)之前做實(shí)驗(yàn)已root的紅米 note 4,便決定采用修改系統(tǒng)內(nèi)核的方式,一勞永逸。
1.提取boot.img
有點(diǎn)目錄不同,需要根據(jù)手機(jī)機(jī)型去確定目錄ls -l /dev/block/platform/soc/xxxx.ufshc/by-name | grep boot
su
ls -l /dev/block/platform/soc/xxxx.ufshc/by-name | grep boot
lrwxrwxrwx 1 root root 21 1970-01-01 08:01 boot -> /dev/block/mmcblk0p34
dd if=/dev/block/mmcblk0p34 of=/sdcard/boot.img
adb pull /sdcard/boot.img boot.img

2. 修改內(nèi)核文件
取出來的 boot.img 是一個(gè)打包文件,包含了ramdisk,kernel 等很多東西,首先需要將其解開。這里我使用的是一個(gè) github 上的工具 Android_boot_image_editor
2.1 kali 獲取工具
[https://github.com/cfig/Android_boot_image_editor][0]
git clone https://github.com/cfig/Android_boot_image_editor.git
2.2 解包 boot.img
把提取出來的 boot.img 拷貝到 ./Android_boot_image_editor 目錄下:

./gradlew unpack解壓 boot.img

解包后的文件在 build/unzip_boot 下:
cd build/unzip_boot

2.3 修改 kernel 文件
binwalk 看一下 kernel 是怎么組織的:

可以看到,對(duì)于我的 kernel,gzip文件+設(shè)備文件。所以我們需要做的是提取出頭部的 gzip,解壓修改后拼接回去
提取 gzip(0x7xxxx根據(jù)實(shí)際情況修改,注意一下是python腳本,需要新建個(gè)py文件寫入運(yùn)行):
with open("./kernel","rb") as f:
content=f.read(0x7xxxx)
with open("./kernel_core.gz","wb") as f:
f.write(content)

因我的 010 Editor 在 win 下,把提取出來的 kernel_core.gz 拷貝到 win 下,并對(duì)解壓后的 kernel_core 使用 010 Editor 進(jìn)行修改:
ctrl +f 查詢 TracerPid
25 64 --> 30 09 (0\t)
注意:010 Editor 默認(rèn)為覆蓋模式,不需要?jiǎng)h除 25 64 再進(jìn)行輸入 30 09,直接把光標(biāo)定位到 25 前輸入 30 09 即可。我就在這踩了坑,導(dǎo)致一直不成功……


將修改好的 kernel_core 重命名為 kernel,拷貝回 kail 進(jìn)行壓縮:
gzip -n -f -9 kernel

移動(dòng)到Android_boot_image_editor-master/build/unzip_boot 目錄下

原 kernel 進(jìn)行拼接(0x7xxxxx記得替換成之前的查看到的):
with open("./kernel.gz","rb") as f:content = f.read()with open("./kernel","rb") as f:f.seek(0x7xxxxx)content += f.read()with open("./kernel_new","wb") as f:f.write(content)

刪除原 kernel 及多余文件,重命名 kernel_new 為 kernel

留下以下這些文件就可以了

2.4 修改 root 下的 default.prop 文件
cd root
vi default.prop`
`ro.secure=1 改成 ro.secure=0
ro.debuggable=0 改成ro.debuggable=1

如果系統(tǒng)版本是開發(fā)版的華ro.secure本來就是0
2.5 重打包
./gradlew pack

boot.img.signed 即為重打包后的文件:

3. twrp 刷入鏡像
https://dl.twrp.me/angler/(根據(jù)手機(jī)型號(hào)下載對(duì)應(yīng)的版本,不知道就百度)
將得到的 boot.img.signed 修改為 boot-new.img 放入手機(jī)的隨意一個(gè)文件夾
進(jìn)入 twrp rec: 安裝→刷入鏡像,選擇處理后的鏡像刷如即可
adb reboot bootloader
fastboot boot twrp-3.5.2_9-0-angler.img #如果twrp-3.5.2_9-0-angler.img 不在一個(gè)目錄下需要帶上盤符和目錄`

選擇對(duì)應(yīng)的boot-new.img安裝即可
今天的分享就到這里了,有時(shí)間給大家出后續(xù),寫的不好各位大佬噴輕點(diǎn),麻煩各位大佬點(diǎn)點(diǎn)贊,謝謝大佬!