web-dev-qa-db-ja.com

すべてのキーストロークを傍受する方法

まず第一に、私はこのような何かがすでに存在することを期待していませんが、私はこのような何かがどのように達成されるかを知ることに興味があります。

入力されたすべてのキーストロークをインターセプトし(Xが実行され、おそらくUnityも実行されていると仮定します)、バックグラウンドで実行できるプログラムが必要です。通常通り処理されます。

私の最終的な目標は、OS Xのショートカット動作をより厳密に模倣する一種のキーマッピングを作成することです。これは標準のUbuntuインストールでは非常に困難です。ctrl+ cのようなものは石に設定されているように見えますが、OS Xの動作を模倣するにはcmd + cにする必要があります。とにかく、私は理由を議論することにあまり興味がなく、方法を議論することにもっと興味があります。 Python、C、または他の必要なものでデーモンを書くことに不利ではありません(標準のUNIX APIにもある程度満足しています)。しかし、私はこのようなことからどこから始めるべきかについて完全に無知です。

キーストロークがインターセプトされて処理されると、ストロークが最初に送信されたのと同じインターフェースに従って、キーストロークをOSに送り返すことができるはずです。たぶん、これはX自体へのパッチである必要がありますか?または、キーボードとXの間に何かを配置できますか?

6
gregghz

キーボードからのイベントだけでなく、他の入力デバイスを表示するために、evtestもあります。
それ自体ではキー入力を作成できませんが、以下を参照してください。

たとえば、xevよりも低いレベルのイベントを表示します。

また、デバイスが作成できるイベントを示します。

たまたまevent4はメインキーボードを参照しています。

だから私はコマンドで以下の出力例を作成します

Sudo evtest /dev/input/event4

そして押す aB

[ ... ]
Event: time 1429316964.681508, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70004
Event: time 1429316964.681508, type 1 (EV_KEY), code 30 (KEY_A), value 1
Event: time 1429316964.681508, -------------- SYN_REPORT ------------
aEvent: time 1429316964.761540, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70004
Event: time 1429316964.761540, type 1 (EV_KEY), code 30 (KEY_A), value 0
Event: time 1429316964.761540, -------------- SYN_REPORT ------------
Event: time 1429316965.385461, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time 1429316965.385461, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1
Event: time 1429316965.385461, -------------- SYN_REPORT ------------
Event: time 1429316965.577461, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70005
Event: time 1429316965.577461, type 1 (EV_KEY), code 48 (KEY_B), value 1
Event: time 1429316965.577461, -------------- SYN_REPORT ------------
BEvent: time 1429316965.641460, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70005
Event: time 1429316965.641460, type 1 (EV_KEY), code 48 (KEY_B), value 0
Event: time 1429316965.641460, -------------- SYN_REPORT ------------
Event: time 1429316965.713470, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time 1429316965.713470, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 0
[ ... ]


(適切なイベント番号(私のevent4など)を見つけるには、cat /proc/bus/input/devicesを見ることができます。Nameはキーボードを参照しませんが、Handlerssysrqおよびkbdを含むエントリledsを探します。 )



キープレスイベントはevdevでは作成できませんが、evdevを使用して新しいイベントを作成できるキーの再マッピングの実装があります。
探しているものと一致するようです:

EvdevのAt Home Modifierahmまたはat-home-modifier-evdev):

たとえば、「スペース/ Shiftデュアルロールキー」を有効にします。スペースキーを単独で押すと、スペースになります。しかし、別のキーでそれを押すと、それはシフトです。たとえば、大まかに言えば、スペース+ x = Xです。

キーの任意のペアが可能です。たとえば、Space/Shiftに加えて、左AltをBS/Altに変えることができます。この例では、Spaceに続いてLAltがShift + BSを送信し、LAltに続いてSpaceがAlt + Spaceを送信し、Space + LAlt + xおよびLAlt + Space + xはAlt + Shift + xを送信します。

Xorg「evdev」ドライバーのフォークです[...]

それはクリーンな実装であると主張していません-しかし、それはそれから学ぶことを妨げません。

3
Volker Siegel

はい、ubuntuのキーロガーがあります。

こちらからダウンロードできます

または、apt-get経由でインストールします

ユニバースリポジトリを有効にして、ターミナルで次を実行します

Sudo aptitude update
Sudo aptitude install lkl

実行するには、ターミナルで次を入力します

lkl -l -k us_km -o log.file

結果を見るために

末尾のlog.file

2
Ringtail