关于Bin文件的解析

关于Bin文件的解析

由Windows CE的开发工具Platform Build编译生成的Windows CE操作系统及Bootloader的镜像文件主要由两种格式类型——以.bin为文件名后缀的记录型镜像文件和以.nb0为后缀的原始型(raw)镜像文件,前者以记录(Record)为单位组织镜像的数据,后者则是镜像在嵌入式系统中运行时的二进制数据快照。



DownloaderImage函数执行的第一步是调用GetImageType函数获知镜像文件的格式类型。每一个Windows CE镜像文件在文件数据的起始位置都有一个7字节的特征码(magic number),它与镜像文件的格式一一对应如下:


“N000FF\X0A”——BL_IMAGE_TYPE_MANIFEST


“X000FF\X0A”——BL_IMAGE_TYPE_MULTIXIP


“B000FF\X0A”——BL_IMAGE_TYPE_BIN





    本文重点研究BL_IMAGE_TYPE_BIN类型的记录型镜像文件格式,该类型的镜像文件均以.bin为文件名后缀,DownloaderImage函数调用DownloadBin函数处理这种类型的镜像文件。在BL_IMAGE_TYPE_BIN类型的镜像文件中,紧随着最初的7字节特征码之后是该镜像文件在嵌入式系统中的目的物理存储起始地址和以字节为单位的长度,各占4字节,这两个数据的含义分别对应于RegionInfo结构体的dwRegionStart、dwRegionLength两成员。接下来的便是具体存放操作系统为二进制数据的拥有相同结构的多条记录(Record),每条记录由4字节的内存起始地址dwRecAddr、4字节的记录长度dwRecLen、4字节的校验码dwRecChk和dwRecLen个字节的记录数据组成。DownloaderImage函数依次从下载端口读出各条记录并且对它们执行校验,校验也是以记录为单位,待校验无误以后将去除头信息的记录数据存放到dwRecAddr指定地址的物理存储位置。如果记录的目的存储位置是Flash存储设备,则通常要先缓存在RAM内存中,待整个镜像文件全部下载完再一起写入Flash。


     本文以项目中定制的操作系统NK.bin为例进行分析。使用UltraEdit将其打开如图1所示。






 
     图1 使用UltraEdit打开系统镜像文件


    


从上图可以看出,文件头(head)由7个字节组成,内容是:42 30 30 30 46 46 0A,即“B000FF\x0A”,这是判断镜像文件是.bin类型的依据。镜像数据目的起始地址(ImageStart,00 00 10 80)由4个字节组成,它定义了镜像文件解析后装载在内存中的起始地址是0x80100000。镜像数据长度(ImageLength,D0 03 5D 02)也由4个字节组成,它表示.bin镜像文件解析后在内存中占用的总的存储空间大小为(0x025D03D0)。每条记录(record)由4字节的起始存储地址(RecordStart)、4字节的数据长度(RecordLength)、4字节的校验码 (RecordCheckSum)和RecordLength个字节的记录数据(RecordData)组成。以第一条记录为例,分别为0x80100000,0x00000004,0x000001AF和0XEA0018AD。


可以使用%_WINCEROOT%\PUBLIC\COMMON\OAK\BIN\I386目录下的viewin工具查看NK.bin文件的记录内容。Viewbin是一个用于查看Windows CE的操作系统镜像数据信息的小程序,它可以看到的镜像信息包括:镜像运行时准确的长度信息、包含在镜像中的文件和可执行的模块以及镜像中所包含的符号信息。使用下面命令查看NK.bin镜像文件中的记录内容,如图2所示。


Viewbin –r nk.bin




  图2 使用viewbin打开系统镜像文件
    


上图清晰的显示了NK.bin里面的所有记录条目(截图只显示了0-16条)。镜像数据目的起始地址(ImageStart)为0x80100000,镜像数据长度(ImageLength)为0x025D03D0。以第一条记录Record[0]为例,它由4字节的起始存储地址(0x80100000)、4字节的数据长度(0x00000004)、4字节的校验码 (0x000001AF)和0x00000004个字节的记录数据(0XEA0018AD)组成。这和之前使用UltraEdit打开NK.bin的内容是一致的。


     由以上.bin的文件格式可知,.bin文件不是内存程序空间的一个简单的拷贝。所以它不能直接用串口烧写进内存或FLASH空间来直接运行,必须通过 PB下载,通过EBOOT按照.bin文件的格式解析出来具体的内容并重新装载后才能运行。
解析和查看 `.bin` 文件内容或结构通常需要根据文件的实际用途和格式来选择合适的方法。以下是一些常见的工具和方法,可以帮助解析 `.bin` 文件内容: ### 使用十六进制编辑器查看 十六进制编辑器是查看和编辑二进制文件的常用工具。它能够将二进制数据以十六进制和ASCII形式显示,帮助理解文件结构。以下是一些常用的十六进制编辑器: - **HxD**:一款适用于Windows的免费十六进制编辑器,支持大文件的快速加载和编辑。 - **Hex Fiend**:Mac用户可以使用这款免费的十六进制编辑器来查看和编辑`.bin`文件。 - **WinHex**:一款功能强大的商业十六进制编辑器,支持多种文件格式和数据恢复功能[^1]。 ### 使用编程语言解析 如果需要更深入地解析`.bin`文件内容,可以使用编程语言来读取解析二进制数据。以下是一些常见编程语言的示例: #### Python Python 提供了 `struct` 模块,可以用来解析和打包二进制数据。以下是一个简单的示例,展示如何读取`.bin`文件解析内容: ```python import struct # 打开.bin文件 with open('example.bin', 'rb') as f: # 读取文件内容 data = f.read() # 假设文件包含一个32位整数和一个64位双精度浮点数 # 使用struct.unpack解析数据 parsed_data = struct.unpack('id', data) # 输出解析结果 print(parsed_data) ``` #### C/C++ C/C++ 提供了直接操作二进制数据的能力,可以通过 `fread` 函数读取`.bin`文件内容。以下是一个简单的示例: ```c #include <stdio.h> int main() { FILE *file = fopen("example.bin", "rb"); if (file == NULL) { printf("无法打开文件\n"); return 1; } // 定义变量存储读取的数据 int integer_data; double double_data; // 读取数据 fread(&integer_data, sizeof(int), 1, file); fread(&double_data, sizeof(double), 1, file); // 关闭文件 fclose(file); // 输出解析结果 printf("整数数据: %d\n", integer_data); printf("浮点数数据: %f\n", double_data); return 0; } ``` ### 使用专用工具解析 如果`.bin`文件是特定格式的文件(例如固件文件、磁盘镜像等),可能需要使用专用工具来解析内容。以下是一些常见的专用工具: - **Binwalk**:一款用于分析、逆向工程和提取固件镜像的工具,支持检测和提取嵌入式设备的固件。 - **dd**:Linux系统下的命令行工具,可以用来复制文件和转换数据,常用于创建和处理磁盘镜像。 ### 注意事项 在解析和查看`.bin`文件时,需要注意以下几点: 1. **了解文件格式**:确保了解`.bin`文件的实际格式和用途,以便选择合适的工具和方法。 2. **备份文件**:在进行任何修改之前,建议备份原始文件,以防止数据丢失。 3. **遵守法律法规**:请确保您有查看和解析`.bin`文件的合法权限,并遵守相关法律法规。 通过上述工具和方法,可以有效地解析和查看`.bin`文件内容或结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值