kittennbfive/UARTfind
GitHub: kittennbfive/UARTfind
一款软硬件结合的硬件逆向工程辅助工具,通过持续检测信号下降沿间隔来自动识别未标注测试点上的 UART 串行输出及其波特率。
Stars: 0 | Forks: 0
# UARTfind
一款逆向工程辅助工具,用于在探测未记录的电路板时寻找串行输出(硬件+软件)
## 许可与免责声明
UARTfind 版权所有 (c) 2026 kittennbfive,在 AGPLv3+ 下发布,不提供任何担保。
## 问题所在
在对电路板进行逆向工程(例如为了维修或编写自己的固件等)时,人们几乎总是试图寻找串口,它可能会提供有关目标设备的信息,甚至由于内置的 bootloader,还能允许对主存储器进行重新刷写(比如想象一下路由器在固件升级失败后的救砖过程)。如果你运气真的很好,你的目标板上会有一个标识正确的 3 针或 4 针接头,你只需要检查电压并找到正确的波特率。然而,对于布满未记录/未标记测试点的板子,这个过程会变得更加困难、耗时且容易出错。在找到一个良好的接地端后,你必须用示波器检查每一个测试点,在此过程中可能还要对目标板进行重新上下电。特别是如果电路板元件密集,且测试点非常小,你可能会很难在盯着示波器屏幕检查是否有活动时,还能保持探针不动。如果你运气不佳,探针滑脱了,甚至可能会造成短路,然后“释放魔法烟雾”(烧毁元件)。
## 一种(可能的)解决方案
这就是这款工具可能派上用场的地方。它由一些电子元件组成(以 Attiny402 为核心;Attiny**2**02 应该也可以),能够持续检测串行信号,如果你探测的信号看起来像串行输出,它就会激活蜂鸣器(或 LED,由你选择)进行提示。它本身还有一个串行连接接口(5V,115200 8N1),会输出波特率,并允许你通过简单的字符界面调整一些设置。目前支持从 600 Baud 到 1MBaud 的 14 种标准波特率。
通过使用这款工具,你可以逐个快速探测测试点,而无需让你的眼睛在电路板和示波器屏幕之间来回切换。
## 重要安全须知
该硬件具有一些基本的输入保护功能,可以将输入电压钳位到安全水平。因此,一旦你找到了一个(可能的)串行接口,你**必须**使用示波器检查电压电平!否则你可能会烧毁你的 USB 转串口适配器,甚至导致更严重的后果。
此外,本工具**绝对不得**用于任何与市电电压相连的设备(例如容性降压电源)!请务必小心!
## 工作原理是什么?
基本原理是持续测量两个下降沿之间的持续时间(请记住,UART 在空闲时为高电平),并与标准波特率的已知持续时间列表进行比较(容差约为 3%)。如果有足够的样本落在给定波特率的允许范围内,你可能就找到了一个串行输出。样本数量和所需的成功匹配次数可以在运行时通过工具自身的串口进行微调。事实证明,找到合适的参数值有些棘手。欢迎提供反馈(请提交 issue)!
### 支持的波特率
600; 1200; 2400; 4800; 9600; 19200; 38400; 57600; 115200; 230400; 460800; 576000; 921600; 1MBaud。
由于内部计时器溢出,无法支持更低的速率(而且反正也没什么用)。由于内部计时器的分辨率限制,也无法支持更高的速率(欢迎证明我是错的!),Attiny 最高只能以 20MHz 运行(在最佳情况下可提供 50ns 的计时器分辨率)。
## 硬件部分
由于 Attiny402 是一款性能相当强大的芯片,因此所需的元件并不多。但请注意,与“老款” AVR 不同,它不能通过 SPI 进行编程,而是通过(单线) UPDI 编程,因此你需要一个合适的编程器(经过稍微改造的 USB 转串口适配器配合 avrdude 即可很好地工作)。Attiny**2**02 应该也可以工作(未测试),除了可用内存不同,它是同一款芯片。

U1 是完成几乎所有工作的 Attiny402,以及必不可少的 100nF 去耦 MLCC 电容 C1。这里有不少连接器,你可以根据自己的确切需求调整引脚排列等。
在信号提示方面,你可以安装有源蜂鸣器(即内置电子元件的蜂鸣器;而不是需要方波才能工作的无源压电陶瓷片),或者 LED,甚至两者都装。事实证明,我手头这些小蜂鸣器声音非常响亮,因此我串联了一个(阻值相当大的)电阻。此外还要注意 GPIO 的最大输出电流。
SW1 用于切换设备的工作模式,详见下文。如果你不需要,可以将其拆除,或者将该引脚直接接地。
R1 和 D2 在探测可能超出 0V 到 5V 范围的未知信号时提供一些基本保护。D1 也非常重要,如果有电流流过 R1 和 D2,它会将电路的电源电压钳位在 5.1V 左右。*为了避免破坏信号的边沿,你必须选择一款低电容的双二极管*,例如图中所示的 BAV99(+)。同时,R1 的阻值也不能太大。如果有疑问,请进行相关计算(RC 时间常数等)和/或使用示波器检查,但要注意后者的输入电容。我们在这里讨论的是几十皮法(picofarads)的级别!
Attiny402 的功耗约为 10mA,因此可以安全地由 USB 供电(通过你的 USB 转串口转换器或专用电源)。
## 软件部分
Attiny402 的软件是使用汇编语言编写的(哎呀!)是出于速度考量,而且我也确实需要练习一下这门语言……
### 如何构建
运行 `avr-gcc -mmcu=attiny402 -o avr.elf main.S`。如果你想使用 Attiny**2**02(未测试),请根据需要进行调整。使用你喜欢的工具和 UPDI 编程器进行烧录。这款单片机无需设置任何保险丝。
### 操作模式
在“标准”模式(引脚 7 悬空或拉高)下,一旦找到(可能的)串行输出,设备会发出一声蜂鸣,同时(通过其自身的串口)打印出波特率。
在“独立”模式(引脚 7 接地)下,设备会执行相同的操作,*但*还会发出一些短促的蜂鸣声,为你报出推测的波特率索引,从 600 Baud(1 声蜂鸣)到 1MBaud(15 声蜂鸣)。这种模式使得设备在未连接计算机或串口的情况下也能使用,你只需为其提供 5V 直流电。
### Attiny 内部的“信号流”
信号经过一些输入保护后,进入 Attiny 的引脚 3(即 PA7)。从那里,它被送入模拟比较器,与可配置的阈值(见下文)进行比较。比较器的输出通过事件系统重定向到 Timer B(TCB),后者具有方便的周期测量模式。Timer A(TCA)提供超时功能,设置为 50ms。这一点非常重要,因为你不会希望在对目标板的另一个测试点进行探测后,内存中还残留着“旧”的样本数据。此外,内部 USART 的引脚也通过 PORTMUX 功能进行了“重定向”。如果你只是想使用这款工具而不修改它,就无需担心这些细节。
### 编译时配置
代码开头有 3 个 `#define`,用于定义一些重要的值。你可以在编译前或运行时通过串口(见下文)对其进行更改。
- `NB_SAMPLES_DEFAULT` 是代码在检查已知波特率之前获取的样本数(即两个下降沿之间的持续时间)。
- `NB_MATCHES_MIN_DEFAULT` 是检查获取的样本时,所需的最小成功匹配次数。显然,它必须小于上面的值。
- `VOLTAGE_LEVEL_INDEX_DEFAULT` 定义了 Attiny 内部比较器使用的电压阈值:
|索引|电压水平|
|-----|-------------|
|0|0.55V|
|1|1.1V(默认)|
|2|2.5V|
|3|4.3V|
|4|1.5V|
(取自 Attiny402 数据手册 §18.5.1)
### 串口与运行时配置
这里有一个基础的(写汇编代码很有趣……)串口界面,允许你通过引脚 4 和引脚 5 的串口获取或设置一些数值。其参数为 5V 115200 8N1。
每个命令都以 '?' 开头用于*获取*数据,或以 '!' 开头用于*设置*数据。其后紧跟一个*单个字符*,用于指明你想要操作*什么*。如果你正在设置一个值,则该值(1 或 2 位数字)会紧随其后。每个命令都以 '\n' 结束。
#### 命令说明
- 'i' -> 设备i身份信息(无法设置/更改)
- 's' -> s样本数(最小为 1,最大为 `NB_SAMPLES_MAX`)
- 'm' -> 匹配成功 / 找到 UART 所需的最小有效m样本数(最小为 1,最大为当前的样本数(见上文))
- 'v' -> v电压水平索引(0 到 4,见上文)
- 'f' -> 以 ASCII 码打印最后f发现的波特率(无法设置/更改)
## 输出示例
上电时,设备会输出一些基本的头部信息:
```
This is UARTfind v0.4
Copyright (c) 2026 by kittennbfive
AGPLv3+ and NO WARRANTY
https://github.com/kittennbfive
```
如果匹配成功,它会输出推测的波特率、样本总数以及成功匹配的样本数:
```
UART found: 115200 Baud (6/8 matches)
```
在你将示波器以外的任何设备连接到你刚刚探测的测试点之前,请务必牢记上文的警告!
## 构建示例
我自己的版本是采用“死虫”风格(Dead bug style),将元件直接焊接在一块废旧的洞洞板上制作的。它可以直接插到我手头的 USB 转串口适配器上,适配器同时也会为设备供电。所有部件都用大量的热熔胶固定。
实际的探针尖是一个 pogo pin,将其塞入“杜邦”外壳中,以便于安装和对中。

右侧的内部接口(带有黄色热缩管)可用于为 Attiny 重新刷写固件。

标签:UART, 串口调试, 云资产清单, 安全报告生成, 嵌入式系统, 电子工程工具, 硬件, 逆向工程