WhyCan Forum(哇酷开发者社区)

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn

您尚未登录。

#1 2020-09-22 23:55:44

SdtElectronics
会员
注册时间: 2020-07-27
累计积分: 13

script.bin文件头特征以及直接从flash镜像文件中提取的方法

通过16进制编辑器打开其他board的已有script.bin,可见其明显的文件头部特征:
1, 0x00处有1byte的未知标记,这个board的bin和我flash的bin中此标记不同,不明其含义;
2, 0x10处有ascii字符串"product",为fex的第一个section。之后的部分略。

   0     4c 00 00 00 00 00 00 00  01 00 00 00 02 00 00 00  70 72 6f 64 75 63 74 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00   L...............product...............
  26     00 00 00 00 00 00 00 00  00 00 02 00 00 00 fc 02  00 00 74 61 72 67 65 74  00 00 00 00 00 00 00 00  00 00 00 00 00 00   ..................target..............

利用该特征定位到script在读出的镜像文件中的偏移量,此次提取出的镜像中2是0x66000

65FEA     ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff 55 00  00 00 00 00 00 00 01 00  00 00 02 00 00 00   ......................U...............
66010     70 72 6f 64 75 63 74 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  02 00 00 00 56 03   product.............................V.

使用dd命令将script.bin从镜像中剪裁导出:

dd if=flash.bin of=/mnt/r/sc.bin bs=1 skip=417792 count=39016

值得注意的是:
1, dd命令的skip等数值选项接收的都是十进制参数,需将16进制偏移量换算后传入(0x66000=417792)
2, 我没有找到script.bin文件尾的特征,事实证明不将文件末端的无关部分裁去也不影响后续过程中使用sunxi-fexc转换bin为fex,因此命令的count选项完全可以不要。但由于bs设置得很低,如果不限制输出的文件的大小可能会导致整个过程较慢。
使用sunxi-fexc将bin格式转换为fex:

./sunxi-fexc -v -I bin -O fex ./sc.bin sc.fex

(待续)

离线

#2 2020-09-23 09:41:41

vip888888
会员
注册时间: 2020-07-16
累计积分: 82

Re: script.bin文件头特征以及直接从flash镜像文件中提取的方法

这是准备向破解事业进军咩?

离线

#3 2020-09-23 09:52:44

SdtElectronics
会员
注册时间: 2020-07-27
累计积分: 13

Re: script.bin文件头特征以及直接从flash镜像文件中提取的方法

怎么突然找不到编辑主题的按钮了,我就在跟贴里更新吧。上次我发了个在网上流传的主流方法全部失效时从debugfs提取fex字段的贴子,可以当成前情提要。其实同时我还想到另一种方法,就是用CH341之类的编程线读出SPI flash中的内容,然后直接从中读取出script.bin。读取出来的内容是一个头部有垃圾的多分区镜像,没法直接挂载的,所以提取文件又有两种途径,一是定位FAT分区的bootloader的头部然后提取出分区镜像并挂载,然后从中取出文件;二是直接定位script.bin的头部然后一步提取出文件本体。昨晚尝试第二种途径成功,就急急忙忙发贴记录了一下关键步骤。
完成一楼所述过程之后就可以编辑转换后的FEX内容或者直接把FEX再通过sunxi-fexc转换回bin了。我认为这应该是目前提取script.bin的终极方法,因为不论平台被如何精简,不论平台boot是什么过程,只要script.bin确实存在并且可以读出ROM的全部内容,这种方法就一定可行。 当然上述过程还适用于在已知头部和尾部特征的情况下从编程线读出镜像中提取任何文件。

离线

#4 2020-10-07 22:05:06

sea18c
会员
注册时间: 2019-08-05
累计积分: 183

Re: script.bin文件头特征以及直接从flash镜像文件中提取的方法

又多一条路,不错,顶楼主的分享

离线

#5 2020-10-21 15:14:03

qianfan
会员
注册时间: 2019-11-29
累计积分: 9

Re: script.bin文件头特征以及直接从flash镜像文件中提取的方法

0x00处的4C是sections. 可以参考这份代码: https://github.com/linux-sunxi/sunxi-tools/blob/master/script_bin.h#L28

struct script_bin_head {
    uint32_t sections;
    uint32_t filesize;
    uint32_t version[2];
    struct script_bin_section section[];
};

这个fex.bin的头里面没什么magic的字符串, 比较难找. 只能打开固件文件手动的查找.

全志新一点的内核, 使用dtb的, 那个就好处理了.

离线

#6 昨天 11:11:34

qianfan
会员
注册时间: 2019-11-29
累计积分: 9

Re: script.bin文件头特征以及直接从flash镜像文件中提取的方法

sunxi-tools里面有个工具script_extractor.c也可以提取, 前提是能够进入目标机器并能运行文件.

全志的代码默认将sys_config加载到43000000这个地址, 参考代码里面的配置:

```c
➜  linux-3.4 git:(r16-v2.1.y) grep -nr SYS_CONFIG_MEMBASE arch/arm/mach-sunxi
arch/arm/mach-sunxi/sun8i.c:114:unsigned int sys_config_addr = SYS_CONFIG_MEMBASE;
arch/arm/mach-sunxi/include/mach/sun8i/memory-sun8iw7p1.h:27:#define SYS_CONFIG_MEMBASE       (PLAT_PHYS_OFFSET + SZ_32M + SZ_16M)           /* 0x43000000 */
arch/arm/mach-sunxi/include/mach/sun8i/memory-sun8iw1p1.h:23:#define SYS_CONFIG_MEMBASE       (PLAT_PHYS_OFFSET + SZ_32M + SZ_16M)           /* 0x43000000 */
arch/arm/mach-sunxi/include/mach/sun8i/memory-sun8iw5p1.h:27:#define SYS_CONFIG_MEMBASE       (PLAT_PHYS_OFFSET + SZ_32M + SZ_16M)           /* 0x43000000 */
arch/arm/mach-sunxi/include/mach/sun8i/memory-sun8iw6p1.h:27:#define SYS_CONFIG_MEMBASE       (PLAT_PHYS_OFFSET + SZ_32M + SZ_16M)           /* 0x43000000 */
arch/arm/mach-sunxi/include/mach/sun8i/memory-sun8iw3p1.h:27:#define SYS_CONFIG_MEMBASE       (PLAT_PHYS_OFFSET + SZ_32M + SZ_16M)           /* 0x43000000 */
arch/arm/mach-sunxi/include/mach/sun8i/memory-sun8iw8p1.h:25:#define SYS_CONFIG_MEMBASE       (PLAT_PHYS_OFFSET + SZ_32M + SZ_16M)           /* 0x43000000 */
arch/arm/mach-sunxi/include/mach/sun8i/memory-sun8iw9p1.h:27:#define SYS_CONFIG_MEMBASE       (PLAT_PHYS_OFFSET + SZ_32M + SZ_16M)           /* 0x43000000 */
```

这个工具使用memmap读取物理地址的数据, 可以使用devmem简单的看下地址是否正确:

busybox devmem 0x43000000

之后提取出128K的文件并使用sunxi-fexc转换就行了.

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB