2014-12-02 32 views
10

簡介:我想在Android安全性上創建一個POC,它需要確定是否有任何KeyLogger在Android設備上運行。如果它正在運行或安裝在設備上,那麼請在我的Android應用程序中禁用它。Android密鑰記錄器

查詢:

1)這是可能創造Android的鍵盤記錄器,其截獲鍵盤事件,並在後臺作爲服務運行?

2)這是否有可能確定是否有任何後臺進程處理鍵盤事件?

3.)我可以通過我的應用程序代碼來阻止任何其他後臺服務(不屬於我)嗎?

請幫助我與適當的鏈接,如果你有。

+0

您是否找到答案? – 2016-10-21 10:19:39

+0

是的,我已經更新了我的發現作爲一個接受的答案,請通過它。 – 2016-10-22 07:33:15

回答

3

經過一整天的研究,我達到了以下結論。

Android不允許您攔截來自後臺服務的默認軟鍵盤輸入。攔截這些事件的唯一方法是自定義鍵盤。

我如下總結吧:

在Android的鍵盤記錄鍵盤事件的後臺服務不支持。是某些鏈接如下:

點1:谷歌Android開發者

軟輸入法都可以使用輸入文本的多重性和創造性的方式,也不能保證一個軟鍵盤上的任意按鍵會產生一個關鍵事件:這由IME決定,事實上發送這樣的事件是不鼓勵的。您絕不應該依賴於在軟輸入方法中接收KeyEvents的任何鍵。特別是,默認的軟件鍵盤永遠不會將任何關鍵事件發送到任何目標爲Jelly Bean或更高版本的應用程序,並且只會將一些按下刪除和返回鍵的事件發送到目標爲冰淇淋三明治或更早版本的應用程序。

http://developer.android.com/reference/android/view/KeyEvent.html

的Android果凍豆是:4.1到4.3.1 的Android冰淇淋三明治:4.0

軟輸入法主要印刷機不需要觸發這個監聽器的方法,並且實際上不鼓勵這樣做。默認的安卓鍵盤不會觸發任何鎖定Jelly Bean或更高版本的應用程序的任何鍵,並且只會將它用於一些按鍵,用於定位冰淇淋三明治或更早版本的應用程序。

http://developer.android.com/reference/android/text/method/KeyListener.html

點2:堆棧溢出 的KeyEvents只能由活動,因爲它們是按鍵和接口給用戶的處理,只有當它們是在前景中。即使在後臺運行的服務也不打算對用戶輸入做出反應。

Android - Listener for hard keys press at background

Is it possible to create an Android Service that listens for hardware key presses?

3點:羅曼蓋伊 羅曼蓋伊(https://stackoverflow.com/users/298575/romain-guy)誰對谷歌的作品也證實了這一點 onKeyDown in a service? (Global Hot Keys)

點4:其他一些參考:

谷歌Android開發人員組:https://groups.google.com/forum/#!topic/android-developers/o--GUWmqXdI

它只能通過使用自定義的鍵盤進行:get pressed key and throw another key in android

,請發表您的評論,如果你認爲我已經錯過了什麼。

+0

非常感謝你的這份文件。我正在調查類似的東西,並想知道我是否可以迴避你的問題?不知道我的電子郵件是否顯示在我的個人資料中,但如果您願意,請發送電子郵件至cgmckeever ... gmail。謝謝! – cgmckeever 2015-01-03 20:14:07

+0

請參閱'Type machine'應用程序。據你說,如果這個ID不可能,那麼它是如何工作的? – 2016-10-22 09:29:21

+0

現在我沒有太多時間來看看。這是我2年前發現的結果。您可以查看該應用,然後發佈您的觀看次數。 – 2016-10-22 09:42:54

12

我知道這個問題已經有一個公認的答案,但我不同意接受的答案!
這可以通過可訪問性API在android中完成。
在下面的程序看看:

Type Machine

它使用的可訪問性的API,並正確保存你在任何應用程序,它本質上是一個鍵盤記錄器做什麼類型的每個擊鍵!
編輯:我不完全確定TypeMachine使用什麼,但你應該能夠從無障礙服務using this method獲得文本。 例如,以下代碼可用於獲取新文本:

void onViewTextChanged(AccessibilityEvent accessibilityEvent, AccessibilityNodeInfo accessibilityNodeInfo) { 
    List text = accessibilityEvent.getText(); 
    CharSequence latestText = (CharSequence) text.get(0); 
    Log.i(MY_TAG, latestText.toString()); 
} 
+1

加1提到類型的機器,但如何實現這一點?任何代碼示例? – 2016-10-21 10:19:13

+0

@ 14bce109:我現在編輯了我的答案以包含示例代碼。 – ananth 2016-10-23 15:06:12