用Detours截取Windows程式密碼

來源:互聯網
上載者:User

一、引言
 
隨著資訊技術的快速發展,人們會越來越重視資訊的安全性,資訊資料的安全保密已經成為研究電腦發展的一個重要課題。在其它識別技術尚不能普及情況下,密碼常常被使用者用作保護他們寶貴資料的最後一道屏障,然而有了密碼,使用者也不能高枕無憂,因為現在有很多的工具可以窮舉和竊取使用者密碼,下面通過Detours簡單介紹一下截取密碼的基本原理,以此提醒使用者密碼要定期更換,而且其它相關的安全保衛措施同樣不可忽視。
 
 
二、基本原理
 
在Windows編程中,人們普遍使用密碼編輯框,來提示使用者使用密碼,密碼編輯框除了回顯字元之外,與一般的編輯框框控制項並沒有任何區別。通過調用GetWindowText和GetDlgItemText函數,或者向該密碼編輯框視窗發送WM_GETTEXT訊息,使用者很容易獲得這些輸入的密碼字元,這可以通過Visual Studio提供的SPY++工具來驗證。如果使用者為了圖省事,讓系統記住這些密碼,免去每次登入時密碼輸入,這將會使他們陷入更加危險的境地,因為現在有許多類似於Reveal的小程式,可以獲得滑鼠所指之處的密碼,它們基本上都是通過向密碼編輯框發送WM_GETTEXT訊息實現的。即便不讓系統儲存密碼,使用者也不能大意,因為就在你輸入程式的背後,可能隱藏著 這麼一個惡意的程式,它會記錄你輸入的任何字元,並神不知鬼不覺地把它記錄到一個檔案中。
 
這樣的程式一般都是通過鉤子函數或者API HOOK實現的。因為使用者輸入完密碼之後,還要提交給應用程式來驗證,並以此確定他們是否為合法使用者。這時候,應用程式往往會調用上述函數或者發送WM_GETTEXT訊息,獲得使用者輸入的密碼文本。如果有這麼一個程式,能夠截獲這些API函數調用或者截獲這些視窗訊息,那麼它就會在密碼到達應用程式之前先期截獲這些密碼。
 
這些程式一般都會在系統啟動時,自動運行,然後安裝系統鉤子,截獲GetWindowText或GetDlgItemText函數,或者截獲Windows訊息(如WM_DESTROY),並向密碼及其兄弟視窗發送WM_GETTEXT訊息,即可獲得包括使用者名稱在內的全部文本,儲存到檔案之後,然後把控制權交給系統。這樣的程式一般都有 局限性,因為它必須開機自動運行後,才會起作用,因此通過修改註冊編輯表,很容易發現它們的蹤跡,並把它們清除到系統之外。而且在安全模式下,這些程式除非你主動運行它,否則它永遠不會被啟用。 注意這裡的運行並非一定要你用滑鼠去雙擊一個應用程式,如果你雙擊的檔案是一個TXT文字檔(或者BMP、HTML等檔案),而這些檔案預設開啟程式已被修改為駭客程式,這種情況下資料檔案成了導火索,它們同樣也會啟用駭客程式。
 
還有一種程式是以DLL形式寄生在可執行檔之上(譬如記事本Notepad、畫筆Mspaint)_),這往往需要一個安裝程式,負責修改可執行檔,使得可執行檔運行時能夠自動載入這些(木馬程式)動態連結程式庫,刪除這些動態連結程式庫,則會導致可執行檔無法運行。這種情況下,除非你重新安裝應用程式, 否則你無法甩掉跟在你程式背後的鬼影。
 
三、具體實現
 
1.動態連結程式庫的注入
 
動態連結程式庫是WIN32系統的一個重要組成部分,它能夠動態地裝入到進程的地址空間, 動態連結程式庫一旦注入到應用程式的進程空間,就會成為應用程式的運行中的一部分,和應用程式代碼一起運行。由於有些進程壓根就沒有用到某些動態連結程式庫,包括它的輸出資料和輸出函數。可以說這些應用程式和動態連結程式庫之間沒有任何“血緣關係”,應用程式也從來不會去主動地載入這些動態連結程式庫,因此,我們必須編寫代碼實現DLL庫的注入。把動態連結程式庫注入到另外一個進程。最經典的做法是,在DLL中安裝一個鉤子函數,這樣系統會幫我們把它注入到每一個受該鉤子函數影響的進程之中。
 
鉤子函數的安裝往往需要一個安裝程式,負責調用SetWindowsHookEx函數,然而如果我們每次使用鉤子函數時都運行安裝程式,那將是非常麻煩,對於一個木馬程式來說,很容易暴露自己,因此我們希望我們的動態串連庫能夠寄生在一個可執行檔之上,一旦這個應用程式執行時,它就會在進程初始化階段(DLL_PROCESS_ATTACH),安裝鉤子函數,這樣應用程式甚至系統的視窗訊息都會處於鉤子函數的監控之下,鉤子函數的鉤子過程會負責截獲有用的訊息,並作相應的處理。
 
微軟公司提供的Detours工具包(http://www.research.microsoft.com/sn/detours),剛好能夠滿足我們這個要求。Detours除了提供了一組API攔截的函數之外,還提供了一組函數能夠很容易地實現DLL的注入,利用這組函數,我們既可以建立一個注入了DLL的新進程,也可以把DLL注入到一個已經啟動並執行進程,更重要的是,它還能夠修改應用程式的檔案頭,在檔案頭中加入DLL的資訊,這樣應用程式修改後不用任何幹預,它自身就能負責完成動態連結程式庫的載入。
 
2.Detours注入動態連結程式庫
 
 
我們知道win32應用程式都採用win 32二進位PE格式儲存,PE是一個COFF擴充(Common Object File Format)。一個win32二進位檔案是由下面幾部分組成的,一個DOS 相容頭、一個PE頭、 一個包含程式碼的文本段、一個包含初始化資料的資料區段、一個列舉引用DLL 和函數名的引入表、一個列舉代碼和輸出符號的輸出表,除了兩個頭結構之外,其餘部分都是可選的,在某些win32檔案中可能某些部分不存在。
 
 
 
 
為了修改win 32 二進位代碼,Detours 又在輸出表和偵錯符號部分中間建立了一個新的.Detours段(如所示)(註:偵錯符號部分必須位於win32 二進值檔案的最後),這個新的.Detours段包含了一個Detours頭記錄和一個原來PE頭的副本。如果要修改輸入表的話,Detours就會建立一個新的輸入表,並把它添加到複製的PE 標頭中,然後修改原始的PE頭結構,使其指向新的輸入表。最後,Detours把使用者的Payloads(負載)追加到. Detours段的尾部,然後在檔案尾部添加偵錯符號資訊。由於Detours備份了原始的PE頭,所以這個過程完全可逆,以便能夠去除.Detours段,恢複exe檔案到未注入前的樣子。
 
建立一個新的輸入表有兩個目的,一個目的是它能夠儲存原來的輸入表,以便需要時恢複對原來檔案的修改;另一個目的是,新的輸入表可以包含重新命名的動態串連庫和函數,還可以包含新的動態串連庫和函數.
 
Detours既提供了一組編輯輸入表,添加、枚舉、去除Payloads(負載),再綁定二進位的函數,也提供了一組枚舉映射地址空間的二進位檔案、定位對應檔Payloads(負載)的函數。每一個Payload(負載)均由一個GUID (a 128- bit globally unque identifier全球唯一識別碼)標識。
 
這些函數的使用讀者可以參考Detours提供的例子程式SetDll.cpp檔案。
 
3.訊息攔截
 
一旦動態連結程式庫注入到應用程式後,它就會在進程初始化階段完成鉤子函數的安裝,這裡我們安裝了兩種鉤子類型,WH_GETMESSAGE和WH_CALLWNDPROC,鉤子函數的處理過程主要對WM_SETFOCUS和WM_DESTROY訊息進行攔截,對前一個訊息,先通過獲得其類名(GetClassName函數)和視窗風格(GetWindowLong函數),判斷它是否是一個密碼編輯框(注意VisualC++、Delphi、Visual Basic編輯框的類名都不一樣)。如果是,則把它本身視窗及其兄弟視窗、父視窗的視窗控制代碼儲存到一個數組中,一旦系統向視窗WM_DESTROY訊息時,訊息被鉤子函數截獲,鉤子處理過程會向儲存到數組中的每一個視窗控制代碼發送WM_GETTEXT,獲得對話方塊標題或各個編輯框的文本。
 
四、程式的使用
 
本程式是在Windows 2000環境下用Visual C++ 6.0調試通過的,在Windows98環境下也可以運行。使用時,先運行DllPatch.Exe程式,然後瀏覽到有密碼的應用程式,確認後,DllPath程式會給目標應用程式建立一個備份檔案,然後修改應用程式,並把InetPub.Dll檔案拷貝到目標應用程式目錄和Windows系統目錄。這時你可以利用View Dependency 工具開啟應用程式檔案,你會發現它裡面又多引用了一個名叫InetPub.Dll的動態連結程式庫.密碼截獲後,木馬程式會把密碼檔案存放在臨時檔案目錄下的一個副檔名為tmp的檔案中,為了便於說明,該檔案的內容沒有加密,同時Windows系統目錄的Kernel32.ini檔案也儲存了有關密碼的一些資訊。真正的駭客程式可能就不會這麼做,因為這很容易暴露自己,而且它還會修改InetPub.dll檔案的日期與應用程式一致。也許你會說,我馬上更改密碼,你截獲的密碼照樣進不去,殊不知就在你更改密碼的同時,更改後的新密碼也被記錄下來。
 
通過這個程式,我們可以看到僅僅依靠密碼來保證系統的安全是遠遠不夠的。
點擊這裡下載來源程式和示範程式。
DETOURS :
http://www.research.microsoft.com/sn/detours
http://research.microsoft.com/sn/detours

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.