Hotdry.
systems-engineering

ReMarkable 2 电纸屏固件逆向工程:自定义输入驱动与 QML 界面叠加

ReMarkable 2 电纸书逆向实践,详解固件提取、输入驱动自定义参数及 QML UI 修改清单,实现工程化改造要点。

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/xochitllibinput.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 消费。

逆向步骤:

  1. strace -p $(pgrep xochitl) -e trace=evdev 捕获事件:笔压(BTN_TOOL_PEN)、倾斜(ABS_TILT_X/Y)、坐标(ABS_X/Y)。
  2. 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;
    };
    
  3. 自定义驱动:编写 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.qmlNoteCanvas.qml

叠加方法:

  1. 备份原文件:cp -r /usr/share/qml/ ~/qml-orig/
  2. 创建 overlay 目录:/home/root/.local/share/qml/,复制并修改。
  3. 示例自定义 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 限频)。
  • 清单
    1. 备份分区:dd if=/dev/mmcblk0 of=backup.img
    2. 版本兼容:固件 2.15+ 支持 overlay,无需完整重打包。
    3. 测试集:多笔迹、多角度输入。
    4. 监控: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 字)

查看归档