天天看點

root技術背後android手機核心提取及逆向分析

<a href="http://jaq.alibaba.com/community/art/show?articleid=49">root技術背後android手機核心提取及逆向分析</a>

安卓root技術背景:

       獲得boot.img,解壓boot.img得到ramdisk.img, 再由ramdisk.img解壓得到root目錄(/),修改其中的init.rc檔案,再打包,最終得到新的boot.img.最後利用燒寫工具将boot.img燒寫到手機即可.(具體可參考aosp/mkbootimg)

root技術背後android手機核心提取及逆向分析
root技術背後android手機核心提取及逆向分析

(1)boot在哪裡?通過下載下傳官方的rom包,解壓縮後可以看到裡面的boot.img檔案然後分解

關于rom包,簡單介紹下裡面的檔案:

boot.img linux核心和基本檔案系統的核心包

system.img 系統的/system目錄

recovery.img 系統恢複程式所用的鏡像

userdata.img 系統的/data目錄

/data/app 使用者應用程式

/system/app 系統應用

/system/fonts 字型

/system/media 開關機動畫

/system/media/audio 其他音頻,鬧鈴,提示音等

meta-inf 刷機腳本資訊和簽名

/system/etc 系統配置檔案夾,恢複出廠設定後都從這裡和build.prop調用配置來覆寫出錯的配置,裡面init.d檔案夾可以放入腳本,腳本名字前加數字表示優先級

build.prop 手機資訊

(2.1)boot在哪裡?真機中提取(這裡以samsung galaxy s4 為例)

adb shell 進入真機, ls -l /dev/block/platform/msm_sdcc.1/by-name

msm 代表高通的晶片

這個msm_sdcc.1是外接的sd卡挂載的目錄,by-name指的是這個sd卡分區的名稱

root技術背後android手機核心提取及逆向分析

現在可以通過dd指令将boot.img提取出來

dd if=/dev/block/mmcblk0p20 of=/sdcard/boot.img

root技術背後android手機核心提取及逆向分析
root技術背後android手機核心提取及逆向分析
root技術背後android手機核心提取及逆向分析

(2.2)boot在哪裡?真機中提取(這裡以lenovo a300t為例) 另一種查找boot.img的方法

首先介紹下手機分區資訊:

主要有mtd分區和emmc分區

一般刷機包簽名檔案夾裡的刷機腳本那裡有updater-script檔案.

例如:

format("ext4", "emmc", "/dev/block/platform/xxxx", "0", "/system")是emmc分區的,

format("yaffs2", "mtd","/dev/block/platform/xxxx", "0", "/system")是mtd分區的

mtd是用于通路memory裝置(rom、flash)的linux的子系統.mtd的主要目的是為了使新的memory裝置的驅動更加簡單

emmc 結構由一個嵌入式存儲解決方案組成,帶有mmc (多媒體卡)接口、快閃存儲器裝置及主要制器—— 所有都在一個小型的bga 封裝.接口速度高達每秒52mb,emmc具有快速、可更新的性能

cat /proc/mtd

root技術背後android手機核心提取及逆向分析

可以通過同樣的方式,使用dd指令,将boot.img檔案提取出來.

之後我們可以通過adb pull的方式把從真機中提取的boot.img檔案提取到本地.之後用split_boogimg.pl 将提取的boot.img分解出來,可以得到boot.img-kernel

root技術背後android手機核心提取及逆向分析

       一般來說,這個kernel核心檔案都是一個gzip的壓縮格式,偶爾也會有其他的壓縮算法.比如三星s5核心檔案的壓縮算法是lzop

為什麼是這樣的情況呢?簡要說下:

kernel被載入記憶體後是以壓縮的狀态存放在磁盤之上的,他頭上的一段代碼就是為了初始化并且解壓縮的一段代碼.這段代碼把自身壓縮的一部分代碼解壓出來.放到真正核心所在的位置上.是以他所用的壓縮算法要從他頭上那段來指定的.是以如果今後廠商使用一些自己的壓縮算法,那麼需要更多逆向分析的.

root技術背後android手機核心提取及逆向分析

這樣我們可以通過一個解壓縮的腳本,解壓出真正的核心檔案.一個二進制檔案zimage.

現在可以将它導入到ida中分析,但是導入ida後發現效果很不理想

root技術背後android手機核心提取及逆向分析

       這是因為我們需要符号表.但是android的linux核心是一個平面結構,它沒有符号表.如果大家編譯過linux核心可以發現編譯好的zimage被打包到boot.img檔案中去,下面有個巨大的vmlinux,它放到gdb裡面去調試可以看到完整的符号表和調試資訊.刷入手機的版本是沒有的.

但是在/proc/kallsyms可以提供所有的kernel symbol

cat /proc/kallsyms 會發現位址都是0

root技術背後android手機核心提取及逆向分析

為什麼位址都是0呢?

因為有一個patch 在/proc/sys/kernel/kptr_restrict預設為1,就隐藏了symbol

隻要我們将其置0就可以正常列印

root技術背後android手機核心提取及逆向分析

如果我們之前在刷機的過程中放進去一個su授權檔案,那麼我們就可以

root技術背後android手機核心提取及逆向分析

但是我們目的是為了root,這裡如果沒有su檔案呢?

      我們還有其他的方法.kallsyms既然可以列印symbol,那麼說明symbol肯定在核心之中的.它就在__ksymtab裡面.我們肯定可以知道一些常見的核心函數,比如kallsyms_lookup_name.我們可以在這個核心的二進制檔案中找它的字元串.找到它的相對位置後,然後拿它的位址去搜尋

root技術背後android手機核心提取及逆向分析

我們可以搜到一個結構

root技術背後android手機核心提取及逆向分析

從0xc0008000開始暴力搜尋連續若幹個具有上面的特征的記憶體,就可以找到核心的導出符号表

有了符号位址後,手動在ida中添加

root技術背後android手機核心提取及逆向分析

本文來自“阿裡聚安全”,發表于2015年02月12日 10:21.

繼續閱讀