編輯:Android資訊
鍵盤監控,顧名思義是在應用軟件在運行時,用戶在設備上的一舉一動都將被詳細記錄下來,更多的實在使用者毫無覺察的情況下將屏幕內容以圖片的形式、按鍵內容以文本文檔的形式保存在指定的文件夾或發送到指定的郵箱。鍵盤監控,包括物理按鍵與軟鍵盤的監控,通常監控的事件有:點擊,長按,滑動等,這些時間在Android上表現出來的都是一系列的KeyEvent。
為了實現鍵盤的監控,從新開發一個輸入法是不現實的,一般的操作就是在系統的輸入法機制中添加接口回調。我們知道,再應用程序中拿到按鍵的回調一般是監聽onKeyDown的接口,如下所示:
public boolean onKeyDown(int keyCode, KeyEvent event)
開發者就可以根據回調方法中的參數, keyCode與KeyEvent來判斷具體事件。但是,由於事件的回調機制在其的沙箱中運行,在其他應用中是無法拿到當前應用事件回調的。
那麼我們就從上到下,具體的看看事件的傳遞機制。如下圖所示,用戶點擊後,軟鍵盤或物理按鍵的輸入驅動就會產生一個中斷,且向/dev/input/event*中寫入一個相應的信號量。Android操作系統則會循環的讀取其中的事件,再分發給WindowManagerServer。由WindowManagerServer根據事件的來源分發到各個不同的ViewGroup與View中,從而產生不同的OnClick、OnKeyDown和OnTouch等事件。
這個時候很自然的想到,黑客們希望做鍵盤監控,一定會向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後,我們能夠看到設備中的一些列輸入硬件驅動信息,同樣下面會出現很多輸入指令信號,通常情況下,這些信號量都在刷屏,如下圖所示:
這些信號量的表示我們無法直接看懂,輸入getevent –l加入Label我們能夠看到一些添加的標簽,如下所示:
其實這些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)
一般來說,常用的是EV_KEY、EV_REL、EV_ABS、EV_SYN,分別對應鍵盤按鍵、相對坐標、絕對坐標、同步事件。EV_SYN則表示一組完整事件已經完成,需要處理,EV_SYN的code定義事件分發的類型。
在觸摸事件上的幾個常見的Label說明如下表所示:
了解了這些Label的含義我們再看看信號量就簡單多了,如我們列舉幾個常見的事件與信號,如下表所示:
從上表中,我們發現要是按下的是物理按鍵,其輸入出來的信息我們很容易讀懂,如果按下的是軟鍵盤中的按鍵,給出的信號信息就是一些位置坐標信息。我們無法直接讀懂,當然,我們可以根據這些位置坐標信息,再拿到Android設備的屏幕尺寸,計算比例也能夠直接獲得按鍵的具體內容。
當然,輸出條件不會是想我們表格中的這麼規范,中間會夾雜則各式各樣的信息,有些可能是你不關心的。這裡我們把一些無關的信號量過濾去掉了。實際查看上對應信息條件比較多,大家可以將Android設備連接如自己的電腦進行調試,這裡我們就不做一一的解釋了。
所以,為了安全起見,很多對於輸入安全要求比較高的應用軟件,除了自定義輸入法進行安全輸入以外,還需要將鍵盤上的各個字母數字位置隨機打亂,防止黑客們在截獲了位置信息後進行按鍵計算。這個也就是我們常在一些軟件中看到打亂的鍵盤原因,打亂鍵盤效果如下圖所示:
getevent是一個系統級命令,需要在Root情況下才可以使用。這裡我們對getevent作為闡述,的主要目的就是告訴大家,在Root後的Android設備中,我們可以使用對Linux底層信號做讀取的方式,對設備進行鍵盤監控。當然,更可以使用sendevent命令,模擬發送事件,這裡我們不做闡述了。
本文將通過一個例子,簡單介紹了Android中通過FragmentManager來管理fragments的方法和代碼,其核心是調用Activity中的getFra
1. 模式介紹 模式的定義 定義對象間一種一對多的依賴關系,使得每當一個對象改變狀態,則所有依賴於它的對象都會得到通知並被自動更新。 模式的使用場景 關聯行為場
本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃! 專業的Android app開發人員會關注一些成熟的項目管理技術,
前言 為了進行代碼及產品保護,幾乎所有的非開源App都會進行代碼混淆。這樣,當收集到崩潰信息後,就需要進行符號化來還原代碼信息,以便開發者可以定 位Bug。基於使