【问题标题】:Capture keys sent to a specific application in Linux捕获发送到 Linux 中特定应用程序的密钥
【发布时间】:2021-02-24 15:36:15
【问题描述】:

理想情况下,我想捕获发送到特定程序(并且到该程序)的密钥,例如矮人要塞。 [然后只向该程序发送击键 - 这更容易]

一种解决方法是在 Docker 或 VM 中运行应用程序,并使用 [logkeys][1] 之类的内容捕获所有击键,但最好为特定应用程序使用包装器或其他方法。

我正在寻找解决这个问题的方法。 我应该使用设备驱动程序吗? (但我如何将其限制为仅适用于该应用程序?)或者是否有一些我应该注意的特定事项,例如Python / C 已经有了……为什么不直接使用keytrace 等?

编辑:经过进一步思考,这似乎是在窗口管理器级别处理的事情 - 也许这可能是一种方法。

【问题讨论】:

  • 这收到了反对票 - 我很想知道为什么 - a) 选民认为这是微不足道的 - 如果是这样,谁放弃了 100 赏金? b)它通常不感兴趣/太具体 - 考虑到有 50K 键盘记录问题 - 似乎记录到一个程序会很有趣

标签: python c linux linux-kernel keylogger


【解决方案1】:

如果您的应用程序创建了 X11 窗口,或在 X11 窗口内运行(例如在终端模拟器中),您可以捕获针对该特定窗口的 X11 事件。

在应用程序运行的情况下,使用xwininfo 确定窗口的标识符:运行xwininfo,单击目标窗口,然后查找

xwininfo: Window id: ...

在输出中。

然后运行xev,拦截发送到目标窗口的事件:

xev -id ... -event keyboard

用上面确定的窗口 id 替换 ...

结果比较冗长,但可以进行后处理:

KeyPress event, serial 18, synthetic NO, window 0x4000003,
    root 0x187, subw 0x0, time 141181493, (369,-10), root:(369,54),
    state 0x0, keycode 116 (keysym 0xff54, Down), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 21, synthetic NO, window 0x4000003,
    root 0x187, subw 0x0, time 141181653, (369,-10), root:(369,54),
    state 0x0, keycode 116 (keysym 0xff54, Down), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 21, synthetic NO, window 0x4000003,
    root 0x187, subw 0x0, time 141182188, (369,-10), root:(369,54),
    state 0x0, keycode 116 (keysym 0xff54, Down), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

这不适用于所有 X11 应用程序,但它适用于 Dwarf Fortress。

在 X11 下,窗口管理器不处理单个应用程序的键盘输入。

【讨论】:

    猜你喜欢
    • 2017-09-20
    • 1970-01-01
    • 2019-06-20
    • 2018-11-12
    • 1970-01-01
    • 2020-11-24
    • 2012-12-12
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多