第一章:比特流基础
各位同学好,我是老周。做逆向分析这行快十五年了,今天咱们聊聊比特流。
很多人一上来就问我:「老周,比特流到底是个啥?」
嗯,这个问题问得好。说白了,比特流就是一连串的0和1。但你别小看这俩数字,它们构成了整个数字世界的基石。
1.1 什么是比特流
比特流(Bitstream),就是按时间顺序排列的二进制位序列。每个位(bit)只有两种状态:0或1。
我习惯把比特流想象成一条「数据河流」。河水是一滴一滴的,每一滴就是一个比特。这些水滴按顺序流过来,就形成了比特流。
核心定义:比特流 = 二进制位的时序序列
举个例子,ASCII字符'A'的二进制是01000001。如果你在示波器上看到这个序列,那就是一个简单的比特流。
我在项目中遇到过一件事:有个同事抓了一段串口数据,死活解析不出来。后来发现他搞反了比特顺序——高位在前还是低位在前,这个坑我踩过不止一次。
1.2 比特流的物理表示
比特流不是虚无缥缈的东西。它在物理世界里有实实在在的表示方式。
| 物理介质 | 表示方式 | 典型应用 |
|---|---|---|
| 电信号 | 高电平=1,低电平=0 | UART、SPI、I2C |
| 光信号 | 有光=1,无光=0 | 光纤通信 |
| 磁信号 | 磁极方向变化 | 硬盘、磁带 |
| 无线电波 | 频率/相位调制 | WiFi、蓝牙 |
你想想看,你手机里存的每一张照片、每一段视频,最终都是通过这些物理信号来存储和传输的。
个人经验:做逆向分析时,我经常先用逻辑分析仪抓物理信号,再还原成比特流。这一步看似简单,但采样率设置不对,数据就全废了。我建议新手至少用4倍于信号频率的采样率。
1.3 比特流与数字信号的关系
比特流和数字信号,这俩是「灵魂」和「肉体」的关系。
比特流是抽象的数据,数字信号是物理的载体。数字信号通过电压高低、电流有无等方式,把比特流「搬运」到物理世界。
举个例子:
比特流: 1 0 1 1 0 0 1 0
数字信号: 高 低 高 高 低 低 高 低
这里有个关键点——时序。数字信号不是瞬间变化的,它有上升时间、下降时间、建立时间、保持时间。我曾经因为忽略了信号抖动,导致解析出来的数据全是错的。
避坑指南:我曾经在分析一个RFID信号时,直接用示波器看波形就以为是曼彻斯特编码。结果折腾了两天,才发现其实是差分曼彻斯特编码。所以,拿到信号先别急着解码,先搞清楚编码方式。
1.4 比特流的存储格式
比特流在存储时,不是简单地把0和1堆在一起。为了便于管理和解析,人们设计了各种存储格式。
常见的存储格式有:
- 原始二进制格式(.bin):最纯粹的形式,没有任何额外信息
- 十六进制格式(.hex):每4个比特用一个十六进制字符表示
- Intel HEX格式:带地址和校验信息的文本格式
- SREC格式:摩托罗拉定义的记录格式
- BIT文件:Xilinx FPGA的比特流文件
我平时做逆向分析,最常用的是原始二进制格式。为什么?因为没有任何包装,直接就是数据本身。但缺点也很明显——没有结构信息,全靠自己猜。
来看一个Intel HEX格式的例子:
:10000000FFEEDDCCBBAA99887766554433221100F0
:10001000FFEEDDCCBBAA99887766554433221100E0
:00000001FF
每一行都包含:起始标记、字节数、地址、数据类型、数据、校验和。这种格式的好处是自带校验,传输过程中出错能发现。
我的习惯:拿到一个未知格式的比特流文件,先用十六进制编辑器打开,看看文件头。很多格式都有固定的魔数(Magic Number),比如FF D8开头是JPEG,7F 45 4C 46是ELF。这个习惯帮我省了不少时间。
知识体系总览
下面这张图,是我自己整理的比特流基础框架。你看一眼,心里就有谱了。
这张图把本章的核心内容串起来了。你记住:比特流是数据的最小单元,物理表示是它的载体,数字信号是传输方式,存储格式是它的包装。
做逆向分析,说白了就是跟比特流打交道。你越了解它,就越能看透数据的本质。