Android 鍵盤監控的實現原理及過程

jopen 9年前發布 | 48K 次閱讀 Android Android開發 移動開發

鍵盤監控

鍵盤監控,顧名思義是在應用軟件在運行時,用戶在設備上的一舉一動都將被詳細記錄下來,更多的實在使用者毫無覺察的情況下 將屏幕內容以圖片的形式、按鍵內容以文本文檔的形式保存在指定的文件夾或發送到指定的郵箱。鍵盤監控,包括物理按鍵與軟鍵盤的監控,通常監控的事件有:點 擊,長按,滑動等,這些時間在Android上表現出來的都是一系列的KeyEvent。

</blockquote>

為了實現鍵盤的監控,從新開發一個輸入法是不現實的,一般的操作就是在系統的輸入法機制中添加接口回調。我們知道,再應用程序中拿到按鍵的回調一般是監聽onKeyDown的接口,如下所示:

public boolean onKeyDown(int keyCode, KeyEvent event)

開發者就可以根據回調方法中的參數, keyCode與KeyEvent來判斷具體事件。但是,由于事件的回調機制在其的沙箱中運行,在其他應用中是無法拿到當前應用事件回調的。

那么我們就從上到下,具體的看看事件的傳遞機制。如下圖所示,用戶點擊后,軟鍵盤或物理按鍵的輸入驅動就會產生一個中斷,且向/dev/input /event*中寫入一個相應的信號量。Android操作系統則會循環的讀取其中的事件,再分發給WindowManagerServer。由 WindowManagerServer根據事件的來源分發到各個不同的ViewGroup與View中,從而產生不同的OnClick、 OnKeyDown和OnTouch等事件。

Android 鍵盤監控的實現原理及過程

這個時候很自然的想到,黑客們希望做鍵盤監控,一定會向Linux底層增加自定義的事件。這里我們使用的是Linux中的getevent獲得 /dev/input/eventX設備匯報的事件,這個命令還會輸出所有event設備的基本信息。包括觸屏、按鍵、耳機插入等等。其基本用法如下:

Usage: getevent [-t] [-n] [-sswitchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
   -t: show time stamps
   -n: don't print newlines
   -s: print switch states for given bits
   -S: print all switch states
   -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32,props=64)
   -d: show HID descriptor, if available
   -p: show possible events (errs, dev, name, pos. events)
   -i: show all device info and possible events
   -l: label event types and names in plain text
   -q: quiet (clear verbosity mask)
   -c: print given number of events then exit
   -r: print rate events are received

鍵入getevent后,我們能夠看到設備中的一些列輸入硬件驅動信息,同樣下面會出現很多輸入指令信號,通常情況下,這些信號量都在刷屏,如下圖所示:

Android 鍵盤監控的實現原理及過程

這些信號量的表示我們無法直接看懂,輸入getevent –l加入Label我們能夠看到一些添加的標簽,如下所示:

Android 鍵盤監控的實現原理及過程

其實這些Lable已經在其input.h頭文件中定義好,其中type的定義如下:

/*

* Event types 
*/ 

define EV_SYN 0x00

define EV_KEY 0x01

define EV_REL 0x02

define EV_ABS 0x03

define EV_MSC 0x04

define EV_SW 0x05

define EV_LED 0x11

define EV_SND 0x12

define EV_REP 0x14

define EV_FF 0x15

define EV_PWR 0x16

define EV_FF_STATUS 0x17

define EV_MAX 0x1f

define EV_CNT (EV_MAX+1)</pre>

一般來說,常用的是EV_KEY、EV_REL、EV_ABS、EV_SYN,分別對應鍵盤按鍵、相對坐標、絕對坐標、同步事件。EV_SYN則表示一組完整事件已經完成,需要處理,EV_SYN的code定義事件分發的類型。

在觸摸事件上的幾個常見的Label說明如下表所示:

</tr> </tbody>

</tr>

</tr>

</tr>

</tr>

</tr>

</tr>

</tr>

</tr> </tbody> </table>

了解了這些Label的含義我們再看看信號量就簡單多了,如我們列舉幾個常見的事件與信號,如下表所示:

標簽名 說明
ABS_X 對應觸摸屏的X坐標
ABS_Y 對應觸摸屏的Y坐標
ABS_PRESSURE 壓力值,一般觸摸屏也只是區分是否有按下去,按下去的話值會大于多少,沒有按的話值小于多少。
ABS_TOOL_WIDTH 觸摸工具的寬度
ABS_MT_POSITION_X 接觸面的形心的X坐標值
ABS_MT_POSITION_Y 接觸面的形心的Y坐標值
ABS_MT_TOUCH_MAJOR 觸摸手指大小
ABS_MT_WIDTH_MAJOR 觸摸面積大小

</tr> </tbody>

</tr>

</tr>

</tr>

</tr>

</tr>

</tr>

</tr> </tbody> </table>

從上表中,我們發現要是按下的是物理按鍵,其輸入出來的信息我們很容易讀懂,如果按下的是軟鍵盤中的按鍵,給出的信號信息就是一些位置坐標信息。我 們無法直接讀懂,當然,我們可以根據這些位置坐標信息,再拿到Android設備的屏幕尺寸,計算比例也能夠直接獲得按鍵的具體內容。

當然,輸出條件不會是想我們表格中的這么規范,中間會夾雜則各式各樣的信息,有些可能是你不關心的。這里我們把一些無關的信號量過濾去掉了。實際查看上對應信息條件比較多,大家可以將Android設備連接如自己的電腦進行調試,這里我們就不做一一的解釋了。

</blockquote>

預防鍵盤監控

所以,為了安全起見,很多對于輸入安全要求比較高的應用軟件,除了自定義輸入法進行安全輸入以外,還需要將鍵盤上的各個字母數字位置隨機打亂,防止黑客們在截獲了位置信息后進行按鍵計算。這個也就是我們常在一些軟件中看到打亂的鍵盤原因,打亂鍵盤效果如下圖所示:

Android 鍵盤監控的實現原理及過程

getevent是一個系統級命令,需要在Root情況下才可以使用。這里我們對getevent作為闡述,的主要目的就是告訴大家,在Root后 的Android設備中,我們可以使用對Linux底層信號做讀取的方式,對設備進行鍵盤監控。當然,更可以使用sendevent命令,模擬發送事件, 這里我們不做闡述了。

 來源: stchou的專欄

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
操作 輸出信號
按下電源鍵 /dev/input/event0: EV_KEY KEY_POWER DOWN
/dev/input/event0: EV_SYN SYN_REPORT 000000
/dev/input/event0: EV_KEY KEY_POWER UP
/dev/input/event0: EV_SYN SYN_REPORT 000000
音量鍵下 /dev/input/event8: EV_KEY KEY_VOLUMEDOWN DOWN
/dev/input/event8: EV_SYN SYN_REPORT 00000000
/dev/input/event8: EV_KEY KEY_VOLUMEDOWN UP
/dev/input/event8: EV_SYN SYN_REPORT 00000000
音量鍵上 /dev/input/event8: EV_KEY KEY_VOLUMEUP DOWN
/dev/input/event8: EV_SYN SYN_REPORT 00000000
/dev/input/event8: EV_KEY KEY_VOLUMEUP UP
/dev/input/event8: EV_SYN SYN_REPORT 00000000
按下物理按鍵“1” /dev/input/event0: EV_KEY KEY_1 DOWN
/dev/input/event0: EV_KEY KEY_1 UP
按下物理按鍵“q” /dev/input/event0: EV_KEY KEY_Q DOWN
/dev/input/event0: EV_KEY KEY_Q UP
按下軟鍵盤上的“q”字母 /dev/input/event0: EV_ABS ABS_X 0000001b
/dev/input/event0: EV_ABS ABS_Y 000001d5
/dev/input/event0: EV_KEY BTN_TOUCH DOWN
/dev/input/event0: EV_SYN SYN_REPORT 00000000
/dev/input/event0: EV_KEY BTN_TOUCH UP
/dev/input/event0: EV_SYN SYN_REPORT 00000000
按下軟件鍵盤上的的“1”按鍵 /dev/input/event0: EV_ABS ABS_X 00000019
/dev/input/event0: EV_ABS ABS_Y 000001d7
/dev/input/event0: EV_KEY BTN_TOUCH DOWN
/dev/input/event0: EV_SYN SYN_REPORT 00000000
/dev/input/event0: EV_KEY BTN_TOUCH UP
/dev/input/event0: EV_SYN SYN_REPORT 00000000
  • sesese色