摘 要 隨著計算機與網(wǎng)絡(luò)的普及,信息安全越來越成為人們所普遍關(guān)心的大事。密碼的滲透與反滲透在此領(lǐng)域表現(xiàn)的愈演愈烈。本文深入分析了各個版本windows密碼的特點,尤其是針對windws2K/XP安全性提高的情況下,提出了獲取windows密碼的關(guān)鍵技術(shù)及方法。
并進一步分析了windows鉤子(Hook)和內(nèi)存映像文件(MMF)的技術(shù)細節(jié)。在基于MMF的核心類CIPC中為鉤子句柄在內(nèi)存中的共享提供了方法,并且解決了線程間的同步問題。然后深入討論了WM_COPYDATA消息的特點。接著分析了實例程序重要代碼及注解并演示了結(jié)果。最終給出一些反密碼滲透的應(yīng)對策略。
關(guān)鍵詞 內(nèi)存映像文件;windows鉤子;進程間通信;多線程
1、引言
上世紀90年紀使用過windows3.x的人可能很少有人了解這類操作系統(tǒng)中存在著密碼保護的漏洞,如果選擇密碼控件中的“****”文本然后復(fù)制到剪貼板上,那么看到的將不是“****”而是密碼的原始文本。微軟發(fā)現(xiàn)了windows3.x這個問題并在新的版本window95中修改了這個漏洞。但是windows95存在著新的安全漏洞,可以設(shè)計出間諜程序從當(dāng)前運行的程序中得到密碼控件中的密碼,這些間諜程序并非是如同softice一樣的*程序。然而,微軟在window2000中又修補了這個問題,如何通過MMF與HOOK技術(shù)獲取任何版本windows 密碼控件的內(nèi)容,這正是本文討論的重點問題。
圖1 Windows 2K/XP密碼校驗
獲取Windows密碼技術(shù)主要是利用了windows的安全漏洞。在windows NT/95/98/ME等操作系統(tǒng)下,如果在間諜程序中發(fā)送WM_GETTEXT消息到密碼控件,返回的文本將不再是“****”而是實際的文本內(nèi)容,而在windows2K/XP系統(tǒng)中微軟加了安全控制,如果發(fā)送WM_GETTEXT到密碼控件,系統(tǒng)將校驗請求的進程判斷該進程是否有許可權(quán),如圖1所示:如果請求進程與密碼控件所在進程是同一進程,那么WM_GETTEXT消息將仍舊返回密碼的真實文本。如果兩個進程不一樣,就返回一個ERROR_ACCESS_DENIED的錯誤。所以獲取windows2K/XP密碼的關(guān)鍵技術(shù)在于:從密碼控件所在的進程中獲取WM_GETTEXT消息,而不是在滲透進程中得到。而這種在其它進程中運行用戶代碼的技術(shù)完全可以利用windows 鉤子(hook)技術(shù)來實現(xiàn)。首先我們需要了解一下什么是鉤子。
2、Windows鉤子
Windows系統(tǒng)是建立在事件驅(qū)動的機制上的,即整個系統(tǒng)都是通過消息的傳遞來實現(xiàn)的。鉤子(hook)是一種特殊的消息處理機制,鉤子可以監(jiān)視系統(tǒng)或進程中的各種事件消息,截獲發(fā)往目標(biāo)窗口的消息并進行處理。這樣,我們就可以在系統(tǒng)中安裝自定義的鉤子,監(jiān)視系統(tǒng)中特定事件的發(fā)生,完成特定的功能,比如截獲鍵盤、鼠標(biāo)的輸入,屏幕取詞,日志監(jiān)視等等。鉤子的種類很多,每種鉤子可以截獲并處理相應(yīng)的消息,如鍵盤鉤子可以截獲鍵盤消息,外殼鉤子可以截取、啟動和關(guān)閉應(yīng)用程序的消息等。如圖2是一全局鉤子示意圖。
在實例程序中運用WH_GETMESSAGE鉤子,這個鉤子監(jiān)視投遞到消息隊列中的Windows消息。
圖2 全局鉤子的原理圖
3、Windows鉤子在此處的應(yīng)用
安裝鉤子的函數(shù)為SetWindowsHookEx,利用這個函數(shù)可以為整個系統(tǒng)或為某一特定進程安裝鉤子,不同的鉤子監(jiān)視特定鉤子事件的發(fā)生,當(dāng)某一事件觸發(fā)后,與之對應(yīng)的代碼就會被系統(tǒng)調(diào)用
并進一步分析了windows鉤子(Hook)和內(nèi)存映像文件(MMF)的技術(shù)細節(jié)。在基于MMF的核心類CIPC中為鉤子句柄在內(nèi)存中的共享提供了方法,并且解決了線程間的同步問題。然后深入討論了WM_COPYDATA消息的特點。接著分析了實例程序重要代碼及注解并演示了結(jié)果。最終給出一些反密碼滲透的應(yīng)對策略。
關(guān)鍵詞 內(nèi)存映像文件;windows鉤子;進程間通信;多線程
1、引言
上世紀90年紀使用過windows3.x的人可能很少有人了解這類操作系統(tǒng)中存在著密碼保護的漏洞,如果選擇密碼控件中的“****”文本然后復(fù)制到剪貼板上,那么看到的將不是“****”而是密碼的原始文本。微軟發(fā)現(xiàn)了windows3.x這個問題并在新的版本window95中修改了這個漏洞。但是windows95存在著新的安全漏洞,可以設(shè)計出間諜程序從當(dāng)前運行的程序中得到密碼控件中的密碼,這些間諜程序并非是如同softice一樣的*程序。然而,微軟在window2000中又修補了這個問題,如何通過MMF與HOOK技術(shù)獲取任何版本windows 密碼控件的內(nèi)容,這正是本文討論的重點問題。
圖1 Windows 2K/XP密碼校驗
獲取Windows密碼技術(shù)主要是利用了windows的安全漏洞。在windows NT/95/98/ME等操作系統(tǒng)下,如果在間諜程序中發(fā)送WM_GETTEXT消息到密碼控件,返回的文本將不再是“****”而是實際的文本內(nèi)容,而在windows2K/XP系統(tǒng)中微軟加了安全控制,如果發(fā)送WM_GETTEXT到密碼控件,系統(tǒng)將校驗請求的進程判斷該進程是否有許可權(quán),如圖1所示:如果請求進程與密碼控件所在進程是同一進程,那么WM_GETTEXT消息將仍舊返回密碼的真實文本。如果兩個進程不一樣,就返回一個ERROR_ACCESS_DENIED的錯誤。所以獲取windows2K/XP密碼的關(guān)鍵技術(shù)在于:從密碼控件所在的進程中獲取WM_GETTEXT消息,而不是在滲透進程中得到。而這種在其它進程中運行用戶代碼的技術(shù)完全可以利用windows 鉤子(hook)技術(shù)來實現(xiàn)。首先我們需要了解一下什么是鉤子。
2、Windows鉤子
Windows系統(tǒng)是建立在事件驅(qū)動的機制上的,即整個系統(tǒng)都是通過消息的傳遞來實現(xiàn)的。鉤子(hook)是一種特殊的消息處理機制,鉤子可以監(jiān)視系統(tǒng)或進程中的各種事件消息,截獲發(fā)往目標(biāo)窗口的消息并進行處理。這樣,我們就可以在系統(tǒng)中安裝自定義的鉤子,監(jiān)視系統(tǒng)中特定事件的發(fā)生,完成特定的功能,比如截獲鍵盤、鼠標(biāo)的輸入,屏幕取詞,日志監(jiān)視等等。鉤子的種類很多,每種鉤子可以截獲并處理相應(yīng)的消息,如鍵盤鉤子可以截獲鍵盤消息,外殼鉤子可以截取、啟動和關(guān)閉應(yīng)用程序的消息等。如圖2是一全局鉤子示意圖。
在實例程序中運用WH_GETMESSAGE鉤子,這個鉤子監(jiān)視投遞到消息隊列中的Windows消息。
圖2 全局鉤子的原理圖
3、Windows鉤子在此處的應(yīng)用
安裝鉤子的函數(shù)為SetWindowsHookEx,利用這個函數(shù)可以為整個系統(tǒng)或為某一特定進程安裝鉤子,不同的鉤子監(jiān)視特定鉤子事件的發(fā)生,當(dāng)某一事件觸發(fā)后,與之對應(yīng)的代碼就會被系統(tǒng)調(diào)用