posts - 189,comments - 115,trackbacks - 0

          android的各種*.img 文件

          關于android的各種disk images

          對android的各種disk images很好奇,一直想知道怎么去know和hack這些images,所以就有了這篇paper。

          1. 用file來查看文件類型
            • chenjian@ubuntu8:/tmp/images$ file *
              kernel-qemu:          data
              local.img:               data
              ramdisk.img:           gzip compressed data, from Unix, last modified: Thu Oct 22 16:30:38 2009
              system.img:           VMS Alpha executable
              userdata.img:         VMS Alpha executable
              opl.img:                 VMS Alpha executable
            • 可見有三種,data, gzip和VMS Alpha executable;
            • 再看從avd目錄取得的image文件
            • chenjian@ubuntu8:/tmp/images/HVGA.avd$ file *
              cache.img:               VMS Alpha executable
              userdata.img:           VMS Alpha executable
              userdata-qemu.img:   data
            • 仍然沒有逃脫以上三種image類型。
            • 用表格表示如下
              文件類型 文件
              data kernel-qemu
              local.img 
              userdata-qemu.img
              gzip ramdisk.img
              VMS Alpha executable system.img 
              userdata.img(images目錄)
              opl.img 
              userdata.img(avd目錄)
              cache.img
          2. ramdisk.img
            • 可以使用這個命令來查看ramdisk.img
            • root@ubuntu8:/tmp/images# gzip -d -S .img ramdisk.img 
              root@ubuntu8:/tmp/images# ls -lrt ramdisk 
              -rw-r--r-- 1 root root 260608 Oct 22 01:34 ramdisk
            • 可見ramdisk.img被解壓成ramdisk,
            • root@ubuntu8:/tmp/images# file ramdisk 
              ramdisk: ASCII cpio archive (SVR4 with no CRC)
            • 可見ramdisk是個cpio文件,需要用cpio來extract
            • root@ubuntu8:/tmp/images# mkdir ramdiskdir                                        創建ramdiskdir來裝ramdisk的內容
              root@ubuntu8:/tmp/images# cd ramdiskdir/                                          cd到該目錄中
              root@ubuntu8:/tmp/images/ramdiskdir# cpio -idmv <../ramdisk                 使用cpio來extractramdisk文件 
              data
              default.prop
              dev
              init
              init.goldfish.rc
              init.rc
              proc
              sbin
              sbin/adbd
              sys
              system
              509 blocks
              root@ubuntu8:/tmp/images/ramdiskdir# ls                                            這就是被打包在ramdisk中的文件
              data  default.prop  dev  init  init.goldfish.rc  init.rc  proc  sbin  sys  system
            • 使用find和file來看這些文件,發現init其實是個ARM arch的可執行文件,這也和emulator中所說的linux是ARM arch相吻合
              root@ubuntu8:/tmp/images/ramdiskdir# find . -type f|file -f -
              ./default.prop:              ASCII text
              ./init.rc:         ASCII English text
              ./init.goldfish.rc:                  ASCII English text
              ./init:      ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped
              ./sbin/adbd:           ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped
            • 查看某些文件的md5

              root@ubuntu8:/tmp/images/ramdir# find . -name "init*"|xargs md5sum
              c3cff931e494bb4872f0ebefe1dad548  ./init.rc
              90dd60a3458cce84901d12b362880339  ./init.goldfish.rc
              7a950533c62fe91300a5b31b12a38084  ./init

            • ls –lrt 這些文件

              root@ubuntu8:/tmp/images/ramdir# find . |grep init|xargs ls -lrt
              -rwxr-x--- 1 root root  11875 Jan  1  1970 ./init.rc
              -rwxr-x--- 1 root root   2138 Jan  1  1970 ./init.goldfish.rc
              -rwxr-x--- 1 root root 127548 Jan  1  1970 ./init

          3. data
            data文件共有這么幾個,kernel-qemu,local.img和userdata-qemu.img。
            什么是data文件?如何使用這些文件?我們面臨著么兩個問題
          4. VMS Alpha executable
            VMS Alpah executable共有這么幾個system.img,userdata.img,opl.img,userdata.img和cache.img。
            什么是VMS Alpha executable?如何使用這些文件?我們面臨這么兩個問題。。。
          5. adb shell(1.5版本)
            使用這個命令據說可以在emulator起來以后進入到android os的shell中,我們來看看、
            • D:\Program Files\OPhoneSDK_1.5.beta\tools>adb shell
              # pwd
              pwd
              /
            • # ls -l
              ls -l
              lrwxrwxrwx root     root              2010-01-31 15:03 preload -> /system/preload
              drwxr-xr-x root     root              2010-01-31 15:03 Linux
              lrwxrwxrwx root     root              2010-01-31 15:03 bin -> /opl/telephony/bin
              lrwxrwxrwx root     root              2010-01-31 15:03 usr -> /opl/telephony/usr
              lrwxrwxrwx root     root              2010-01-31 15:03 lib -> /opl/telephony/lib
              drwxrwxrwt root     root              2010-01-31 15:05 tmp
              drwxrwxrwt root     root              2010-01-31 15:05 sqlite_stmt_journals
              drwxrwx--- system   cache             2009-12-20 10:11 cache
              drwxr-xr-x system   system            2009-10-10 13:11 opl
              drwxrwxrwx system   system            2009-10-24 01:48 local
              d--------- system   system            2010-01-31 15:03 sdcard
              drwxr-xr-x root     root              2010-01-31 15:03 d
              lrwxrwxrwx root     root              2010-01-31 15:03 etc -> /system/etc
              drwxr-xr-x root     root              2009-10-22 16:20 system
              drwxr-xr-x root     root              1970-01-01 08:00 sys
              drwxr-x--- root     root              1970-01-01 08:00 sbin
              dr-xr-xr-x root     root              1970-01-01 08:00 proc
              -rwxr-x--- root     root        11875 1970-01-01 08:00 init.rc
              -rwxr-x--- root     root         2138 1970-01-01 08:00 init.goldfish.rc
              -rwxr-x--- root     root       127548 1970-01-01 08:00 init
               

              -rw-r--r-- root     root          118 1970-01-01 08:00 default.prop
              drwxrwx--x system   system            2009-12-20 10:11 data
              drwx------ root     root              1970-01-01 08:00 root
              drwxr-xr-x root     root              2010-01-31 15:04 dev
            • 果然,可以run一些linux下的基本命令,如ls,pwd等,證明了我們確實是獲得了一個linux shell
            • 另外黃顏色顯示的文件和我們在ramdisk中看到的文件似乎大小一致,暗示它們是同一。
            • run mount to see有那些文件系統被mount了

              # mount
              mount
              rootfs / rootfs ro 0 0
              tmpfs /dev tmpfs rw,mode=755 0 0
              devpts /dev/pts devpts rw,mode=600 0 0
              proc /proc proc rw 0 0
              sysfs /sys sysfs rw 0 0
              tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
              tmpfs /tmp tmpfs rw 0 0
              /dev/block/mtdblock0 /system yaffs2 rw 0 0                                     
              /dev/block/mtdblock4 /opl yaffs2 rw 0 0
              /dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0
              /dev/block/mtdblock3 /local yaffs2 rw,nosuid,nodev 0 0
              /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0

            • 我們看見了system,opl,data,local和cache;恩,這些名字和那個表格里的data/VMS Alpha Executable似乎有些重合
              /system,/opl和/cache是VMS Alpha Executable的system.img,opl.img和cache.img轉換而來
              /local是data的local.img轉換而來
              /data嘛,就不太好判斷,不知道和userdata.img和userdata-qemu.img有什么關系沒?
              但至少我們知道可以查看/system來明白system image包含哪些東西了吧。。。,比如/system/framework就是android的framework啦
              也可以知道可以查看/cache來明白什么是cache image的內涵了吧。。。
              對于local image同理可得。。。
            • 另外,adb shell提供的command有限,比如沒有zcat,cp,uname和busybox等,有沒有辦法能將這些命令加入進去呢?
              到這里下載busybox,http://benno.id.au/blog/2007/11/14/android-busybox ,然后按照提示將busybox push至/data/busybox目錄,install后即可運行所有的busybox applet。比如:

              # /data/busybox/zcat /proc/config.gz|/data/busybox/more
              /data/busybox/zcat /proc/config.gz|/data/busybox/more
              #
              # Automatically generated make config: don't edit
              # Linux kernel version: 2.6.25
              # Mon Nov 10 05:02:15 2008
              所以我們就能知道1.5的Android用的linux kernel是2.6.25版本的。。。

          6. kernel在哪里?
          7. 什么是yaffs2? http://en.wikipedia.org/wiki/YAFFS2 
            ok, 這又是一種新的文件系統,designed specially for NAND chips;YAFFS2是YAFFS的第二版,為了適應新的NAND chips,這些新chip的page size有2048bytes,plus 64bytes的spare areas;老版本的NAND chips的page是512bytes,plus 16bytes spare area。
          8. 這些disk images從何而來?
            從這篇文章編譯Android1.5 里能否得到一些啟示?
            在編譯android1.5后,其實我們能得到3個img文件,似乎可以下斷言,這三個image是在編譯android的過程中得到的。有關生成他們的過程又是另外一個話題,估計得去讀makefile了。

            root@ubuntu8:/ophone/android-1.5# find . -name *.img
            ./out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img
            ./out/target/product/generic/userdata.img
            ./out/target/product/generic/system.img
            ./out/target/product/generic/ramdisk.img
            BTW, out目錄是在編譯過程中產生的目錄,其余目錄則是source目錄

          posted on 2010-08-30 10:43 MEYE 閱讀(5275) 評論(2)  編輯  收藏 所屬分類: Android3D

          FeedBack:
          # re: android的各種*.img 文件
          2011-12-17 15:04 | 路過
          中文里夾雜著英文,亂七八糟的。
          能弄懂這些,說明你英文水平不低了,干嘛還要在文字里賣弄....

          怎么去know和hack這些images,所以就有了這篇paper

          ——雞皮疙瘩~~  回復  更多評論
            
          # re: android的各種*.img 文件
          2012-08-02 18:11 | 洗腳哥
          樓上這個哥們各種沒文化啊  回復  更多評論
            
          主站蜘蛛池模板: 遂昌县| 台南县| 福建省| 普安县| 珠海市| 沙雅县| 西丰县| 泊头市| 友谊县| 阿拉善盟| 泗阳县| 法库县| 金华市| 崇明县| 页游| 苍山县| 无锡市| 体育| 莱芜市| 股票| 云南省| 七台河市| 车致| 调兵山市| 苗栗县| 平湖市| 宜城市| 黄大仙区| 苏尼特左旗| 赫章县| 崇信县| 河北省| 左云县| 宿州市| 玉山县| 枣庄市| 肥西县| 泊头市| 左贡县| 双桥区| 新蔡县|