android的各种*.img 文件

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类型。
    • 用表格表示如下
      文件类型文件
      datakernel-qemu
      local.img
      userdata-qemu.img
      gzipramdisk.img
      VMS Alpha executablesystem.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 NANDchips;YAFFS2是YAFFS的第二版,为了适应新的NAND chips,这些新chip的pagesize有2048bytes,plus 64bytes的spare areas;老版本的NANDchips的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目录

转自: http://jinguo.javaeye.com/blog/696902

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用方法:http://blog.csdn.net/asmcvc/article/details/11770851 工具: unyaffs,mkyaffs2image 其中unyaffs有windows版本和linux版本,mkyaffs2image只有linux版本。 windows版本的unyaffs用法: 把system.img复制到unyaffs的相同目录下,cmd命令下cd到unyaffs的目录下,然后执行命令:unyaffs system.img unyaffs会把system.img解压到其目录下。 linux版本的unyaffs用法: 把unyaffs复制到/usr/bin目录下,并修改权限为可执行。 然后cd到system.img目录下(假定目录为system目录),执行命令:unyaffs system.img 然后对system目录下的文件进行修改。 注意:修改完后的文件要修改一下权限,尽量和其他文件的权限保持一致。例如:chmod 644 framework-res.apk mkyaffs2image用法: 复制到/usr/bin目录下,并修改权限为可执行。 这里以打包system目录为system.img为例,执行命令: mkyaffs2image system system.img 然后把新生成的system.img复制替换掉原:adt-bundle-windows-x86\sdk\system-images\android-17\armeabi-v7a\system.img 执行bat批处理命令启动模拟器: D:\adt-bundle-windows-x86\sdk\tools\emulator-arm.exe -avd AndroidVM -partition-size 128 这里以修改android系统启动画面为例: 打开解包目录下的\framework\framework-res.apk 替换图片:framework-res.apk\assets\images\android-logo-mask.png为下图: 然后对\framework\framework-res.apk文件重新签名,复制到linux下后修改文件权限和原来一致。 然后mkyaffs2image system system.img打包生成新的system.img,替换原来的system.img,并启动模拟器,效果图如下: 修改代码: 工具:odextools(参考:《一键odex批量合并工具odextools的重新整理与使用》)、dexopt-wrapper 其中odextools.bat的代码: 批处理有一处bug:每打包一次会把odex文件删除掉,导致在后面的打包过程中会出现找不到:system/framework/core.odex类似的错误,因此只需要在打包完后不删除odex文件即可,找到del /f !apkx!.odex 1>nul 2>nul改为:::del /f !apkx!.odex 1>nul 2>nul,也就是注释掉这一行代码。 具体使用方法(操作在windows下): 在odextools\romdir目录下创建文件夹:system 利用unyaffs解包system.img后,把所有文件复制到system目录下。 然后运行odextools.bat,如图: 选择一个需要整合odex的目录选项即可。odextools.bat会自动设置环境变量,使用baksmali.jar来反编译odex为smali,然后再调用smali.jar打包为classes.dex, 然后再打包到相应的apk包(framework目录下对应的是jar后缀的,实际上也是个apk包),最后再重新签名。 如果要修改代码,则需要把上面重新打包生成的apk文件,利用常规方法反编译后修改smali代码,例如插桩输入log信息。然后再回编译并重新签名。 最后一步:因为system.img中的apk是优化过的,apk主目录下是没有classes.dex文件的,而是一个被优化过的odex文件,用于优化启动速度。 因此需要将修改后的apk包再用dexopt-wrapper优化apk包后生成出odex文件,然后删除apk包里的classes.dex,并在相同目录下放置与apk包同名的odex文件。 按照原system目录的文件结构组织好后,目录复制到linux环境下使用mkyaffs2image重新打包成system.img

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值