您尚未登录。

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

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

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

(待续)

离线

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

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

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的全部内容,这种方法就一定可行。 当然上述过程还适用于在已知头部和尾部特征的情况下从编程线读出镜像中提取任何文件。

离线

楼主 #7 2020-10-23 10:01:38

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

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

qianfan 说:

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转换就行了.

实际上在尝试其他的偏门方法之前,我已经试过包括这个在内的sunxi的Wiki上提供的所有方法了。非常古怪的是,从0x43000000到0x4300fff0读出来的数据全是0xaaaaaaaa,但另一个工具,meminfo却能正常使用,不过这个只能导出dram_para section的内容。

离线

页脚

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

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