场景:某手机需要刷 指定内核版本的 rom, 而且又搜不到太多关于手机的信息, 只能刷官方系统 大海捞针 的时候!!!
Boot.img 结构体 1. /* 2. ** +-----------------+ 3. ** | boot header | 1 page 4. ** +-----------------+ 5. ** | kernel | n pages 6. ** +-----------------+ 7. ** | ramdisk | m pages 8. ** +-----------------+ 9. ** | second stage | o pages 10. ** +-----------------+ 11. ** 12. ** n = (kernel_size + page_size - 1) / page_size 13. ** m = (ramdisk_size + page_size - 1) / page_size 14. ** o = (second_size + page_size - 1) / page_size 15. **/ 1. struct boot_img_hdr 2. { 3. unsigned char magic[BOOT_MAGIC_SIZE]; 4. 5. unsigned kernel_size; /* size in bytes */ 6. unsigned kernel_addr; /* physical load addr */ 7. 8. unsigned ramdisk_size; /* size in bytes */ 9. unsigned ramdisk_addr; /* physical load addr */ 10. 11. unsigned second_size; /* size in bytes */ 12. unsigned second_addr; /* physical load addr */ 13. 14. unsigned tags_addr; /* physical addr for kernel tags */ 15. unsigned page_size; /* flash page size we assume */ 16. unsigned unused[2]; /* future expansion: should be 0 */ 17. 18. unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */ 19. 20. unsigned char cmdline[BOOT_ARGS_SIZE]; 21. 22. unsigned id[8]; /* timestamp / checksum / sha1 / etc */ 23. }; 从上图的截图中可以分析 Kernel_size = 0x30E520 Page_size=0x1000 Page_size 就是 Kernel_offset 复制出 kernel-zimge , 看过我的那篇<<boot-kernel Patch开启内核后门>> 的文章就知道一般的 zimge 是采用 gzip 压缩算法的, 所以我们这里可直接在kernel-zimge 中搜 索16进制 “1F8B0800” 定位到 要解压的数据部分, 将起始地址 0x3FE9 到文件末尾 都复制出来另存为 zimge.gz 文件, 然后使用 gunzip 解压 就可以得到zimge 文件, 这个 zimge 就是最终的 kernel 文件了, (这里也可以直接使用 7z 解压) 然后我们直接搜索字符串 “PREEMPT” 可快速 定位到 当前 内核版本
|