一个从ext4镜像中根据inode no获取文件内容的例子

输入文件:Android中编译生成的system.img
目标文件:/system/etc/system_fonts.xml
目标:在获取到文件inode no前提下,从system.img中获取到目标文件的内容
流程:先获取到文件的inode no,再根据这个no找到对应的block获取到inode,根据inode结构中的区段树找到数据block

获取文件的inode no

先把system.img挂载到linux系统中,通过ls -i命令获取到inode

$ out/host/linux-x86/bin/simg2img system.img system.raw
$ sudo mount -o loop system.raw system/
$ ls -i system/etc/system_fonts.xml 
661 system/etc/system_fonts.xml
$ ls -l system/etc/system_fonts.xml 
-rw-r--r-- 1 root root 3418 2014-12-27 22:42 system/etc/system_fonts.xml

从ls命令的结果可知,文件的inode为661,文件大小为3418=0xD5A(后面会检查这个文件大小)

通过dumpe2fs获取ext4相关信息找到inode

这里仅列举了部分信息:

$ dumpe2fs system.raw 
dumpe2fs 1.41.11 (14-Mar-2010)
...
Block size:               4096
Blocks per group:         32768
Inodes per group:         8000
Inode blocks per group:   500
First inode:              11
Inode size:           256

Group 0: (Blocks 0-32767)
  主 superblock at 0, Group descriptors at 1-1
  保留的GDT块位于 2-48
  Block bitmap at 49 (+49), Inode bitmap at 50 (+50)
  Inode表位于 51-550 (+51)
  1 free blocks, 6391 free inodes, 90 directories
  可用块数: 32767
  可用inode数: 1610-8000
...

Block size为4096,每个Group中有8*4096个block;
Inode size为256,所以一个block可以存储4个inode;
而每个Group中有500个block存储inode,所以每个Group中有8000个inode。
51-550这500个block存储着500*16个inode结构,所以block 51开始存储的是第0个inode,我们要找的是第661个
661=41*16+5
所以inode存储在block 92(51+41)中,再偏移4*256处
377856=92*4096+4*256

$ hexdump -s 377856 -n 256 system.raw 
005c400 81a4 0000 0d5a 0000 c548 549e c548 549e
005c410 c548 549e 0000 0000 0000 0001 0008 0000
005c420 0080 0008 0000 0000 f30a 0001 0003 0000
005c430 0000 0000 0000 0000 0001 0000 34eb 0001
005c440 0000 0000 0000 0000 0000 0000 0000 0000
*
005c500

根据inode找到文件block

结合inode的定义:
关注两个数据,一是i_size_lo,代表文件大小,二是i_block,代表区段树

#define EXT4_N_BLOCKS (EXT4_TIND_BLOCK + 1) //15
struct ext4_inode {
 __le16 i_mode;
 __le16 i_uid;
 __le32 i_size_lo;
 __le32 i_atime;
 __le32 i_ctime;
 __le32 i_mtime;
 __le32 i_dtime;
 __le16 i_gid;
 __le16 i_links_count;
 __le32 i_blocks_lo;
 __le32 i_flags;
...
 __le32 i_block[EXT4_N_BLOCKS];
...
};

与前面的数据比较,可知文件大小为0d5a,和之前ls -l看到的文件大小一致。
关于区段树的分析可以参考这篇blog:
https://blog.csdn.net/u013472064/article/details/48473703
其中的34eb 0001就是我们要找的block,即0x134eb=79083
可以查看文件内容了

005c430 ---- ---- 0000 0000 0001 0000 34eb 0001
struct ext4_extent {
 __le32 ee_block;
 __le16 ee_len;
 __le16 ee_start_hi;
 __le32 ee_start_lo;
};

$ dd if=system.raw ibs=4096 skip=79083 count=1
<?xml version="1.0" encoding="utf-8"?>
<!--
    System Fonts

...
</familyset>
记录了1+0 的读入
记录了8+0 的写出
4096字节(4.1 kB)已复制,0.000151108 秒,27.1 MB/秒
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值