欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
基于HOOK和MMF的Windows密碼滲透技術(shù)
摘 要 隨著(zhù)計算機與網(wǎng)絡(luò )的普及,信息安全越來(lái)越成為人們所普遍關(guān)心的大事。密碼的滲透與反滲透在此領(lǐng)域表現的愈演愈烈。本文深入分析了各個(gè)版本Windows密碼的特點(diǎn),尤其是針對windws2K/XP安全性提高的情況下,提出了獲取windows密碼的關(guān)鍵技術(shù)及方法。并進(jìn)一步分析了windows鉤子(Hook)和內存映像文件(MMF)的技術(shù)細節。在基于MMF的核心類(lèi)CIPC中為鉤子句柄在內存中的共享提供了方法,并且解決了線(xiàn)程間的同步問(wèn)題。然后深入討論了WM_COPYDATA消息的特點(diǎn)。接著(zhù)分析了實(shí)例程序重要代碼及注解并演示了結果。最終給出一些反密碼滲透的應對策略。

  關(guān)鍵詞 內存映像文件;windows鉤子;進(jìn)程間通信;多線(xiàn)程

  1、引言

  上世紀90年紀使用過(guò)windows3.x的人可能很少有人了解這類(lèi)操作系統中存在著(zhù)密碼保護的漏洞,如果選擇密碼控件中的“****”文本然后復制到剪貼板上,那么看到的將不是“****”而是密碼的原始文本。微軟發(fā)現了windows3.x這個(gè)問(wèn)題并在新的版本window95中修改了這個(gè)漏洞。但是windows95存在著(zhù)新的安全漏洞,可以設計出間諜程序從當前運行的程序中得到密碼控件中的密碼,這些間諜程序并非是如同softice一樣的破解程序。然而,微軟在window2000中又修補了這個(gè)問(wèn)題,如何通過(guò)MMF與HOOK技術(shù)獲取任何版本windows 密碼控件的內容,這正是本文討論的重點(diǎn)問(wèn)題。

  

  圖1 Windows 2K/XP密碼校驗

  獲取Windows密碼技術(shù)主要是利用了windows的安全漏洞。在Windows NT/95/98/ME等操作系統下,如果在間諜程序中發(fā)送WM_GETTEXT消息到密碼控件,返回的文本將不再是“****”而是實(shí)際的文本內容,而在windows2K/XP系統中微軟加了安全控制,如果發(fā)送WM_GETTEXT到密碼控件,系統將校驗請求的進(jìn)程判斷該進(jìn)程是否有許可權,如圖1所示:如果請求進(jìn)程與密碼控件所在進(jìn)程是同一進(jìn)程,那么WM_GETTEXT消息將仍舊返回密碼的真實(shí)文本。如果兩個(gè)進(jìn)程不一樣,就返回一個(gè)ERROR_Access_DENIED的錯誤。所以獲取windows2K/XP密碼的關(guān)鍵技術(shù)在于:從密碼控件所在的進(jìn)程中獲取WM_GETTEXT消息,而不是在滲透進(jìn)程中得到。而這種在其它進(jìn)程中運行用戶(hù)代碼的技術(shù)完全可以利用windows 鉤子(hook)技術(shù)來(lái)實(shí)現。首先我們需要了解一下什么是鉤子。

  2、Windows鉤子

  Windows系統是建立在事件驅動(dòng)的機制上的,即整個(gè)系統都是通過(guò)消息的傳遞來(lái)實(shí)現的。鉤子(hook)是一種特殊的消息處理機制,鉤子可以監視系統或進(jìn)程中的各種事件消息,截獲發(fā)往目標窗口的消息并進(jìn)行處理。這樣,我們就可以在系統中安裝自定義的鉤子,監視系統中特定事件的發(fā)生,完成特定的功能,比如截獲鍵盤(pán)、鼠標的輸入,屏幕取詞,日志監視等等。鉤子的種類(lèi)很多,每種鉤子可以截獲并處理相應的消息,如鍵盤(pán)鉤子可以截獲鍵盤(pán)消息,外殼鉤子可以截取、啟動(dòng)和關(guān)閉應用程序的消息等。如圖2是一全局鉤子示意圖。

  在實(shí)例程序中運用WH_GETMESSAGE鉤子,這個(gè)鉤子監視投遞到消息隊列中的Windows消息。

  

  圖2 全局鉤子的原理圖

  3、Windows鉤子在此處的應用

  安裝鉤子的函數為SetWindowsHookEx,利用這個(gè)函數可以為整個(gè)系統或為某一特定進(jìn)程安裝鉤子,不同的鉤子監視特定鉤子事件的發(fā)生,當某一事件觸發(fā)后,與之對應的代碼就會(huì )被系統調用。

  運用windows鉤子的一個(gè)難點(diǎn)是如何妥善保存鉤子的句柄。在設置鉤子前需要解決兩件事:

  1) 一個(gè)包括了鉤子函數的動(dòng)態(tài)鏈接庫;

  2) 要注入鉤子的進(jìn)程ID。

  現在假設進(jìn)程A為進(jìn)程B注入了一個(gè)鉤子。鉤子注入后,鉤子的句柄返回給了進(jìn)程A并且動(dòng)態(tài)鏈接庫映射到了進(jìn)程B的地址空間。當進(jìn)程B中觸發(fā)了一個(gè)鉤子事件,鉤子代碼被進(jìn)程B調用(需要特別指出的是,鉤子代碼被一個(gè)遠程進(jìn)程所調用,被調用的鉤子代碼中如果調用GetCurrentProcessId這個(gè)函數,得到的是被注入了鉤子進(jìn)程的進(jìn)程ID,而不是注入進(jìn)程)。在鉤子代碼中通過(guò)發(fā)消息獲取密碼真實(shí)文本,在鉤子代碼結束前需調用CallNextHookEx函數,如果這個(gè)函數調用失敗,安裝的其它鉤子將得不到消息?,F在出現的問(wèn)題是CallNextHookEx需要一個(gè)鉤子的句柄,但那個(gè)所需的句柄已返回給了進(jìn)程A而鉤子程序目前運行在進(jìn)程B的代碼段內。這樣就需要用到進(jìn)程間通信IPC(Inter Process Communication)來(lái)傳遞鉤子句柄。

  4、進(jìn)程間通信的一般方法

  解決以上問(wèn)題的一般方法是在動(dòng)態(tài)鏈接庫中創(chuàng )建一個(gè)“共享”部分,寫(xiě)入如下代碼:

#pragma data_seg(“Shared”)
HHOOK g_hHook = NULL;
#pragma data_seg()
#pragma comment(linker, “/section:Shared,rws”)

  簡(jiǎn)單地說(shuō)這幾行代碼創(chuàng )建了一個(gè)共享的變量,如果5個(gè)進(jìn)程載入這個(gè)動(dòng)態(tài)鏈接庫,5個(gè)進(jìn)程都有訪(fǎng)問(wèn)的權限。但這個(gè)方法有一些問(wèn)題:一是一些編譯器可能并不支持這種方法。二是如果未來(lái)的windows版本發(fā)生了改變,這種方法就行不通。三是這個(gè)方法沒(méi)有規定線(xiàn)程同步,如果有多線(xiàn)程訪(fǎng)問(wèn)這個(gè)變量,線(xiàn)程同步是非常重要的,沒(méi)有線(xiàn)程間的同步可能會(huì )觸發(fā)諸如沖突等一些問(wèn)題。解決這個(gè)問(wèn)題的方法是利用內存映像文件(MMF)。

  5、內存映像文件(MMF)

  在WIN32中,通過(guò)使用映像文件在進(jìn)程間實(shí)現共享文件或內存共享,如果利用相同的映像名字或文件句柄,則不同的進(jìn)程可以通過(guò)一個(gè)指針來(lái)讀寫(xiě)同一個(gè)文件或者同一內存數據塊,并把他們當成該進(jìn)程內存空間的一部分。內存映像文件可以映射一個(gè)文件、一個(gè)文件中的指定區域或者指定的內存塊,其中的數據就可以用內存讀取指令來(lái)直接訪(fǎng)問(wèn),而不用頻繁的使用操作文件的I/O系統函數,從而提高文件的存取速度和效率。

  映像文件的另一個(gè)重要作用就是用來(lái)支持永久命名的共享內存。要在兩個(gè)應用程序之間共享內存,可以在一個(gè)應用程序中創(chuàng )建一個(gè)文件并映射,然后另外一個(gè)程序通過(guò)打開(kāi)和映射此文件,并把它當作自己進(jìn)程的內存來(lái)使用。

  6、建立基于MMF的類(lèi)CIPC

  運用內存映像文件解決進(jìn)程間通信問(wèn)題,并且創(chuàng )建一個(gè)互斥變量來(lái)解決線(xiàn)程的同步問(wèn)題。所有這些封裝在一個(gè)CIPC的類(lèi)中。通過(guò)運用內存映像文件解決了不同編譯器的兼容問(wèn)題,因為使用的都是標準Win32 API。加上MMF支持進(jìn)程間的數據共享,在未來(lái)的windows版本中微軟不會(huì )改變MMF的定義及方法。并且互斥變量保持了線(xiàn)程訪(fǎng)問(wèn)的同步。以下給出CIPC的類(lèi)定義。

class CIPC
{
 public:
  CIPC();
  virtual ~CIPC();
  bool CreateIPCMMF(void);//創(chuàng )建一個(gè)進(jìn)程間通信的MMF
  bool OpenIPCMMF(void);//打開(kāi)一個(gè)進(jìn)程間通信的MMF
  void CloseIPCMMF(void);//關(guān)閉一個(gè)進(jìn)程間通信的MMF
  bool IsOpen(void) const {return (m_hFileMap != NULL);}//判斷MMF是否打開(kāi)
  bool ReadIPCMMF(LPBYTE pBuf, DWORD &dwBufSize);//讀MMF
  bool WriteIPCMMF(const LPBYTE pBuf, const DWORD dwBufSize);//寫(xiě)MMF
  bool Lock(void);//進(jìn)入臨界區,創(chuàng )建互斥信號量
  void Unlock(void);//退出臨界區,撤消互斥信號量
 protected:
  HANDLE m_hFileMap;//MMF文件句柄
  HANDLE m_hMutex;//互斥變量句柄
};

  7、利用WM_COPYDATA消息來(lái)解決進(jìn)程間的通信

  在解決進(jìn)程間的通信問(wèn)題方面,WM_COPYDATA消息是一個(gè)非常好的工具,可以節省程序員的許多時(shí)間。

  當內存映像文件被建立時(shí),系統就發(fā)送消息來(lái)填充它。然后系統再轉回到最初調用SendMessage的進(jìn)程,從共享內存映像文件中將數據復制到所指定的緩沖區中,然后從SendMessage調用返回。

  對于系統已經(jīng)知道的消息,發(fā)送消息時(shí)都可以按相應的方式來(lái)處理。如果要建立自己的(WM_USER+x)消息,并從一個(gè)進(jìn)程向另一個(gè)進(jìn)程的窗口發(fā)送,那又會(huì )怎么樣?系統并不知道用戶(hù)要用內存映像文件并在發(fā)送消息時(shí)改變指針。為此,微軟建立了一個(gè)特殊的窗口消息, WM_COPYDATA以解決這個(gè)問(wèn)題:

COPYDATASTRUCT cds;
SendMessage(hwndReceiver,WM_COPYDATA,(WPARAM)hwndSender,(LPARAM)&cds);
COPYDATASTRUCT是一個(gè)結構,定義在winuser.h文件中,形式如下面的樣子:
Typedef struct tagCOPYDATASTRUCT{
 ULONG_PTR dwData;
 DWORD cbData;
 PVOID lpData;
}COPYDATASTRUCT;


  當一個(gè)進(jìn)程要向另一個(gè)進(jìn)程的窗口發(fā)送一些數據時(shí),必須先初始化COPYDATASTRUCT結構。數據成員dwData是一個(gè)備用的數據項,可以存放任何值。例如,用戶(hù)有可能向另外的進(jìn)程發(fā)送不同類(lèi)型或不同類(lèi)別的數據??梢杂眠@個(gè)數據來(lái)指出要發(fā)送數據的內容。cbData數據成員規定了向另外的進(jìn)程發(fā)送的字節數,lpData數據成員指向要發(fā)送的第一個(gè)字節。lpData所指向的地址,當然在發(fā)送進(jìn)程的地址空間中。

  當SendMessage看到要發(fā)送一個(gè)WM_COPYDATA消息時(shí),它建立一個(gè)內存映像文件,大小是cbData字節,并從發(fā)送進(jìn)程的地址空間中向這個(gè)內存映像文件中復制數據。然后再向目的窗口發(fā)送消息。在接收消息的窗口過(guò)程處理這個(gè)消息時(shí),lParam參數指向已在接收進(jìn)程地址空間的一個(gè)COPYDATASTRUCT結構。這個(gè)結構的lpData成員指向接收進(jìn)程地址空間中的共享內存映像文件的視圖。

8、關(guān)于WM_COPYDATA消息,應該注意三個(gè)重要問(wèn)題

  1)只能發(fā)送這個(gè)消息,不能登記這個(gè)消息。不能登記一個(gè)WM_COPYDATA消息,因為在接收消息的窗口過(guò)程處理完消息之后,系統必須釋放內存映像文件。如果登記這個(gè)消息,系統不知道這個(gè)消息何時(shí)被處理,所以也不能釋放復制的內存塊。

  2)系統從另外的進(jìn)程的地址空間中復制數據要花費一些時(shí)間。所以不應該讓發(fā)送程序中運行的其他線(xiàn)程修改這個(gè)內存塊,直到SendMessage調用返回。

  3)利用WM_COPYDATA消息,可以實(shí)現1 6位和3 2位之間的通信。它也能實(shí)現3 2位與6 4位之間的通信。這是使新程序同舊程序交流的便捷方法。

  9、重要代碼及注解

  9.1鉤子函數void ExtractPassword(const HWND hWnd, const HWND hPwdSpyWnd),該函數是獲取密碼的主要函數

TCHAR szBuffer[256] = {_T('\0')};//分配一個(gè)緩沖區
SendMessage(hWnd,WM_GETTEXT,//向注入鉤子進(jìn)程發(fā)消息獲得密碼文本
sizeof(szBuffer)/sizeof(TCHAR), (LPARAM)szBuffer);//保存在緩沖區中
COPYDATASTRUCT cds = {0};//定義一個(gè)cds結構體
cds.dwData = (DWORD)hWnd;//dwData保存該進(jìn)程句柄
cds.cbData = (lstrlen(szBuffer) + 1) * sizeof (TCHAR); //cbData保存數據長(cháng)度
cds.lpData = szBuffer;//lpData指向緩沖首地址
SendMessage(hPwdSpyWnd,WM_COPYDATA,
 (WPARAM)hWnd, (LPARAM)&cds);//利用WM_COPY DATA消息給獲取密碼進(jìn)程發(fā)送密碼

  9.2鉤子過(guò)程LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam),該過(guò)程主要完成從內存映像文件中讀出保存的鉤子句柄。

if(g_hHook == NULL)
{
 //從共享資源中讀數據,最終獲取鉤子句柄
 DWORD dwData = 0, dwSize = sizeof (DWORD);
 g_obIPC.Lock();//g_obIPC為CIPC對象,進(jìn)入線(xiàn)程的同步
 g_obIPC.OpenIPCMMF();//打開(kāi)MMF文件
 g_obIPC.ReadIPCMMF((LPBYTE)&dwData, dwSize);//讀數據給dwData
 g_obIPC.Unlock();//取消線(xiàn)程同步,退出臨界區
 g_hHook = (HHOOK)dwData;//將讀到的數據賦值給鉤子句柄,本文的關(guān)鍵所在
}

if(nCode >= 0)//忽略小于0的值
{
 HWND hWnd = NULL; //密碼控件所在的窗口句柄
 HWND hPwdSpyWnd = NULL;//獲取密碼進(jìn)程的窗口句柄
 MSG *pMsg = (MSG*)lParam;
 if(pMsg->message == g_wmScanPassword)//是否我們登記的消息
 {
  hWnd = (HWND)pMsg->wParam;
  hPwdSpyWnd = (HWND)pMsg->lParam;
  ExtractPassword(hWnd, hPwdSpyWnd); //通過(guò)發(fā)送消息得到密碼
 }
}

return CallNextHookEx(g_hHook, nCode, wParam, lParam);//返回下一鉤子過(guò)程

  10、演示界面

  如圖3所示:實(shí)例是MFC下基于對話(huà)框的工程。在window XP下,拖動(dòng)圖片控件放大鏡來(lái)檢索密碼控件中的密碼。下面的文本框顯示一些相關(guān)的窗口信息以及密碼文本。

  11、反密碼滲透應對策略

  通過(guò)以上介紹的原理、方法及實(shí)現我們了解了如何得到Windows系列密碼的方法,一個(gè)邏輯的問(wèn)題是如何防止別人利用這樣的間諜程序復制我們的密碼?例如我們上網(wǎng)時(shí)如果被這樣的鉤子程序入侵,怎么才能保護密碼的安全。首選的解決方法是欺騙間諜程序,在用戶(hù)程序中不要顯示真實(shí)的密碼,最好是在密碼控件中顯示一條虛假的密碼。這樣如果有人用以上的程序來(lái)獲取密碼,那他得到的是虛假的密碼而不是真實(shí)密碼。

  當然還有其它的應對策略,一種可行的方法是攔截WM_GETTEXT。但用虛假密碼還有其它的好處,通過(guò)利用虛假密碼代替真密碼,那么看到的密碼控件上***長(cháng)度就不能判斷密碼到底有多長(cháng)。如果一個(gè)程序在其密碼控件中顯示了“***”的文本,我們立即知道密碼只有三個(gè)字符的長(cháng)度,密碼的安全性大大降低。但如果通過(guò)一些加密算法將密碼控件的顯示變?yōu)橐婚L(cháng)串的“*”,這種方法常見(jiàn)于微軟的密碼保護策略。那么密碼攻擊者將無(wú)從下手。

  

  圖3 實(shí)例演示

  12、小結

  本文以評論windows系列的密碼特點(diǎn)為起點(diǎn),主要針對2k/XP下的密碼滲透進(jìn)行了分析。通過(guò)在進(jìn)程內注入windows鉤子以及利用內存映像文件安全傳遞鉤子句柄等技術(shù),找出一條獲取2K/XP中密碼的途徑。但不可否認這都是建立在利用windows安全漏洞的基礎之上的。為了彌補這些安全漏洞,本文在最后也提出一些設想供讀者參考。當然只是在技術(shù)上解決一些問(wèn)題是不夠的,關(guān)鍵還是人的因素,加強保密觀(guān)念對于密碼的保護起到了至關(guān)重要的作用。

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1781695


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
外掛編寫(xiě)完全攻略 -
偷窺桌面程序和IE瀏覽器的密碼編輯框
注入進(jìn)程遠程線(xiàn)程注入與hook注入
VC++ MFC 使用剪切板的方法
子類(lèi)化和超類(lèi)化區別(轉自--眼見(jiàn)為實(shí)(2):介紹Windows的窗口、消息、子類(lèi)化和超類(lèi)化...
一個(gè)exe可執行程序的生與死
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久