Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android內核提取

Android內核提取

編輯:關於Android編程

Android設備啟動的時候有兩種模式:第一種是正常啟動,使用boot分區;第二種是啟動恢復過程,使用recovery分區。這兩種分區的結構是相同的,後面會介紹到。兩者的區別顧名思義,這裡不多說了。這兩個分區的鏡像文件分別對應boot.img和recovery.img,我們可以從很多渠道去獲取到,其中包含了系統非常重要的東西。

boot.img鏡像文件中包含了內核鏡像文件(通常命名為zImage)和內存盤(initrd)鏡像文件(通常命名為ramdisk.img或initrd.img),其結構的定義可以參看AOSP的system/core/mkbootimg/bootimg.h:

1. zImage包含引導程序(bootloader)、解壓程序,以及壓縮後的內核代碼和數據,Android的內核是基於Linux內核的,經過了大量的修改和改進,很多搞Android攻防的人肯定會需要獲得設備的內核鏡像文件,其中保存著編譯時的各種配置信息,包括全局函數和數據符號;另外有了鏡像文件,就可以使用類似IDA的工具去分析內核代碼找漏洞;鏡像文件還可以用來驗證已知漏洞是否存在等等,總之好處多多。

2. ramdisk.img主要包含/,/system,/data這三個系統分區,這三個目錄包含了系統幾乎所有重要的東西,特別是根目錄/下的init.rc文件,通過修改這個文件可以改變系統的很多屬性,甚至可以永久獲得root權限。

刷機的基本原理就是獲取boot.img,修改其中的zImage或者ramdisk.img文件的內容,比如init.rc,然後再重新打包成新的boot.img,最後用燒寫工具將其燒到設備中就可以了。當然很多設備都有鎖,這個就另說了。

今天主要來介紹一下Android內核提取,提取過程很簡單,本來想自己寫一下,後來看到看雪上有一篇很不錯的文章,直接分享過來吧大笑,手懶的人就是這樣。。

其中補充兩點:

1. 將boot.img文件分解的工具還有一個比較好用的是基於mkbootimg的abootimg,這個工具不僅可以從boot.img中分離出內核鏡像,還可以根據創建boot.img文件。github地址:https://github.com/majonez/abootimg

2. 下面文章中查看zImage文件的結構應該是使用的binwalk工具,這是一個固件分析工具,用於對固件的分析、提取和逆向等,簡單易用。

原文鏈接:http://bbs.pediy.com/showthread.php?t=194803

 

技術背景:
Android手機獲得Root權限,可以讓/system和/data分區獲得讀寫的權限.這兩個分區的權限配置,一般在根分區的init.rc文件中,修改這個文件可永久獲得root權限.
眾所周知,市面上絕大部分的Android手機文件系統有三個分區,分別是/,/system,/data.根分區(/)是打包為ramdisk.img後,再與kernel的zImage打包為boot.img.boot.img在EMMC/NAND中以RAWDATA的形式存在,且除使用燒寫工具外,無法讀寫.正因如此,根分區(/)在每次開機時都會從存儲器中加載到RAM,所以根分區(/)是難以不被刷機破解的.

那麼如何破解?
獲得boot.img,解壓boot.img得到ramdisk.img,再由ramdisk.img解壓得到root目錄(/),修改其中的init.rc文件,再打包,最終得到新的boot.img.最後利用燒寫工具將boot.img燒寫到手機即可.(具體可參考AOSP/mkbootimg)

淺析boot分區結構
名稱:  1.png查看次數: 1文件大小:  33.9 KB
點擊圖片以查看大圖圖片名稱:	2.png查看次數:	9文件大小:	37.7 KB文件 ID :	95884
具體分析:
一.提取kernel文件
(1)boot在哪裡?通過下載官方的rom包,解壓縮後可以看到裡面的boot.img文件然後分解
關於rom包,簡單介紹下裡面的文件:
boot.imgLinux內核和基本文件系統的內核包
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在哪裡?真機中提取(這裡以SamsungGalaxyS4為例)
adbshell進入真機,ls-l/dev/block/platform/msm_sdcc.1/by-name
msm代表高通的芯片
這個msm_sdcc.1是外接的SD卡掛載的目錄,by-name指的是這個sd卡分區的名稱
點擊圖片以查看大圖圖片名稱:	3.png查看次數:	10文件大小:	131.1 KB文件 ID :	95885
現在可以通過dd命令將boot.img提取出來
ddif=/dev/block/mmcblk0p20of=/sdcard/boot.img
名稱:  4.png查看次數: 1文件大小:  105.1 KB
名稱:  5.png查看次數: 1文件大小:  6.7 KB
點擊圖片以查看大圖圖片名稱:	6.png查看次數:	6文件大小:	20.3 KB文件 ID :	95888

(2.2)boot在哪裡?真機中提取(這裡以LenovoA300t為例)另一種查找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
點擊圖片以查看大圖圖片名稱:	7.png查看次數:	10文件大小:	26.0 KB文件 ID :	95889
可以通過同樣的方式,使用dd命令,將boot.img文件提取出來.

之後我們可以通過adbpull的方式把從真機中提取的boot.img文件提取到本地.之後用split_boogimg.pl將提取的boot.img分解出來,可以得到boot.img-kernel

點擊圖片以查看大圖圖片名稱:	8.png查看次數:	7文件大小:	10.1 KB文件 ID :	95890
二.逆向分析kernel文件:
一般來說,這個kernel內核文件都是一個gzip的壓縮格式,偶爾也會有其他的壓縮算法.比如三星S5內核文件的壓縮算法是lzop
點擊圖片以查看大圖圖片名稱:	9.png查看次數:	7文件大小:	54.9 KB文件 ID :	95891
為什麼是這樣的情況呢?簡要說下:
Kernel被載入內存後是以壓縮的狀態存放在磁盤之上的,他頭上的一段代碼就是為了初始化並且解壓縮的一段代碼.這段代碼把自身壓縮的一部分代碼解壓出來.放到真正內核所在的位置上.所以他所用的壓縮算法要從他頭上那段來指定的.所以如果今後廠商使用一些自己的壓縮算法,那麼需要更多逆向分析的.

這樣我們可以通過一個解壓縮的腳本,解壓出真正的內核文件.一個二進制文件zImage.

#!/bin/bash
pos=`grep-P-a-b-m1--only-matching'\x1F\x8B\x08'zImage|cut-f1-d:`
echo"Extractinggzip'dkernelimagefromfile:zImage(start=$pos)"

if[!-z$pos];then
echo"Dumpingcompressedimage"
ddif=zImageof=zImage_unpacked.gzbs=1skip=$pos2>/dev/null>/dev/null
echo"Unzippingcompressedimage"
gunzip-qfzImage_unpacked.gz
fi
名稱:  10.png查看次數: 1文件大小:  5.1 KB

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

這是因為我們需要符號表.但是android的linux內核是一個平面結構,它沒有符號表.如果大家編譯過linux內核可以發現編譯好的zImage被打包到boot.img文件中去,下面有個巨大的vmlinux,它放到gdb裡面去調試可以看到完整的符號表和調試信息.刷入手機的版本是沒有的.
但是在/proc/kallsyms可以提供所有的kernelsymbol

cat/proc/kallsyms會發現地址都是0
名稱:  11.jpg查看次數: 1文件大小:  99.6 KB
為什麼地址都是0呢?

因為有一個patch在/proc/sys/kernel/kptr_restrict默認為1,就隱藏了symbol
只要我們將其置0就可以正常打印
點擊圖片以查看大圖圖片名稱:	12.jpg查看次數:	6文件大小:	44.9 KB文件 ID :	95894
如果我們之前在刷機的過程中放進去一個su授權文件,那麼我們就可以
echo0>/proc/sys/kernel/kptr_restrict
cat/proc/kallsyms>/data/local/tmp/syms.txt
名稱:  13.png查看次數: 1文件大小:  43.2 KB
但是我們目的是為了root,這裡如果沒有su文件呢?

我們還有其他的方法.kallsyms既然可以打印symbol,那麼說明symbol肯定在內核之中的.它就在__ksymtab裡面.我們肯定可以知道一些常見的內核函數,比如kallsyms_lookup_name.我們可以在這個內核的二進制文件中找它的字符串.找到它的相對位置後,然後拿它的地址去搜索
點擊圖片以查看大圖圖片名稱:	14.png查看次數:	7文件大小:	126.5 KB文件 ID :	95896
我們可以搜到一個結構
名稱:  15.png查看次數: 1文件大小:  15.9 KB
從0xC0008000開始暴力搜索連續若干個具有上面的特征的內存,就可以找到內核的導出符號表

有了符號地址後,手動在ida中添加
名稱:  16.jpg查看次數: 1文件大小:  57.0 KB

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved