• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 8  文章 - 26  trackbacks - 0
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(5)

            隨筆檔案

            文章分類

            文章檔案

            相冊(cè)

            C++語(yǔ)言

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            前兩天在學(xué)校做的一個(gè)小設(shè)計(jì)的論文,隨手發(fā)上來(lái),小弟不才,錯(cuò)誤之處還請(qǐng)各位大牛多多指點(diǎn)
            如果大家還有什么鍵盤(pán)記錄的方法和防御的方法一定一定要告訴小弟我啊。

             /*****************************************************************************************/

            鍵盤(pán)作為計(jì)算機(jī)的主要輸入設(shè)備,是大部分輸入信息的主要來(lái)源,但是我們每天從鍵盤(pán)輸入的信息安全嗎?隨著互聯(lián)網(wǎng)的普及,各種網(wǎng)絡(luò)應(yīng)用也是層出不窮,電子購(gòu)物,網(wǎng)上聊天等等等等,每天我們都會(huì)在各種程序上輸入各式各樣得分密碼啊用戶名啊銀行卡號(hào)啊,你認(rèn)為這些秘密安全嗎?那位同學(xué)要說(shuō)了:沒(méi)事啊,不都是有保護(hù)措施嗎,像什么QQ的號(hào)稱無(wú)懈可擊的nprotect技術(shù),網(wǎng)銀也有各種安全插件,沒(méi)事的!” “呵呵,真的像他們說(shuō)的那摩安全嗎,那可不一定,沒(méi)有什么是絕對(duì)的,下面我們就來(lái)看看鍵盤(pán)的秘密,看看黑客們是如何記錄你的鍵盤(pán)操作的,以及我們?cè)撊绾蔚钟@些猥瑣的攻擊方式。

             

            .鍵盤(pán)的硬件模型

            其實(shí)鍵盤(pán)應(yīng)該算是計(jì)算機(jī)中最簡(jiǎn)單的設(shè)備了,在我們使用的普通的計(jì)算機(jī)系統(tǒng)中,與鍵盤(pán)有關(guān)的硬件說(shuō)白了也就是兩個(gè)芯片,i8048i8042 i8042也就是intel8042,位于主板上,CPU通過(guò)IO端口與i8042通信,i8042負(fù)責(zé)讀取鍵盤(pán)按鍵的掃描嗎或是發(fā)送個(gè)中鍵盤(pán)命令.i8048,它是位于鍵盤(pán)中的,是將鍵盤(pán)上的按鍵轉(zhuǎn)換成所謂的掃描碼的,然后傳送給i8042。呵呵,就是這末簡(jiǎn)單個(gè)東西。上面說(shuō)的都是比較老的計(jì)算機(jī)的結(jié)構(gòu)了,現(xiàn)在這些芯片都集成到南橋芯片組里面去了,不過(guò)原理還是這樣的。

            當(dāng)我們按下一個(gè)鍵與抬起的時(shí)候都會(huì)觸發(fā)鍵盤(pán)的中斷,在老早的計(jì)算機(jī)中都是采用兩片i8259A芯片級(jí)聯(lián)來(lái)管理中斷的,鍵盤(pán)掛在主片的IRQ1引腳上,當(dāng)有按鍵按下或抬起是會(huì)引發(fā)硬件中斷,然后會(huì)調(diào)用相應(yīng)的中斷處理程序進(jìn)行處理.

            在實(shí)模式與保護(hù)模式下對(duì)于中斷的處理是不同的。在實(shí)模式下我就不說(shuō)了,也記不的了,自己看看微機(jī)原理。在保護(hù)模式下是采用IDT對(duì)中斷進(jìn)行管理的,在IDT中是各種各樣的門(mén)啊,啥中斷門(mén),陷阱門(mén),調(diào)用門(mén)啊等等等等,對(duì)于鍵盤(pán)中斷在XP下對(duì)應(yīng)的是0X31號(hào)中斷服務(wù),但也有的XP對(duì)應(yīng)的事0x93,原因我也不太明白,反正在我的系統(tǒng)上是0x31號(hào)。

            好了既然都已經(jīng)都調(diào)用中斷處理程序了,那么在經(jīng)過(guò)一系列復(fù)雜的處理最終我們就可以在應(yīng)用層上舒舒服服的用WORD打字了。

            好了,硬件這塊就說(shuō)到這,下面用到了相關(guān)的我們?cè)谡f(shuō)。

             

            .猥瑣的鍵盤(pán)記錄器

            對(duì)于那些盜號(hào)的所謂的黑客我是很不齒的,這里我們要探討一些竊取鍵盤(pán)信息的方法并不是圍了寫(xiě)個(gè)鍵盤(pán)記錄的盜號(hào)程序,我們只是站在攻防對(duì)立統(tǒng)一的角度來(lái)看各式盜號(hào)手段,并給出相關(guān)的防御措施.

            我知道的一些盜號(hào)的手段也不多,而且都是一些比較普遍的手法,有些也都是爺爺輩的技術(shù)了,不過(guò)現(xiàn)在還是很好用,好多盜號(hào)的還是用這些土槍土炮打打打打劫

            WINDOWS系統(tǒng)是分為應(yīng)用層與內(nèi)核層的,從CPU的角度看就是RING3RING0。應(yīng)用層是受管制的,不可進(jìn)行端口IO,不可執(zhí)行特權(quán)指令,限制多多。內(nèi)核就不說(shuō)了,想干嘛就干吧。

             

            我也是按照應(yīng)用層與內(nèi)核兩個(gè)層面進(jìn)行討論的。好了廢話太多了,進(jìn)入正題吧.

             

            1.爺爺輩的WM_GETTEXT消息獲取密碼

             

            用過(guò)MFC的都知道密碼框吧,就那個(gè)******的框子,他其實(shí)是個(gè)文本框只不過(guò)是加了密碼屬性而已,本質(zhì)上還是文本框。對(duì)于文本框我們就可以通過(guò)對(duì)其發(fā)送WM_GETTEXT消息來(lái)獲取密碼的。不過(guò)還有點(diǎn)問(wèn)題,在WIN98系列中這樣就OK了,但是NT后,你要就是對(duì)著密碼框大喊WM_GETTEXT是沒(méi)用的,密碼框會(huì)說(shuō):“你又不是我們家里的,我憑啥把密碼告你啊“.其實(shí)這是跟操作系統(tǒng)有關(guān)的,在WIN98下所用的進(jìn)程是共享一個(gè)4GB的虛擬內(nèi)存的,那個(gè)就沒(méi)什么你的我的了,所有的都是大家共有的,所以一個(gè)進(jìn)程對(duì)另一個(gè)進(jìn)程發(fā)送一個(gè)WM_GETEXT消息,應(yīng)為大家都是自己人所以密碼就告你了。但是到了NT后各個(gè)進(jìn)程就鬧分家了,每個(gè)進(jìn)程獨(dú)享4GB的虛擬內(nèi)存,各個(gè)進(jìn)程之間是互相隔離的,所以就沒(méi)人理你了。

            我們要采用些特殊的手段才能成功。也就是要把你的那段發(fā)送WM_GETTEXT消息的代碼移到目標(biāo)進(jìn)程中去執(zhí)行,方法還是有的,我使用的遠(yuǎn)程線程技術(shù),也就是將一個(gè)功能模塊諸如到目標(biāo)進(jìn)程中然后執(zhí)行,這樣就OK了。對(duì)于如何進(jìn)行線程注入,方法很多,google一下就可以了。

            原理就是這樣很簡(jiǎn)單,問(wèn)題就在怎樣在目標(biāo)進(jìn)程中去執(zhí)行代碼,這種方法就說(shuō)到這把。

             

             

            2.屠夫的鉤子

             

            呵呵,玩過(guò)dota嗎,對(duì)就是屠夫用的鉤子,在windows中同樣有鉤子,而且也是相當(dāng)?shù)南?/span>

            使用鉤子相當(dāng)?shù)暮?jiǎn)單,就一個(gè)API函數(shù) SetWindowsHookEx,不過(guò)內(nèi)涵很豐富,在windows下存在各式各樣的鉤子,消息鉤子,鼠標(biāo)鉤子,鍵盤(pán)鉤子,日志鉤子,等等,具體的看看MSDN,這些鉤子各有各的用途,對(duì)于黑客們來(lái)說(shuō)主要會(huì)用到消息鉤子,鍵盤(pán)鉤子與日志鉤子,這些鉤子都可以用來(lái)監(jiān)控鍵盤(pán),下面分別來(lái)說(shuō).

             

            (1)往日黃花鍵盤(pán)鉤子

            不要迷戀哥,哥只是個(gè)傳說(shuō)。

                                                     ------一腦殘兒童說(shuō)

            鍵盤(pán)鉤子在當(dāng)年可是相當(dāng)?shù)妮x煌,在那個(gè)Rootkit還不是很盛行的年代,各種盜號(hào)軟件

            幾乎總是和他聯(lián)系在一起的,只不過(guò)這幾年由于所謂的主動(dòng)防御殺軟的出現(xiàn),這種技術(shù)才慢慢的消失.

            鍵盤(pán)鉤子分為全局鉤子與局部鉤子。鍵盤(pán)鉤子安裝之后可以截獲所進(jìn)程的鍵盤(pán)信息。局部鉤子只可以截獲安裝線程的鍵盤(pán)信息。既然要盜號(hào)嗎,當(dāng)然是IC卡,IQ卡統(tǒng)統(tǒng)告訴我密碼,要大面積撒網(wǎng),就要安裝全局鉤子。

            鍵盤(pán)鉤子也分為兩種:普通的鍵盤(pán)鉤子與低級(jí)鍵盤(pán)鉤子。對(duì)于這兩種鉤子的區(qū)別我自己在編程中總結(jié)的是:低級(jí)鍵盤(pán)鉤子可以截獲一些系統(tǒng)按鍵,比如Windows健,但是普通的就不行了。我曾經(jīng)寫(xiě)了個(gè)玩Dota時(shí)屏蔽Windows健的用的是低級(jí)鉤子,普通的不行.如果只是攔截個(gè)一般的按鍵兩種鉤子無(wú)所謂了.

            具體的編程很簡(jiǎn)單:調(diào)用SetWindwosHookEx函數(shù),參數(shù)就填入 WH_KEYBORAD(普通鉤子)或者WH_KEYBOARD_LL(低級(jí)鉤子),然后寫(xiě)個(gè)鉤子的回調(diào)函數(shù),在回調(diào)函數(shù)里面就可以獲取按鍵的虛擬鍵碼了,在講虛擬鍵碼經(jīng)過(guò)處理就得到我們想要的了.

            再提一點(diǎn)就是關(guān)于SHIFT鍵狀態(tài)與CapsNum狀態(tài)的檢測(cè),只要調(diào)用GetKeyState函數(shù)就可以了,具體的不說(shuō)了,自己看MSDN吧。

             

             

            2)竹林蹊徑日志鉤子

             

            日志鉤子是用來(lái)攔截輸入到系統(tǒng)消息隊(duì)列中的輸入消息的鉤子,鍵盤(pán)消息既然屬于輸入消息,那就勾住吧。

            用法也是so easy,調(diào)用SetWindwosHookEx函數(shù)傳遞WH_JOURNALRECORD參數(shù)給他,在他的回調(diào)函數(shù)里面有個(gè)指向EVENTMSG的指針,結(jié)構(gòu)如下:

            typedef struct {

                UINT message;

                UINT paramL;

                UINT paramH;

                DWORD time;

                HWND hwnd;

            } EVENTMSG, *PEVENTMSG;

            我們只攔截message ==WM_KEYDOWN的消息,就是按鍵按下的消息啦,然后paramL&0x000000FF的值就是虛擬鍵碼,剩下的和鍵盤(pán)鉤子就一樣了,不說(shuō)了,下一節(jié)吧。

             

            3)完美的世界---中英文記錄的消息鉤子

             

            到目前為止我們記錄到得都只是些 abc123這些的字母數(shù)字,那位小朋友要說(shuō)了,我要知道他在網(wǎng)上的聊天內(nèi)容,行嗎?消息鉤子就站出來(lái)了,”no problem,記錄中文俺拿手啊

            消息鉤子,見(jiàn)名知意,肯定是用來(lái)過(guò)濾消息的。我們先來(lái)了解一個(gè)概念”IME””.

             IME 是輸入法編輯器(Input Method Editor) 的英文縮寫(xiě)(IME),它是一種專門(mén)的應(yīng)用程序,用來(lái)輸入代表東亞地區(qū)書(shū)面語(yǔ)言文字的不同字符。

            說(shuō)白了,我們平時(shí)輸入漢字時(shí)其實(shí)都是跟這個(gè)IME打交道的。IME也是會(huì)發(fā)出很多的消息的,如

            WM_IME_CHAR                    WM_IME_COMPOSITION

            WM_IME_COMPOSITIONFULL       WM_IME_CONTROL

            WM_IME_ENDCOMPOSITION        WM_IME_KEYDOWN

            WM_IME_KEYUP                   WM_IME_NOTIFY

            WM_IME_REQUEST                 WM_IME_SELECT

            WM_IME_SETCONTEXT             WM_IME_STARTCOMPOSITION

             

            我們現(xiàn)在主要關(guān)心一個(gè)消息WM_IME_COMPOSITION,就是當(dāng)要拼出一個(gè)字的時(shí)候會(huì)發(fā)出這個(gè)消息.,并且副參數(shù)為GCS_RESULTSTR的時(shí)候,就說(shuō)明輸入完了,可以將拼出的句子讀出來(lái)了,這就得到了漢字了.,下面為參考代碼:

             

            /* this code from ZWELL 獲得輸入法處理后的字符串 */

            if(pmsg->message==WM_IME_COMPOSITION){

                           DWORD dwSize;

                           char lpstr[128];

                           if(pmsg->lParam & GCS_RESULTSTR){

                                  //先獲取當(dāng)前正在輸入的窗口的輸入法句柄

                                  hIMC = ImmGetContext(hWnd);

                                  if(!hIMC) return 0;

                                  // 先將ImmGetCompositionString的獲取長(zhǎng)度設(shè)為0來(lái)獲取字符串大小.

                                  dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);

                                  // 緩沖區(qū)大小要加上字符串的NULL結(jié)束符大小,

                                  // 考慮到UNICODE

                                  dwSize += sizeof(WCHAR);

                                  memset(lpstr, 0, sizeof(lpstr));

                                  // 再調(diào)用一次.ImmGetCompositionString獲取字符串

                                  ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize);

                                  //現(xiàn)在lpstr里面即是輸入的漢字了。你可以處理lpstr,當(dāng)然也可以保存為文件...

                                  //MessageBox(NULL, lpstr, lpstr, MB_OK);

             

             

            其實(shí)在輸入漢字的時(shí)候也是會(huì)發(fā)出WM_CHARWM_KEYDOWN這些消息的,只不過(guò)WM_CHAR的參數(shù)與輸入英文是是不同的。漢字的輸入實(shí)際上是兩個(gè)WM_CHAR,用內(nèi)碼就可以判斷是否輸入的是否是漢字字符。如果是,漢字兩個(gè)字節(jié)的最高位都是1,連續(xù)兩次判斷就可以做到。即每次的CHAR字符的最高位是否是1,如果是,記住這個(gè)字符,然后當(dāng)下CHAR字符來(lái)到是,如果最高位還是1,就可以將這兩個(gè)字符合成漢字。這樣就可以記錄一個(gè)漢字了。

            至于WM_KEYDOWN可以用來(lái)記錄非ASCII的按鍵,像F1—F12TABENTER等等。

            這樣就是中英文完美的鍵盤(pán)記錄了.

             

             

            (4)用泥巴胡個(gè)墻吧.---應(yīng)用層的抗擊

             

            應(yīng)用層鍵盤(pán)記錄的小伎倆就說(shuō)這幾種吧(呵呵,俺也就會(huì)這幾種),既然要攻防統(tǒng)一,那我們就來(lái)談?wù)勅绾蝸?lái)防御吧。在應(yīng)用層防御個(gè)人感覺(jué)很是雞肋的,實(shí)現(xiàn)也很是麻煩,效果也不好,不過(guò)還是說(shuō)說(shuō)吧,

            首先說(shuō)說(shuō)全局鍵盤(pán)鉤子吧,全局鍵盤(pán)鉤子是不能獨(dú)立存在的,他必須附加一個(gè)動(dòng)態(tài)鏈接庫(kù)文件,因?yàn)槿帚^子是要監(jiān)控所有的進(jìn)程的,所以這個(gè)模塊就要注入到其他的進(jìn)程的地址空間中去,所以要寫(xiě)一個(gè)單獨(dú)的模塊。

            我們知道在Windows下加載一個(gè)模塊時(shí)使用的APILoadLibrary函數(shù),這個(gè)函數(shù)內(nèi)部又會(huì)調(diào)用LoadLibraryEx函數(shù),windows底層是UINCODE的,所以應(yīng)該調(diào)用的是LoadLibraryExW。如果我們寫(xiě)的正常程序,如果調(diào)用了LoadLibrary那摩LoadLibraryExW函數(shù)的返回地址應(yīng)該位于Kernel32.dll中,或者我們就是直接調(diào)用了LoadLibraryExW那摩返回地址應(yīng)該位于我們的程序中。但是如果是被裝了鉤子后,當(dāng)你按下一個(gè)健后,系統(tǒng)會(huì)下按鍵焦點(diǎn)程序的地址空間中加載黑客寫(xiě)的鍵盤(pán)記錄模塊,調(diào)用的是LoadLibraryExW,那摩這個(gè)函數(shù)的返回地址就不是以上的兩種情況了,經(jīng)我是實(shí)驗(yàn)是位于user32.dll中。哈哈,根據(jù)這一點(diǎn)我們就可以判斷一個(gè)模塊是否為非法加載模塊了.

            原理就是這樣啦。具體的實(shí)現(xiàn)要用到APIHook技術(shù)了。在《Windwos核心編程》中有簡(jiǎn)紹的。可以HOOKIAT也可以InLineHook,我用的是InLineHokk,在自己寫(xiě)的HOOk函數(shù)中首先獲取[ESP]的值,這個(gè)就是返回值了,具體為什么應(yīng)該都明白吧,不明白就找本匯編書(shū)好好補(bǔ)補(bǔ)吧。那摩就拿這個(gè)返回值去比較就可以了。簡(jiǎn)單吧。。

            當(dāng)然對(duì)于HOOKAPI你也可以用微軟的那個(gè)Hook庫(kù),那就更簡(jiǎn)單了。

             

            只能檢測(cè)是不夠的,太被動(dòng)了,我們應(yīng)該主動(dòng)出擊。

            Windows下的鉤子邏輯上是一個(gè)鏈狀的,一個(gè)系統(tǒng)中可以安裝很多的鉤子,這些鉤子會(huì)形成一個(gè)鉤子鏈,先裝的鉤子在最前頭,前面的鉤子通過(guò)調(diào)用CallNextHookEx函數(shù)將信息傳給后面的鉤子,如不不調(diào)用這個(gè)函數(shù)那摩鏈子就斷了,后面的鉤子永遠(yuǎn)互惠獲取信息。

            好了,聰明的你一定想到了。對(duì),我們不往下傳遞信息,我們自己處理,讓下面的鉤子瞪著眼著急去吧。

            具體做法為:我們?cè)谖覀兊某绦蛑醒b上局部鉤子,在局部鉤子的回調(diào)函數(shù)中我們截獲按鍵消息,我們自己存起來(lái),然后再給密碼框發(fā)個(gè)假消息,比如按下了A健,我們用我們的局部鉤子截獲了A健消息,我們保存起來(lái),然后我們給密碼框發(fā)個(gè)假消息,,就說(shuō)我們接受到了個(gè)B健,然后讓不調(diào)用那個(gè)CallNextHookEx函數(shù),而是直接返回1,這樣下面的鉤子就game over .

             

            好了,應(yīng)用層的鍵盤(pán)監(jiān)控與反監(jiān)控就說(shuō)這些吧,由于殺毒軟件的發(fā)展,特別是所謂的牛X主動(dòng)防御的出現(xiàn),這些都已進(jìn)了歷史的垃圾堆了,現(xiàn)在是RootKit的時(shí)代,打劫也要講與時(shí)俱進(jìn),下面我們就來(lái)看看ring0下的鍵盤(pán)記錄的手段吧。

             

            3.新的戰(zhàn)場(chǎng),新的戰(zhàn)斗—rootkit的瘋狂

             

            人都是屬驢的,不打不逼是不會(huì)走的.

                                             ----------俺的一位老師說(shuō)的

            ring3下猥瑣黑客們的安逸被被殺軟打破了,生存還是死亡。當(dāng)然是要生存下去了,怎沒(méi)辦?”TMD,反了,我們要和殺軟對(duì)著干。游戲規(guī)則被改變了。。黑客軟件不在是只做老鼠被殺軟這只大貓到處攆這跑,老鼠要吃貓啦。

             

            4.中規(guī)中矩----鍵盤(pán)過(guò)濾驅(qū)動(dòng)

             

            既然到了內(nèi)核的領(lǐng)地,那我們就來(lái)看看在內(nèi)核中是如何處理按鍵消息的,我們從按下一個(gè)健到我們?cè)?/span>WORD看到這個(gè)字母,究竟發(fā)生了什么,下面是網(wǎng)上說(shuō)的:

             

            /*引用自: http://hi.baidu.com/buzztiger/blog/item/a851712b3739c924d52af170.html */

             

            寫(xiě)過(guò)windows程序的人都知道,win32程序是基于消息驅(qū)動(dòng)的,其中就有鍵盤(pán)消息,這個(gè)消息其實(shí)是csrss.exe這個(gè)進(jìn)程發(fā)送給應(yīng)用程序的,而在應(yīng)用程序中我們可以使用setWindowsHook的方法來(lái)獲得鍵盤(pán)消息,從而實(shí)現(xiàn)改鍵啊,捕捉用戶按鍵內(nèi)容。那么csrss.exe這個(gè)進(jìn)程的鍵盤(pán)消息是怎么來(lái)的呢?原來(lái)csrss.exe中有個(gè)win32!RawInputThread這個(gè)線程,這個(gè)線程通過(guò)一個(gè)GUID,即GUID_CLASS_KEYBOARDDEFINE_GUID(GUID_CLASS_KEYBOARD, 0x884b96c3, 0x56ef, 0x11d1, 0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd)來(lái)獲得鍵盤(pán)設(shè)備棧中PDO的符號(hào)鏈接名。win32!RawInputThread執(zhí)行到win32k!openDevice,調(diào)用zwCreateFile打開(kāi)設(shè)備,然后調(diào)用zwReadFile與鍵盤(pán)驅(qū)動(dòng)通信了。它會(huì)創(chuàng)建一個(gè)IRP_MJREADIRP發(fā)送給鍵盤(pán)驅(qū)動(dòng),而鍵盤(pán)驅(qū)動(dòng)通常使這個(gè)IRP Pending,這樣它就會(huì)一直被放在那里等待,等來(lái)來(lái)自鍵盤(pán)的數(shù)據(jù),即win32!RawInputThread這個(gè)線程也會(huì)一直等待,等待這個(gè)讀操作的完成。當(dāng)鍵盤(pán)有鍵按下時(shí)這個(gè)IRP將會(huì)完成,win32!RawInputThread將對(duì)得到的數(shù)據(jù)進(jìn)行處理,分發(fā)給合適的進(jìn)程(通常是獲得焦點(diǎn)的進(jìn)程)這時(shí)win32!RawInputThread又會(huì)立即再調(diào)用nt!ZwReadFile要求讀入數(shù)據(jù),又開(kāi)始了下一個(gè)等待,周而復(fù)始

             

            /*引用結(jié)束*/

             

            鍵盤(pán)的驅(qū)動(dòng)棧從上到下依次為:kbdclass.sys---ài8042port.sys---àacpi.sys

            其中kbdclass.sys為鍵盤(pán)的類驅(qū)動(dòng),不管是PS/2鍵盤(pán)還是USB鍵盤(pán)都要通過(guò)這一層驅(qū)動(dòng),所以在這一層進(jìn)行過(guò)濾可以有和好的兼容性。

            I8042port.sysPS/2鍵盤(pán)的端口驅(qū)動(dòng),這個(gè)只對(duì)PS/2鍵盤(pán)好用,USB鍵盤(pán)他管不了的。

            對(duì)于鍵盤(pán)的過(guò)濾驅(qū)動(dòng),我選擇是在kbdclass.sys進(jìn)行過(guò)濾.

            具體做法:

            1.使用ObReferenceObjectByName獲取”\\Driver\\Kbdclass”所對(duì)應(yīng)的驅(qū)動(dòng)對(duì)象。

            2.枚舉這個(gè)驅(qū)動(dòng)對(duì)象下的所有設(shè)備,并創(chuàng)建一個(gè)過(guò)濾設(shè)備附加上去.

            3.主要處理IRP_MJ_READ這個(gè)IRP。首先設(shè)置一個(gè)完成函數(shù),然后向下轉(zhuǎn)發(fā)此IRP

            4.在完成函數(shù)中就可以獲取此次的案件的掃描碼了。

            5.對(duì)于IRP_MJ_POWER, IRP_MJ_PNP也要進(jìn)行處理.

             

            呵呵,很簡(jiǎn)單吧,驅(qū)動(dòng)入門(mén)級(jí)的Hello Wolrd

             

            5.乾坤大挪移----HOOKIDT與操縱APIC

             

            在前面我們講到在按下一個(gè)鍵與抬起的時(shí)候會(huì)觸發(fā)一個(gè)硬件中斷,XP下,操作系統(tǒng)回去調(diào)用 0x310x93中斷處理程序區(qū)處理。那么我們可不可以自己寫(xiě)一個(gè)ISR去接管鍵盤(pán)中斷呢,?當(dāng)然,別忘了,我們是在內(nèi)核中現(xiàn)在,我們無(wú)所不能

            我們知道在保護(hù)模式下是采用IDT進(jìn)行中斷管理的,IDT是有許多門(mén)組成的。每個(gè)悶得結(jié)構(gòu)如下:

            typedef struct IDTEntry

            {

            HB_U16 LowOffset ;//偏移的低16

            HB_U16 Selector ;//選擇子

            HB_U8 Count:5; //參數(shù)的雙字計(jì)數(shù)

            HB_U8 Reserve:3 ;//保留為0

            HB_U8 Type:4 ;//類型

            HB_U8 DT0:1; //DT=0,系統(tǒng)段描述符

            HB_U8 DPL:2; //DLP

            HB_U8 P:1; //P

            HB_U16 HightOffset;//偏移的高16

            }IDTEntry,*PIDTEntry;

            其中LowoffsetHighOffset就構(gòu)成了實(shí)際的中斷處理程序的地址.。我們?nèi)绻约簩?xiě)一個(gè)中斷處理程序,然后修改LowoffsetHighOffset,讓其指向我們自己的寫(xiě)的那個(gè)函數(shù)不久可以了嗎..

            在我們自己的鍵盤(pán)中斷處理函數(shù)中我們可以直接將數(shù)據(jù)從i8042的端口讀出,存儲(chǔ)起來(lái),然后再調(diào)用原先的系統(tǒng)默認(rèn)的函數(shù),這樣就神不知鬼不覺(jué)的達(dá)到的不可告人的目的.

             

            還有一種方法使用的手段于此相似,也是替換,不過(guò)這次是將鍵盤(pán)的IRQ1中斷的處理函數(shù)的中斷向量更改,不在是指向0x31或是0x93了,而是指向另一個(gè)向量.這個(gè)向量包含我們自己的處理程序.,這就是APIC機(jī)制.。不過(guò)我的這個(gè)破筆記本比較老了,沒(méi)有這個(gè)機(jī)制,

            所以只能紙上談兵了.,還是先簡(jiǎn)紹一下APIC.

            APIC是可以用于多個(gè)核心的CPU的新型中斷控制器,APIC的作用相當(dāng)于當(dāng)一個(gè)IRQ發(fā)生時(shí),這個(gè)硬件決定將IRQ發(fā)個(gè)呢個(gè)CPU核心,以及一何種形式發(fā)送等。APIC是可編程的,也可以將PS/2鍵盤(pán)的硬件中斷請(qǐng)求發(fā)給某個(gè)CPU核心,讓該核心的IDT中的某個(gè)中斷號(hào)對(duì)應(yīng)的中斷服務(wù)程序來(lái)處理.

            WindowsAPIC的系列寄存器映射到了地址0xFEC000000xFEC00010的位置。

            也就是說(shuō)我們可以通過(guò)編程來(lái)進(jìn)行中斷的重定位,具體操作看著APIC的說(shuō)明添添數(shù)據(jù)就可以了,其實(shí)和HOOKIDT一樣的。就不多說(shuō)了.

             

             

            6.返璞歸真輪詢i8042

             

            有時(shí)候其實(shí)一個(gè)問(wèn)題的解決方法并不是月復(fù)雜就越強(qiáng)悍,有時(shí)候簡(jiǎn)單的土的掉渣的技術(shù)反而是最穩(wěn)固的

            輪詢,這種古老的技術(shù),雖然由于效率低下已經(jīng)早已被淘汰,但是我們需要的正是這個(gè)。

            鍵盤(pán)是可以通過(guò)編程關(guān)閉中斷的,但是當(dāng)我們按下一個(gè)健的時(shí)候,鍵盤(pán)的輸出緩沖區(qū)中仍然會(huì)有掃描碼填充,只是中斷關(guān)閉了,操作系統(tǒng)并不知道。

            我們的做法是:首先關(guān)閉鍵盤(pán)的中斷,然后通過(guò)輪詢的方法讀取輸出端口的案件掃描碼,自己進(jìn)行一些處理,然后打開(kāi)鍵盤(pán)中斷,再將此按鍵重放,這樣操作系統(tǒng)會(huì)獲取這個(gè)按鍵,然后在關(guān)閉中斷,一直這樣循環(huán)下去。

             

            原理就是這樣,簡(jiǎn)單也很可靠,我最終的密碼保護(hù)就是采用這個(gè)方案的。

             

            我的程序分了三個(gè)層次:

            因?yàn)樵?/span>Ring3下無(wú)法讀寫(xiě)端口的,所以自己寫(xiě)了個(gè)驅(qū)動(dòng),負(fù)責(zé)讀寫(xiě)端口,RING3上載寫(xiě)個(gè)DLL通過(guò)DeviceIoControl與內(nèi)核進(jìn)行通信,傳遞端口地址與設(shè)置的值等信息,并對(duì)上面的應(yīng)用程序提供簡(jiǎn)單的如READ_PORT(ULONG port),這樣的接口。

             

            在應(yīng)用程序中,在要保護(hù)的密碼框獲取焦點(diǎn)時(shí)(處理WM_SETFOCUS消息),則關(guān)閉鍵盤(pán)中斷進(jìn)行輪詢,在市區(qū)焦點(diǎn)時(shí)則打開(kāi)鍵盤(pán)中斷.在獲取按鍵后你可以在程序中記錄下來(lái),再在密碼框中填充個(gè)假的密碼。

            由于是不間斷的輪詢所以保證在第一時(shí)間獲取掃描碼,在上層的如過(guò)濾驅(qū)動(dòng),HOOKIDT

            還有應(yīng)用層得到鉤子啥的,統(tǒng)統(tǒng)失效,實(shí)踐證明還是很可靠的,只不過(guò)還不是很完善,目前只支持PS/2鍵盤(pán),USB的還不行.

             

             

            7.我們都OUT----硬件鍵盤(pán)記錄器

             

            日防夜防,家賊難防啊,要是硬件上做了手腳,那就這能55555555555……

            看看這個(gè)猥瑣的家伙吧高科技哦


             

             

            好了,該結(jié)尾了,呵呵,現(xiàn)在你還信你的鍵盤(pán)嗎?

            posted on 2009-12-22 13:56 楊彬彬 閱讀(4979) 評(píng)論(8)  編輯 收藏 引用

            FeedBack:
            # re: 安全密碼框的設(shè)計(jì) 2009-12-22 16:04 zwp
            土了吧。。。
            應(yīng)用層還有一個(gè)強(qiáng)大raw input可以獲取鍵盤(pán)、鼠標(biāo)、HID等設(shè)備的輸入信息呢。這可是比上面的消息鉤子還要底層一點(diǎn)的。  回復(fù)  更多評(píng)論
              
            # re: 安全密碼框的設(shè)計(jì) 2009-12-22 18:59 楊彬彬
            謝啦這位大哥,我再看看@zwp
              回復(fù)  更多評(píng)論
              
            # re: 安全密碼框的設(shè)計(jì) 2009-12-22 21:52 tanchuhan
            good,樓主寫(xiě)的很好。

            挑點(diǎn)小錯(cuò)誤:
            其實(shí)這是跟操作系統(tǒng)有關(guān)的,在WIN98下所用的進(jìn)程是共享一個(gè)4GB的虛擬內(nèi)存的,那個(gè)就沒(méi)什么你的我的了,所有的都是大家共有的,所以一個(gè)進(jìn)程對(duì)另一個(gè)進(jìn)程發(fā)送一個(gè)WM_GETEXT消息,應(yīng)為大家都是自己人所以密碼就告你了。但是到了NT后各個(gè)進(jìn)程就鬧分家了,每個(gè)進(jìn)程獨(dú)享4GB的虛擬內(nèi)存,各個(gè)進(jìn)程之間是互相隔離的,所以就沒(méi)人理你了。
            ---------------
            Win95/98和NT都是一樣的進(jìn)程有各自的4G尋址空間(其中前面的1G/2G被系統(tǒng)保留,用來(lái)裝載系統(tǒng)DLL什么的)
            WM_GETTEXT可以跨進(jìn)程獲取文本是微軟為了向后(win3x)兼容而作出特別處理的。照常理WM_GETTEXT的lParam非本進(jìn)程指針,直接寫(xiě)數(shù)據(jù)會(huì)崩潰。而微軟檢查到這條消息后特別處理,先在本進(jìn)程new一段緩沖區(qū),等WM_GETTEXT接收者寫(xiě)完后,再?gòu)?fù)制回發(fā)送者進(jìn)程的那段緩沖區(qū)。然后返回結(jié)果。
            win9x和NT密碼框?qū)M_GETTEXT的不同反應(yīng)是因?yàn)楹笳呖紤]了安全性,而特意禁止的。
            所以這和虛擬內(nèi)存是否共享無(wú)關(guān)。

              回復(fù)  更多評(píng)論
              
            # re: 安全密碼框的設(shè)計(jì) 2009-12-23 09:01 遠(yuǎn)古毛利人
            寫(xiě)得太帥了,很不錯(cuò)的說(shuō)  回復(fù)  更多評(píng)論
              
            # re: 安全密碼框的設(shè)計(jì) 2009-12-24 16:08 李佳
            文章不錯(cuò) 目前主流的都是 過(guò)濾驅(qū)動(dòng) 修改IDT 至于后面兩種 確實(shí)對(duì)我來(lái)說(shuō)比較有新意~不錯(cuò) 謝謝博主  回復(fù)  更多評(píng)論
              
            # re: 安全密碼框的設(shè)計(jì) 2009-12-24 16:35 Hero
            很犀利  回復(fù)  更多評(píng)論
              
            # re: 安全密碼框的設(shè)計(jì) 2010-11-26 11:11 徐胖子
            底層鉤子和普通鉤子的區(qū)別遠(yuǎn)不只此,他們的層次是完全不一樣的。。
            WH_KEYBOARD_LL比WH_KEYBOARD先觸發(fā),WH_KEYBOARD_LL 是由系統(tǒng)調(diào)用回調(diào)函數(shù),而WH_KEYBOARD則是鉤的進(jìn)程來(lái)調(diào)用回調(diào)函數(shù)。這就意味著,WH_KEYBOARD要插入進(jìn)程,如果是全局鉤子,就會(huì)插入每一個(gè)進(jìn)程,WH_KEYBOARD_LL不需要插入進(jìn)程,所以據(jù)說(shuō)根本不需要放在dll里面,放在exe里面也能運(yùn)行。

            raw input 也是一種常見(jiàn)的截獲鍵盤(pán)信息的方法,但并不比低級(jí)鉤子更底層。我試過(guò),在低級(jí)鉤子屏蔽后,raw input將無(wú)法獲得鍵盤(pán)信息。

            信息安全學(xué)生,從樓主此文中受益匪淺,呵呵 ,希望能進(jìn)一步請(qǐng)教、討論。
            郵箱xu_pang@163.com希望看到后能聯(lián)系。  回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久久91人妻无码精品蜜桃HD| 亚洲国产精品无码久久久久久曰 | 一级a性色生活片久久无少妇一级婬片免费放 | 精品999久久久久久中文字幕| 久久亚洲国产午夜精品理论片| 精品水蜜桃久久久久久久| 国产精品一区二区久久精品涩爱| 国内精品久久久久久久97牛牛| 久久www免费人成看国产片| 伊人久久大香线蕉亚洲五月天| 天天综合久久久网| 亚洲国产精品无码成人片久久| 成人亚洲欧美久久久久| 久久久噜噜噜www成人网| 日本加勒比久久精品| 91精品国产综合久久久久久| 性做久久久久久久久久久| 久久精品草草草| 久久Av无码精品人妻系列| 怡红院日本一道日本久久 | 久久人妻少妇嫩草AV无码专区| 国产精品狼人久久久久影院| 无码人妻久久一区二区三区免费| 久久久WWW成人免费毛片| 国产精品久久精品| 久久精品www人人爽人人| 亚洲国产精品嫩草影院久久 | 26uuu久久五月天| 国产Av激情久久无码天堂| 久久久久av无码免费网| 国产一区二区精品久久凹凸| 色成年激情久久综合| 青青青国产成人久久111网站| 婷婷伊人久久大香线蕉AV| 国产精品久久久香蕉| 久久精品国产99国产精品| 精品人妻伦九区久久AAA片69 | 久久中文字幕人妻熟av女| 无码任你躁久久久久久老妇| 久久国产精品偷99| 久久婷婷五月综合成人D啪|