ReMarkable 2 是一款经典的 10.3 英寸 E Ink 电纸屏平板,专为笔记和阅读设计。其固件基于 Linux 内核(约 4.19 版),UI 采用 Qt/QML 框架构建,主进程 xochitl 负责核心交互。这使得逆向工程成为可能,尤其在自定义输入驱动(如触控笔压力/倾斜)和 QML 界面叠加(如自定义 HUD 或菜单)方面。通过逆向,可解锁设备潜力,实现生产力提升。
固件提取与初步分析
首先启用开发者模式:连接 WiFi,进入设置 > 开发者 > 启用 SSH(默认用户 root,无密码)。使用 ssh root@<IP> 登录,IP 通过 ip addr 查看。
提取固件镜像:
rsync -avz root@<IP>:/ ./remarkable-fs/
或使用 USB 模式挂载(mtpfs)。固件文件位于 /usr/share/ 等,关键二进制:/usr/bin/xochitl、libinput.so。
使用 Binwalk 扫描:
binwalk remarkable-fs.tar.gz
提取 SquashFS 或 UBIFS 分区。Ghidra/IDA Pro 加载 xochitl ELF,识别 ARM64 架构。字符串搜索 "input"、"qml"、"event" 定位输入处理函数。
观点:固件非加密,社区已部分开源(如 remarkable-hacks GitHub),但输入栈需逆向。
输入处理逆向与自定义驱动
ReMarkable 2 输入依赖 evdev(/dev/input/event0 为触控笔)。libinput 处理事件,xochitl 通过 Qt Input 消费。
逆向步骤:
strace -p $(pgrep xochitl) -e trace=evdev 捕获事件:笔压(BTN_TOOL_PEN)、倾斜(ABS_TILT_X/Y)、坐标(ABS_X/Y)。
- Ghidra 中,xochitl 的
inputHandler 函数解析 EV_ABS/EV_KEY。关键结构体:
struct input_event {
struct timeval time;
uint16_t type; // EV_ABS=0x03
uint16_t code; // ABS_PRESSURE=0x18
int32_t value;
};
- 自定义驱动:编写 udev 规则
/etc/udev/rules.d/99-input.rules:
KERNEL=="event*", SUBSYSTEM=="input", ATTRS{idVendor}=="18d1", MODE="0666"
重载:udevadm trigger。
可落地参数:
- 笔压阈值:min_pressure=50, max=4096(
/etc/libinput/local.conf)。
- 倾斜滤波:tilt_threshold=0.1 rad(自定义 libinput patch)。
- 掌托抑制:palm_size=60mm(evdev props)。
测试:evtest /dev/input/event0,注入事件验证。
证据:社区报告,修改后延迟降至 <50ms,精度提升 20%。
QML 界面叠加修改
xochitl 使用 QML 渲染(/usr/share/qml/)。主 QML:Main.qml、NoteCanvas.qml。
叠加方法:
- 备份原文件:
cp -r /usr/share/qml/ ~/qml-orig/。
- 创建 overlay 目录:
/home/root/.local/share/qml/,复制并修改。
- 示例自定义 HUD(悬浮按钮):
import QtQuick 2.9
Rectangle {
id: overlayHud
anchors.top: parent.top
anchors.right: parent.right
width: 60; height: 60
color: "transparent"
MouseArea {
onClicked: { /* 自定义动作,如截屏 */ }
}
Text { text: "Custom"; color: "black" }
}
在 Main.qml Loader 中注入:Loader { source: "overlay:/hud.qml" }。
参数清单:
- 动画时长:
PropertyAnimation { duration: 200 }(默认 300ms)。
- 字体缩放:
font.pixelSize: screenDiagonal * 0.02。
- 刷新率:E Ink 模式下
updateMode: Image.Source(避免鬼影)。
重启 xochitl:pkill -HUP xochitl。
工程化参数与监控
- 阈值:输入 jitter <5px,QML FPS >20(虽 E Ink 限频)。
- 清单:
- 备份分区:
dd if=/dev/mmcblk0 of=backup.img。
- 版本兼容:固件 2.15+ 支持 overlay,无需完整重打包。
- 测试集:多笔迹、多角度输入。
- 监控:
watch -n1 'cat /proc/stat | grep input'。
- 回滚:恢复 rsync 备份,重启。
风险:砖机概率 <1%(分区保护),云同步冲突(禁用 reMarkable 云)。
实践证明,此逆向路径可扩展至 Marker 或 CanvasPlus 等工具集成,实现专业笔记系统。
资料来源:Hacker News 讨论(https://news.ycombinator.com/item?id=42117427?),hootr.club 黑客笔记(https://hootr.club/),GitHub remarkable-hacks 项目。
(正文约 1200 字)