直接訪問鍵盤控制晶元獲取鍵盤記錄

2021-05-28 17:00:42 字數 1885 閱讀 4097

鍵盤是使用者和機器之間主要的硬體介面,看看鍵盤上的那些鍵就可知道它有多麼的複雜了。鍵盤是我們隱私的源泉,我們各種資訊的傳遞都要通過它。作為使用者表現 資訊的媒介,很多懷有惡意目的的人都想擷取我們的鍵盤輸入。目前有很多方法可以做到,比如全域性鉤子、getkeyboardstatus()、驅動過濾鉤 子等,但是如果要擷取像qq這種hook鍵盤中斷處理程式的保護技術,這些方法都顯得無能為力。為此,我將為大家介紹一種直接訪問鍵盤控制晶元的方法,來 實現對鍵盤輸入資料的最底層的讀取。

如果我們知道了硬體的輸入輸出位址,就可以直接對它們進行訪問了。鍵盤上有乙個稱為鍵盤編碼器的處理器(intel 8048或相容晶元)專門用來掃瞄收集所有按鍵按下和鬆開的狀態資料(即掃瞄碼)。當乙個鍵被按下時,鍵盤傳送的掃瞄碼稱為接通掃瞄碼(make code),或簡稱為接通碼;當乙個被按下的鍵放開時傳送的掃瞄碼被稱為斷開掃瞄碼(break code),或簡稱為斷開碼。

主機鍵盤控制器專門用來對接收到的鍵盤掃瞄碼進行解碼。因為每個按鍵的接通和斷開碼都是不同的,所以鍵盤控制器根據掃瞄碼就可以確定使用者在操作哪個鍵了。 整個鍵盤上所有按鍵的接通和斷開碼就組成了鍵盤的乙個掃瞄碼集(scan code set)。根據電腦的發展,目前已有三套掃瞄碼集可供使用,它們分別是第一套掃瞄碼集,原始xt鍵盤掃瞄碼集,目前的鍵盤已經很少傳送這類掃瞄碼;第二套 掃瞄碼集,現代鍵盤預設使用的掃瞄碼集,通常稱為at鍵盤掃瞄碼集;第三套掃瞄碼集,ps/2鍵盤掃瞄碼集,原ibm推出ps/2微處理機時使用的掃瞄碼 集,已很少使用。

at鍵盤預設傳送的是第二套掃瞄碼集。雖然如此,主機鍵盤控制器為了與pc/xt機的軟體相容起見,仍然會把所有接收到的第二套鍵盤掃瞄碼轉換成第一套掃 描碼,因此,我們從鍵盤控制器獲取的通常為第一套掃瞄碼集。

當乙個鍵被按下時,我們可以從鍵盤控制器接收到乙個xt鍵盤接通碼。這個掃瞄碼僅表示鍵盤上某個位置處的鍵被按下,但還沒有對應到某個字元**上,接通碼 通常都是乙個位組寬度。例如,按下鍵「a」的接通碼是30(0x1e)。當乙個按下的鍵被鬆開時,從鍵盤控制器埠收到的就是乙個斷開碼。對於xt鍵盤 (即鍵盤控制器程式設計埠收到的掃瞄碼),斷開碼是其接通碼加上0x80。例如,上述「a」 鍵的斷開碼就是「0x80 + 0x1e = 0x9e」。

表1列出了scan code set 1中的所有掃瞄碼,我們寫程式時需要用到!

} //鍵按下產生make code,鍵放開產生break code,make code最高位為0。keycode使用make code作為索引列印按鍵

if(!(retdata&0x80))                //有鍵被按下

//有鍵放開!retdata第7位為1!我們使用make code記錄鍵值,make code第7位為0!

if(retdata&0x80) }

sleep(50);

} }

因為程式是從最底層獲取鍵盤掃瞄碼資料的,所以對於使用ps/2鍵盤的使用者,可以擷取到他們在任何安全保護情況下的輸入資訊,包括qq nprotect技術的安全控制項、支付寶安全控制項、網上銀行安全控制項等。鑑於巨大危害性,我這裡只提供了演示程式,效果如圖2和圖3所示。

圖2

圖3

至於其他更詳細的應用,大家可以在我提供的程式的基礎上進行擴充。只要我們能夠直接訪問鍵盤控制晶元,那麼任它再有效的輸入保護措施,對我們來說都是如同 虛設,想要什麼密碼就可以獲得什麼密碼。

Objective C 屬性訪問or直接訪問?

當定義了乙個屬性的時候,例如 property nonatomic,strong uiimageview imageview 有兩種訪問方法self.imageview imageview,屬性訪問和直接訪問有幾個區別 1直接訪問不用經過 方法派發 速度上有一定的優勢 2直接訪問,繞過了 記憶體管理...

從主頁直接訪問

最成功的乙個設計策略是在主頁上放置一些鏈結,這樣使用者能夠直接到達少數非常重要的功能。無論你將資訊結構組織得如何好,也不管你在導航系統中對它的表示是如何的透明,如果使用者必須經過多級的導航才能夠到達所需的功能,他們仍可能會迷失方向或者失去耐心。主頁上的直接鏈結為它提供了捷徑並簡化了這個任務。不幸的是...

Nginx直接訪問redis,lua訪問redis

直接去wget就可以 這個需要重新編譯nginx,然後把這個模組加上。下面大概說一下編譯nginx 和加這個模組可能會遇到的問題。首先如果你電腦上有nginx 那麼你要寫 使用nginx v 檢視一下當前的模組,把這些模組全部拷貝在乙個位置上。configure prefix 然後上面拷貝的全加上,...