文件解析笔记

Fork Me On Github
zodream 其他技术 2025年09月

文件解析笔记

工具

ImHex

基础知识

数据类型 子节数 说明
byte 1 占 8 个二进制字符,特殊知识:以 0x80 为分界
sbyte 1 占 8 个二进制字符
short 2
ushort 2
int 4
uint 4
float 4
long 8
ulong 8
double 8
char 1 、 2 在 c 等低级语言中占 1 个子节,在 c# 等高级语言中占 2 子节
string 无固定长度 一种是定义长度,再取长度的字节数转,另一种是以 0x0 为结束符
leb128 无固定长度 每次读一个子节, 子节值大于等于 0x80 表示有需要读下一个子节

端

主要为大端小端,主要是指有多个固定字节数的数据类型的字节写入顺序不同, byte sbyte 只有一个字节,没有大小端之分;string char leb128 都不固定长度,依赖前一个字节指示是否有下一个字节,所以无法分大小端。

大端(BigEndian, 简写BE),高位写在前面,反转过来写的意思,例如 (ushort)1 转成字节数组是 [0x1, 0x0] 写入流时是先写 0x0 在写入 0x1

小端(LittleEndian, 简写LE),低位写在前面,顺着字节数组写的意思,例如 (ushort)1 转成字节数组是 [0x1, 0x0] 写入流时是先写 0x1 在写入 0x0

一般来说:网络字节流的是大端,计算机文件流是小端。

字符串编码

Unicode 固定文件头 0xFF 0xFE,大端则是 0xFE 0xFF UTF8 分有头和无头,有固定头 0xEF 0xBB 0xBF

无头编码,主要根据 char(两个字节) 存储方式判断,一般来说 0x0-0x7F 是指占用一个字节,0x80-0xFF 根据定义可以指示多个字节

UTF8

字节数 字节分布
1 0x00-0x7F
2 0xC2-0xDF 0x80-0xBF
3 0xE0 0xA0-0xBF 0x80-0xBF
3 0xE1-0xEC 0x80-0xBF 0x80-0xBF
3 0xED 0x80-0x9F 0x80-0xBF
3 0xEE-0xEF 0x80-0xBF 0x80-0xBF
4 0xF0 0x90-0xBF 0x80-0xBF 0x80-0xBF
4 0xF1-0xF3 0x80-0xBF 0x80-0xBF 0x80-0xBF
4 0xF4 0x80-0x8F 0x80-0xBF 0x80-0xBF

压缩

一般是固定的头,固定几个字节指示

  1. 无损压缩
算法类型 代表算法 适用场景
字典编码 LZ77, LZ78, LZW 重复数据压缩(文本)
熵编码 Huffman, 算术编码 通过加入长度来表示重复字节或字节数组

图片无损压缩: 对单个像素点(R|G|B|A)进行处理,例如不透明图片就可以只保存(R|G|B)三个颜色值,更进一步有单个色值的,例如只保存(R)通道

  1. 有损压缩

一般只针对特殊领域,例如图像

图象的有损压缩:分成一个个(width*height)小的区域进行近似关联处理,常见的是分成 (4*4) 的小区域,每个区域处理成 8 个字节

加密

加密算法

常见的加密算法:

  1. 对称加密:DES、AES
  2. 非对称加密:RSA、ECC

这些复杂的加密算法只适用于文件少且重要的,速度较慢、内存占用较高

一般对速度和性能有要求的就简单的使用xor(异或处理)

基本步骤

  1. 找文件的文件头,一般都是固定的内容,有多个同类的文件就很容易识别出来
  2. 找文本字符串,可用用做定位用,除非加密的文件,找到一个连续的文本,多切换编码试试,查看文本结尾后一个子节是不是 0x0, 不是的话就肯定在前面标记了长度,
  3. 长度首先考虑 byte 再考虑 leb128 再 uint int long
  4. 如果判断是 leb128, 那就可以肯定 其他长度都用的 leb128, 甚至 uint ulong 等值也转成了 leb128
  5. 找可能的分隔标记符,看见大片有规律的重复出现的子节就可靠是无意义的分隔符
  6. 找 0x0, 0x0 多用于补位,例如数据类型固定占用多个子节,不足就是 0x0,还有就是补数据内容的长度
  7. 多数数据都是重复的数据结构,即属性个数一样,用不同的数据类型去算个数是否一致。
点击查看全文
0 266 0