<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)
(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卡分區的名稱
現在可以通過dd指令将boot.img提取出來
dd if=/dev/block/mmcblk0p20 of=/sdcard/boot.img
(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
可以通過同樣的方式,使用dd指令,将boot.img檔案提取出來.
之後我們可以通過adb pull的方式把從真機中提取的boot.img檔案提取到本地.之後用split_boogimg.pl 将提取的boot.img分解出來,可以得到boot.img-kernel
一般來說,這個kernel核心檔案都是一個gzip的壓縮格式,偶爾也會有其他的壓縮算法.比如三星s5核心檔案的壓縮算法是lzop
為什麼是這樣的情況呢?簡要說下:
kernel被載入記憶體後是以壓縮的狀态存放在磁盤之上的,他頭上的一段代碼就是為了初始化并且解壓縮的一段代碼.這段代碼把自身壓縮的一部分代碼解壓出來.放到真正核心所在的位置上.是以他所用的壓縮算法要從他頭上那段來指定的.是以如果今後廠商使用一些自己的壓縮算法,那麼需要更多逆向分析的.
這樣我們可以通過一個解壓縮的腳本,解壓出真正的核心檔案.一個二進制檔案zimage.
現在可以将它導入到ida中分析,但是導入ida後發現效果很不理想
這是因為我們需要符号表.但是android的linux核心是一個平面結構,它沒有符号表.如果大家編譯過linux核心可以發現編譯好的zimage被打包到boot.img檔案中去,下面有個巨大的vmlinux,它放到gdb裡面去調試可以看到完整的符号表和調試資訊.刷入手機的版本是沒有的.
但是在/proc/kallsyms可以提供所有的kernel symbol
cat /proc/kallsyms 會發現位址都是0
為什麼位址都是0呢?
因為有一個patch 在/proc/sys/kernel/kptr_restrict預設為1,就隐藏了symbol
隻要我們将其置0就可以正常列印
如果我們之前在刷機的過程中放進去一個su授權檔案,那麼我們就可以
但是我們目的是為了root,這裡如果沒有su檔案呢?
我們還有其他的方法.kallsyms既然可以列印symbol,那麼說明symbol肯定在核心之中的.它就在__ksymtab裡面.我們肯定可以知道一些常見的核心函數,比如kallsyms_lookup_name.我們可以在這個核心的二進制檔案中找它的字元串.找到它的相對位置後,然後拿它的位址去搜尋
我們可以搜到一個結構
從0xc0008000開始暴力搜尋連續若幹個具有上面的特征的記憶體,就可以找到核心的導出符号表
有了符号位址後,手動在ida中添加
本文來自“阿裡聚安全”,發表于2015年02月12日 10:21.