程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 簡單過QQ的nProtect鍵盤加密保護

簡單過QQ的nProtect鍵盤加密保護

編輯:.NET實例教程

誰都知道nProtect是驅動層的鍵盤加密保護,
但是這個nProtect也不是時刻接管著我們的鍵盤,僅僅在用戶輸入密碼的時候才真正啟動,
而程序是如何獲知用戶開始輸入密碼了呢?
用簡單的Windows編程方法就能想到,就是處理WM_SETFOCUS消息,
一旦某控件獲得焦點Windows就會發送WM_SETFOCUS到那個hwnd,
而一旦那個控件失去焦點的時候,nProtect需要關閉,否則就影響到用戶的其他輸入動作了,很明顯這就是處理WM_KILLFOCUS消息。

所以,當你發現某控件獲得焦點的時候,你可以無恥的冒充Windows發送WM_KILLFOCUS消息,這樣nProtect就自動退出保護啦~~~
當然會有其他問題,就是那個Edit控件接收到WM_KILLFOCUS後一閃一閃的光標也停掉了,這個問題有興趣的自行解決~~~~~

或者用其他的思路,比如你的程序直接冒充QQ向它的驅動發送退出保護的消息?這需要調試他的程序來了解是發送什麼消息,
我曾把他的內存中的那個消息的值給patch了然後發送個WM_KILLFOCUS叫它退出保護,然後再發送個WM_SETFOCUS,讓那個控件又呈現正常的輸入狀態。
可是它獲得WM_SETFOCUS消息後想向驅動發送開啟保護的消息已經讓我patch了,於是保護一直沒啟動。

以上是很早前我測試過的,

寫這個代碼的時候還記得個有趣的貓膩~~~~
郁悶我獲得的密碼框控件句柄總是不正確,可明明就一個可視的具有密碼風格的edit控件啊~~~~~
原來,還有個透明的。何苦呢~~~

在獲得正確的密碼控件句柄後下面這點代碼讀取密碼效果還不錯
asterisk = (char)SendMessage(hPassWindow, EM_GETPASSWordCHAR, 0, 0);

PostMessage(hPassWindow, EM_SETPASSWordCHAR, 0, 0);
SendMessage(hPassWindow, WM_GETTEXT, sizeof(szPass), (LPARAM)szPass);
PostMessage(hPassWindow, EM_SETPASSWordCHAR, asterisk, 0);

由於計算機速度太快了,人眼發現不到異常

......

在QQ2007剛出來時我又好奇的測試了下,發現patch掉開啟保護的消息後仍然還捕捉不到正常的按鍵信息,我高興的以為是加強了nProtect了呢,

其實不是,可能他是覺得應該再保險點,再加個WH_KEYBOARD_LL鉤子,這個是Windows的低級鍵盤鉤子,
當QQ的密碼框獲得焦點的時候nProtect如果沒啟動的話,那麼按鍵的消息就會給鉤子攔截,
貌似QQ獲得正確按鍵信息後就用sendinput模擬下按鍵事件,而這個按鍵的代碼是假的,專門糊弄別的應用程序。

知道這個之後還不簡單?
我們給SetWindowsHookEx也Hook一個就行啦。

而且這個Hook還真好hook,這API M$就是准備給人hook的,
大概就是 hotpatch吧,只是win2000下SetWindowsHookEx的首條指令卻沒有像mov edi,edi的,
但是SetWindowsHookExA和SetWindowsHookExW最終調用的那個內部函數卻有,雖不是mov edi,edi,但mov eax,eax也一樣~~~
而且定位這個函數還很容易呢~~~

就這樣,驅動層的保護在應用層就完全搞定了,

如果用戶電腦沒安裝那些較合格的主動防御軟件的話,那麼QQ這個國際領先的密碼保護就似乎形同虛設了~~~

ps: 據說beta3不是那麼回事了~~~

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved