史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   資訊系統安全備援防護技術文件 (http://forum.slime.com.tw/f139.html)
-   -   非法探取密碼的原理及其防範 (http://forum.slime.com.tw/thread173088.html)

psac 2006-04-22 07:23 PM

非法探取密碼的原理及其防範
 
一、非法獲取Password的原理:

Edit控件是Windows的一個標準控件,當把其Password內容設為True時,就會將輸入的內容遮閉為星號,從而達到保護的目的。雖然我們看來都是星號,但程序中的Edit控件實際仍是用戶輸入的密碼,應用程式可以獲取該控件中的密碼,其他應用程式也可以通過向其傳送WM_GETTEXT或EM_GETLINE消息來獲取Edit控件中的內容。黑客程序正是利用Edit控件的這個特性,當發現當前探測的視窗是Edit控件並且具有ES_PASSWORD內容時,則通過SendMessage向此視窗傳送WM_GETTEXT或EM_GETLINE消息,這樣Edit項中的內容就一目瞭然了。

二、黑客軟體工作方法

首先要取得現用的視窗,並判斷是否是Edit控件,一般多通過滑鼠來指定要探測的視窗,例如在WM_MOUSEMOVE消息的回應函數中進行判斷,現列舉程式碼片段如下:
//將客戶坐標轉換成螢幕坐標
ClientToScreen(&point);
//返回一個包含指定螢幕坐標點的視窗
CWnd* pWnd = CWnd::WindowFromPoint(point);
if (pWnd)
{
//獲取視窗關鍵句
HWND hwndCurr = pWnd->GetSafeHwnd();
if ((::GetWindowThreadProcessId (GetSafeHwnd(), NULL)) != (::GetWindowThreadProcessId (hwndCurr, NULL)))
{
char lpClassName[255];
//獲取類名
if (::GetClassName(hwndCurr, lpClassName, 255))
{
//判斷是否是Edit控件
if (0 == m_strWndClass.CompareNoCase("EDIT"))
{
//獲取視窗風格
LONG lStyle = ::GetWindowLong(hwndCurr, GWL_STYLE);
//如果設定了ES_PASSWORD內容
if (lStyle & ES_PASSWORD)
{
char szText[255];
//通過掌握的關鍵句hwndCurr向此控件傳送WM_GETTEXT消息
::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szText); //密碼已儲存在szText中
m_strPassword = szText;
}
}
}
}
}
上述程式碼中值得注意的有以下幾個關鍵地方:
ClientToScreen(&point);
CWnd* pWnd = CWnd::WindowFromPoint(point);
HWND hwndCurr = pWnd->GetSafeHwnd();
這三句程式碼可以獲取當前滑鼠位置所在視窗的視窗關鍵句,在SendMessage中要用到的。
::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szText);
這便是真正起作用的SendMessage了,其第一個參數指定了要接收消息的視窗關鍵句,我們已經通過上面的程式碼獲取到了,第二個參數就是讓Edit控件返回字串的WM_GETTEXT消息了,並將得到的內容儲存在szText中。

三、防範措施

既然我們搞清除了黑客軟體普遍採取的手法,那我們自然能制訂出一套防範其攻擊的措施來。下面我們就要對Password進行保護。
從以上分析我們可以看出:Edit控件的漏洞主要在於沒有對傳送WM_GETTEXT或EM_GETLINE消息者的身份進行檢查,只要能找到Edit視窗關鍵句,任何工作都可獲取其內容。所以必須要對傳送消息者的身份進行驗證,這裡指出一種方法來驗證傳送消息者的身份是否合法:

1.新增新CEdit類
從CEdit繼承一個子類CPasswordEdit,申明全局變數g_bSenderIdentity表明消息傳送者的身份: BOOL g_bSenderIdentity;
然後回應CWnd的虛函數DefWindowProc,在這個回調函數中進行身份驗證:
LRESULTCPasswordEdit:efWindowProc (UINTmessage,WPARAMwParam,LPARAMlParam)
{
//對Edit的內容獲取必須通過以下兩個消息之一
if((message==WM_GETTEXT) ||(message==EM_GETLINE))
{
//檢查是否為合法
if(!g_bSenderIdentity)
{
//非法獲取,顯示訊息
AfxMessageBox(_T ("報告:正在試圖竊取密碼!"));
return 0;
}
//合法獲取
g_bSenderIdentity=FALSE;
}
return CEdit:efWindowProc (message,wParam,lParam);
}

2.在資料輸入對話視窗中做些處理
在對話視窗中申明一個類成員m_edtPassword:
CpasswordEdit m_edtPassword;
然後在對話視窗的OnInitDialog()中加入下列程式碼:
m_edtPassword.SubclassDlgItem(IDC_EDIT_PASSWORD,this);
將控制與新類做關聯。
之後要在對話視窗的資料交換函數中將身份設為合法:
void CDlgInput:oDataExchange (CDataExchange*pDX)
{
//如果獲取資料
//注意:對於CPropertyPage類這裡不需要 if (pDX->m_bSaveAndValidate)條件
if(pDX->m_bSaveAndValidate)
{
g_bSenderIdentity=TRUE;
}
CDialog:oDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgInput)
DDX_Text (pDX,IDC_EDIT_PASSWORD,m_sPassword);
//}}AFX_DATA_MAP
}
這樣,Password輸入框就擁有了合法身份,會受到保護。
結論:
以上的方法僅針對VC程序,對於其他語言如VB、Delphi等語言,需要借助VC做一個Password的ActiveX控件,實現方法與上述方法基本類似。以上程序均用VisualC++6.0編製偵錯通過。

psac 2006-04-22 07:24 PM

恢復xp管理員密碼的5奇招
秘訣1:大家知道,WindowsXP的密碼存放在系統所在的Winnt\System32\Config下SAM文件中,SAM文件即帳號密碼資料庫文件。當我們登入系統的時 候,系統會自動地和Config中的SAM自動校對,如發現此次密碼和用戶名全與SAM文件中的加密資料符合時,你就會順利登入;如果錯誤則無法登入。既然如此,我們的第一個方法就產生了:移除SAM文件來恢復密碼。

  如果你不用管本來系統卡包含的任意帳號,而且有兩個作業系統的話,可以使用另外一個能訪問NTFS的作業系統啟動電腦,或者雖然沒有安裝兩個系統,但可以使用其他工具來訪問NTFS。然後移除C:\WINNT\system32\config目錄下的SAM文件,重新啟動。這時,管理員Administrator帳號就沒有密碼了。當然,取下硬碟換到其他電腦上來移除SAM文件也算個好辦法。

  小提示:WindowsNT/2000/XP中對用戶帳戶的安全管理使用了安全帳號管理器(Security AccountManager,SAM)的機制,安全帳號管理器對帳號的管理是通過安全標幟進行的,安全標幟在帳號新增時就同時新增,一旦帳號被移除,安全標幟也同時被移除。安全標幟是惟一的,即使是相同的用戶名,在每次新增時獲得的安全標幟都是完全不同的。因此,一旦某個帳號被移除,它的安全標幟就不再存在了,即使用相同的用戶名重建帳號,也會被賦予不同的安全標幟,不會保留原未的權限 。

  安全帳號管理器的具體表現就是%SystemRoot%\system32\config\sam文件。SAM文件是WindowsNT/2000/XP的用戶帳戶資料庫,所有用戶的登入名及密碼等相關資訊部會儲存在這個文件中。

  秘訣2:使用Off1ine NT Password & Registry Editor。用該軟體可以製作Linux啟動碟,這個啟動碟可以訪問NTFS文件系統,因此可以很好地支持Windows2000/XP。使用該軟碟中的一個執行在Linux的工具Ntpasswd就可以解決問題。並且可以讀取註冊表並重寫帳號密碼。使用的方法很簡單,只需根據其啟動後的提示一步一步做就可以了。在此,建議你使用快速模式,這樣會列出用戶供你選項修改哪個用戶的密碼。預設選項Admin組的用戶,自動找到把Administrator的名字換掉的用戶,十分方便。

  秘訣3:使用Windows Key 5.0。該軟體包含在PasswareKit5.0中,用於恢復系統管理員的密碼,執行後產生3個文件:txtsetup.oem.winkey.sys和winkey.inf,3個文件一共才50KB,短小精悍。把這3個文件放到任何軟碟中,然後使用XP安裝光碟啟動電腦,啟動程序中按F6鍵讓系統安裝第三方的驅動程式。此時,正是我們切入的最好時機,放人該軟碟就會自動跳到WindowsKey的介面。它會強行把Administrator的密碼換成 "12345",如此一來何愁大事不成?哈哈!當你重新啟動以後,你會被要求再次修改你的密碼。

  秘訣4:使用NTFS DOS這個可以從DOS下寫NTFS分區的工具。用該軟體製作一個DOS啟動碟,然後到C;\Winnt\System32下將螢幕保護程序logon.scr改名,接著拷貝command.com到C:\Winnt\system32下(2000可以用cmd.exe),並將該檔案改名為logon.scr。這樣啟動機器後等待5分鍾,本應該出現的螢幕保護現在變成了指令行模式,而且是具有Administrator權限的,通過它就可以修改密碼或者增加新的管理員帳號了。改完後不要忘了把螢幕保護程序的名字改回去啊。下載位址:http:/www.cgsecurity.org/index.html?

  秘訣5:下面介紹一個比較與眾不同的方法。你可以在別的分區上再裝一個XP,硬碟分區格式要和原來的一樣,並且請你注意一定不要和原來的XP安裝在同一分區!在開始之前,一定要事先制作備份啟始區MBR(Master Boot Record).制作備份MBR的方法有很多,可以自己編程,或使用工具軟體,如殺毒軟體KV3000等。裝完後用Administrator登入,現在你對原來的XP就有絕對的寫權限了。你可以把原來的SAM拷下來,用lOphtcrack得到原來的密碼。也可以把新安裝的XP的Winnt\System32\Config\下的所有文件覆蓋到C\Winnt\System32\Config目錄中(假設原來的XP安裝在這裡),然後用KV3000恢復以前制作備份的主啟始區MBR,現在你就可以用Administrator身份登入以前的XP了。

  小提示:MBR俗稱"主啟始區",它的作用是讀取磁牒分區表(Partition Table)裡面所設定的活動分區 (Active Partition),位於硬碟的磁柱0、磁頭0、扇區1的位置,也即俗你的0磁軌位置。它是由分區指令fdisk產生的。MBR包括硬碟啟始程序和分區表這兩部分。MBR結束標誌為55AA,用殺毒軟體KV3000的F6功能即可檢視,其預設畫面即為MBR。如果MBR找不到活動分區,就會在螢幕上顯示像Missing operating System等錯誤訊息,所以,如果你的WindowsXP無法正常開啟。而你又在螢幕上看到類似這樣的錯誤訊息,原因大多就是出在這裡了。

psac 2006-04-22 07:25 PM

不用任何軟體(木馬程序)盜取帳號密碼(二)
筆者的第二篇破解帳號密碼文章主要是加強新的看法,最近筆者破解了幾個QQ帳號密碼和幾個郵信箱,宣告:「做試驗時可別參與一些破解帳號密碼工具或木馬程序哦,作弊可不是君子行為哦!」(誰背後歪我)。其實筆者破解的程序中主要是利用了破解帳號密碼的新手法(談不上吧!),開始吧。在網咖使用QQ通訊的人數最多,破解QQ帳號密碼的可能性就越最大,但破解者很容易忽略一個重要的問題,「場合」,對於破解帳號密碼的成功率也是需要不同的場合的,雖然網咖使用QQ的人數最多,但是有些網咖場合不同,這為什麼?有幾點:1、一個地區有一個地區的樣,正好比做網咖。2、一個地區有不同的人,正好比做網咖消費者。所以,場合有助於破解,這些是筆者最近在試驗程序中發覺的,下面就開始講解破解的整個程序。

1、場合:**網咖(怎樣的網咖場合可以根據自己的判斷)。2、在網咖機器找QQ的安裝目錄,選項你想要的QQ號,提示:雖然你選對了網咖場合,但是還要選對Q主(也就是一個地區有不同的人),只要完成這兩項,破解QQ帳號密碼成功率達到最大100%,筆者也是因為選對了場合,花很短的時間就破解了幾個QQ帳號密碼和Q主的郵信箱帳號密碼。3、筆者的上一篇破解文章已經詳解了破解帳號密碼的手法,湊巧在這次試驗中可以在此文章進一步說明。筆者的破解試驗參與了上篇文章的猜測法,但做法完全不同,進一步加深了猜測的可能性。很多人有這樣的習慣:(1)以自己的姓名拼音設定帳號密碼(2)以自己的生日號碼設定帳號密碼(3)以簡單易記的英語詞彙設定帳號密碼。加深的猜測主要是從中入手,既然他們有這樣的習慣,必定也有其它的習慣,不如把所有的帳號密碼設定成同一帳號密碼,這樣便於記憶,還有一個重要的,不如把用戶帳號(用戶名)和用戶密碼設定相同,這樣更加便於記憶,這也是一個重要的漏洞習慣,從中入手吧。4、搜尋想要破解的QQ資料(QQ的個人設定),這個問題難不倒每一位初學者吧,不要偷懶,順便記下他的QQ資料(有助於破解哦!)。 如果bad luck,就應從他的郵信箱或其它帳號入手,結果一無所獲,不要犯傻了,再換其人吧。如果good luck,趕快行動吧!試一試結果,(1)開啟想要試驗的QQ,QQ密碼與QQ號相同,成功了嗎?這要看你的運氣了。(2)從剛才記下的資料中找出漏洞,如:電話號碼、郵信箱位址、生日、個人主頁等其它記錄,這裡有些網友會覺得奇怪,怎麼跟個人主頁扯在一起了,這也是破解者少用或遺漏的,如果他有個人主頁,當然,在QQ資料中一定是填真的啦,主頁不就是讓人採訪的麼,所以可以從中入手,如以下域名:http://hacker.126.com 、http://www.hacker.com 、http://hacker.yeah.com 等,輸入網址時可以省略http:// ,而破解的程序中最好不要偷懶,先找出域名的名:hacker,用它當作密碼,再試一試,破解出來了麼,還不行,把整個當作密碼或省略http://,結果?(3)第二步不成功,不用灰心,天無絕人之路嘛,用其它的資料做密碼,如生日、電話號碼,最重要的是他的郵信箱位址,先把郵信箱用戶名當作密碼,成功了麼,接著再用其它資料當作密碼,破解出來啦,如果你真的那麼bad luck!沒辦法。5、破解成功別忘了做三件事,尤其是QQ,破解者只做了一件,修改密碼,但遺漏了申請QQ密碼保護,還有一個重要漏洞,破解者破解成功,申請QQ密碼保護時,oh!my god!對方已經申請了此服務,怎麼辦?丟了算了,不行,好不容易才破解成功,還有點時間,坐下來喝杯茶吧!茶也品嚐了,該動腦筋了,既然對方申請了此服務,一定需要郵信箱接收密碼訊息,說明了對方有郵信箱(提示:對方可能不止一個郵信箱,破解程序應增強思法哦!所謂「知彼知己,百戰百勝」。),好了,QQ已破解成功,接著是郵信箱,用對方的QQ密碼當作郵信箱密碼,破解成功了,趕快做件善事吧,修改對方的郵信箱密碼,(誰又在背後歪我)先別得意,雖然破解成功,同時也修改了QQ密碼和郵信箱密碼,但是必須再花點閒時間查明真象,看還有沒有其它郵信箱帳號,有,郵信箱帳號密碼99%相同,同樣再做做善事,以免其它可憐蟲孤獨,一起團圓吧!現在,QQ密碼保護服務對你無障礙啦,終於大功告成了,坐下來再喝杯茶,品嚐人生吧!

總結:筆者的這篇文章,主要是讓初學者進一步瞭解破解帳號密碼的手法,同時也進一步說明了網友們以及破解者的重要漏洞。提示:破解程序中,破解者一定要有耐心和思法,兩者缺一不可,這裡筆者要說明的一點是思法,思法對於每一位破解者來說都很重要,破解程序中只要把思法進一步增強,破解的成功率就越大。

psac 2006-04-22 07:26 PM

2000下簡單得到密碼項中的密碼
得到密碼項中的密碼是有多種方法的,由於考慮到眾多不會編程的朋友,所以在此本人就介紹一種大家都能看懂的用簡單指令碼取密碼的方法(為即將得到密碼而歡呼吧!)廢話不多說了,現在還是切入正題吧。

首先開啟記事本添如以下程式碼:
<script language="VBScript">
Sub GetPassword()
set srcEvent = external.menuArguments.event
Set doc=external.menuArguments.document
set ele=doc.elementFromPoint( srcEvent.clientX, srcEvent.clientY )
if ele.type ="password" then
if ele.value="" then
Alert("密碼為空")
else
Alert("密碼為:"+ele.value)
end if
end if
end sub
call GetPassword()
</script>
檔案名為password.html存為C碟
_USER\Soft開啟註冊表找到HKEY_CURRENTware\Microsoft\Internet Explorer\MenuExt\下新增一下主鍵,鍵名為"取得
密碼",預設值設為該htm文件的路徑c:\password.htm,在該主鍵下另增一個DWORD值,值為4,表示只
在右擊表單元素時顯示該項.關閉註冊表,重新啟動IE視窗,點擊一下密碼框,就會出現該項,點擊該項,
彈出一個對話視窗,告訴你的密碼了。
本文只可用於研
究,和忘記密碼時來用,切不可作為它用,以免誤入其途

psac 2006-04-22 07:27 PM

淺談Win2000密碼的必然破解
很多人都嚮往做黑客,黑客的很多工作其實都是破解密碼,當然是別人的。本文純粹是從理論上論證任何密碼在有限時間的可破解性。如果我告訴你這樣的事實:"Win2000的任意20位以內的密碼最多也只需要2小時就可以破解",你一定驚奇地當場吐血,對我怒目相向。下面看我的論述。
任何破解密碼的行為都可以歸結到一個模型,適用於遠端破解還是本機破解。本理論關於窮解法+做任何事情都要花費時間這樣一個事實。下面建立模型:(這裡把時間放大)有一間房子,房子的門用一台電腦控制,在門外安裝類似於銀行裡面使用的密碼輸入器。因為一個密碼的正確性必須通過比較來驗證,現在假設對於每一個單個密碼(A-C和B-C所用時間相等)的比較時間相同,用s表示;置位時間也相同,用T表示。密碼由0,1,2,…,9這十個數的任意組合,假定密碼是:874936。為了使實驗具有可行性,主要是指人眼可以測定,不妨設s=5秒,T=10秒,密碼錯誤返回F,正確則把門開啟。
開始工作:讓一個實驗者站在門外,我們排除其它非主要因素。比較密碼一位一位的比較:如比較ABCD與edfc是否相同,是用A與e相比,再用B與d相比,以此類推。現在指出電腦對於密碼驗證的兩種機制:機制(1)啟始化flag=1,如果遇到有一位不等,則flag=0,一旦flag=0,則立即返回F,後面的將不再比較,否則最終開啟門;機制(2)啟始化flag=0,用所給密碼與正確密碼一位一位比較,相等則不置位,只要有一位不相等flag變成1,以後的只比較而不置位,最後看flag=1則不開門,返回F,flag=0,則開門。
如果仔細研究電腦的工作原理,或者很多程序的工作原理基本上都是以上兩種方式,而且第一種機制居多。我們還是從實際上出發研究看看其中有什麼缺限可以利用。

8-0:s;flag=0:T ;t=s+T=15秒:F
以上寫法表示用0來嘗試。8與0比較用時s,置位用時T,總用時為s+T,其值為5+10=15秒。以下寫法以此類推。

8-1:s;flag=0:T ;t=s+T=15秒:F
……(從0到7)
8-8:s;不置位; t=s=5秒:F

發現當用8來嘗試時,電腦在t=s=5秒鍾就返回F。而其它的用時都是s+t=15秒(包括用9來嘗試,在這不寫出來,只要發現用時不一樣就停止,以下同。)可以斷定正確密碼的第一位就是8,因而取定第一位為8。第二步用兩位密碼來嘗試。

8-8:s;7-0:s;flag=0:T;t=2s+t=20秒:F
……(從0到6)
8-8:s;7-7:s;不置位;t=2s=10秒:F
可以取定密碼的第二位為7。

8-8:s;7-7:s;4-0:s;flag=0:T;t=3s+T=25秒:F
……(從0到3)
8-8:s;7-7:s;4-4:s;不置位;t=3s=15秒:F
可以取定密碼的第三位為4。

8-8:s;7-7:s;4-0:s;9-0:s;flag=0:T;t=4s+T=30秒:F
……(從0到8)
8-8:s;7-7:s;4-4:s;9-9:s;不置位;t=4s=20秒:F
可以取定密碼的第四位為9。

8-8:s;7-7:s;4-0:s;9-0:s;3-0:s;flag=0:T;t=5s+T=35秒:F
……(從0到2)
8-8:s;7-7:s;4-4:s;9-9:s;3-3:s;不置位;t=5s=25秒:F
可以取定密碼的第五位為3。

8-8:s;7-7:s;4-0:s;9-0:s;3-0:s;6-0:s;flag=0:T;t=6s+T=40秒:F
……(從0到5)
8-8:s;7-7:s;4-4:s;9-9:s;3-3:s;6-6:0;不置位;t=5s=30秒:T(開門)
可以取定密碼的第六位為6。

我們再回過頭來看看整個程序用多少時間:
定8 : (8×15+5)=125 注意是8×而不是7×,因為是從0到7,是8個數,以下同。
定7 : (7×20+10)=150
定4 : (4×25+15)=115
定9 : (9×30+20)=290
定3 : (3×35+25)=130
定6 : (6×40+30)=270
總用時為:(8×15+5)+(7×20+10)+(4×25+15)+(9×30+20)+(3×35+25)+(6×40+30)=1080
即1080秒=18分
奇妙吧,只用18分鍾就破解了一位6位密碼,再看一看6位的最大用時為多少,即當密碼是999999時用時最多:(9×15+5)+(9×20+10)+(9×25+15)+(9×30+20)+(9×35+25)+(9×40+30)=(140)+(190)+(240)+(290)+(340)+(390)=1590秒=26.5分。
這只是假定的s和T比較大的情況,實際問題都是s和T是比較小的,可能就是幾個時鍾週期。我們在這把時間放大就在於使時間具有人眼可測量性,如果在電腦上能精確測量任意兩個時間的差,所有的密碼都可能在很短的時間內破解。
為什麼有人說6位以上的密碼就很難破解呢?因為他只是從窮解法上考慮的,就是說,即使只用0,1,2,…,9做密碼,6位的所有排列為10×10×10×10×10×10它是10的6次方。我們可以做一個比較直觀的比較,如果每一次密碼的嘗試用時1秒,最大用時為:10×10×10×10×10×10/3600≒277年時間,我想你一般情況下是等不了277年的時間來看密碼的結果的。而用我們以上的方法最大用時為:10+10+10+10+10+10=60秒,一分鍾搞定。我們發現居然有天壤之別,即使使用電腦鍵碟上的字串來做密碼,假定能使用300個字串(因為電腦的鍵盤只有一百多個鍵),最多用時為:300×6=30分鍾。8位密碼用時為:300×8=40分鍾。20位密碼用時為:300×20=100分鍾。
怎麼樣?Win2000如果用機制(1)比較密碼的話,是不是輕鬆搞定?
我們再看使用機制(2)能不能破解。還是以我們以上的模型來研究,我們只需比較一位密碼,看時間上有什麼區別:
因為密碼為6位(874936),所以不足6位可以假定電腦用一個NULL,即空值來比較。
8-0:s;flag=1:T;7-NULL:s;4-NULL:s;9-NULL:s;3-NULL:s;6-NULL:s;t=6s+T:F
8-1:s;flag=1:T;7-NULL:s;4-NULL:s;9-NULL:s;3-NULL:s;6-NULL:s;t=6s+T:F
8-2:s;flag=1:T;7-NULL:s;4-NULL:s;9-NULL:s;3-NULL:s;6-NULL:s;t=6s+T:F
8-3:s;flag=1:T;7-NULL:s;4-NULL:s;9-NULL:s;3-NULL:s;6-NULL:s;t=6s+T:F
8-4:s;flag=1:T;7-NULL:s;4-NULL:s;9-NULL:s;3-NULL:s;6-NULL:s;t=6s+T:F
8-5:s;flag=1:T;7-NULL:s;4-NULL:s;9-NULL:s;3-NULL:s;6-NULL:s;t=6s+T:F
8-6:s;flag=1:T;7-NULL:s;4-NULL:s;9-NULL:s;3-NULL:s;6-NULL:s;t=6s+T:F
8-7:s;flag=1:T;7-NULL:s;4-NULL:s;9-NULL:s;3-NULL:s;6-NULL:s;t=6s+T:F

8-8:s;不置位;7-NULL:s;4-NULL:s;9-NULL:s;3-NULL:s;6-NULL:s;t=6s:F

8-9:s;flag=1:T;7-NULL:s;4-NULL:s;9-NULL:s;3-NULL:s;6-NULL:s;t=6s+T:F
可以看出來:用8來嘗試時,時間比其它所用的時間少。因而第一位可以斷定為8,事實上說明這種情況也是可以破解的。
事實上,電腦在比較密碼的情況基本上都是以上兩種情況。還有什麼奇偶校驗或者標誌位的奇偶校驗等,我想對於正確密碼和錯誤密碼的比較在時間都一定存在差別。就像我隨便給一個數給你8293487879(8294387879,8293487879),你從肉眼發現8293487879:8294387879比較所用時間與8293487879:8293487879比較所用時間不一樣。
因為Win2000的用戶名很容易得到,只要拿到密碼就可以完全控制win2000,本人現在只是從理論上論證了密碼的可破解性,如果從實踐上也可以實現的話,我想從此將結束win2000時代。歡迎大家從實踐上去驗證,或者對作者的論述提出疑義

psac 2006-04-22 07:27 PM

黑客非法探取密碼的原理及安全防範

一、非法獲取Password的原理:

鴻dit控件是Windows的一個標準控件,當把其Password內容設為True時,就會將輸入的內容遮閉為星號,從而達到保護的目的。雖然我們看來都是星號,但程序中的Edit控件實際仍是用戶輸入的密碼,應用程式可以獲取該控件中的密碼,其他應用程式也可以通過向其傳送WM_GETTEXT或EM_GETLINE消息來獲取Edit控件中的內容。黑客程序正是利用Edit控件的這個特性,當發現當前探測的視窗是Edit控件並且具有ES_PASSWORD內容時,則通過SendMessage向此視窗傳送WM_GETTEXT或EM_GETLINE消息,這樣Edit項中的內容就一目瞭然了。

瞻G、黑客軟體工作方法

簫漸要取得現用的視窗,並判斷是否是Edit控件,一般多通過滑鼠來指定要探測的視窗,例如在WM_MOUSEMOVE消息的回應函數中進行判斷,現列舉程式碼片段如下:

//將客戶坐標轉換成螢幕坐標
ClientToScreen(&point);
//返回一個包含指定螢幕坐標點的視窗
CWnd* pWnd = CWnd::WindowFromPoint(point);
if (pWnd)
{
//獲取視窗關鍵句
HWND hwndCurr = pWnd->GetSafeHwnd();
if ((::GetWindowThreadProcessId (GetSafeHwnd(), NULL)) != (::GetWindowThreadProcessId (hwndCurr, NULL)))
{
char lpClassName[255];
//獲取類名
if (::GetClassName(hwndCurr, lpClassName, 255))
{
//判斷是否是Edit控件
if (0 == m_strWndClass.CompareNoCase("EDIT"))
{
//獲取視窗風格
LONG lStyle = ::GetWindowLong(hwndCurr, GWL_STYLE);
//如果設定了ES_PASSWORD內容
if (lStyle & ES_PASSWORD)
{
char szText[255];
//通過掌握的關鍵句hwndCurr向此控件傳送WM_GETTEXT消息
::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szText); //密碼已儲存在szText中
m_strPassword = szText;
}
}
}
}
}

瞻W述程式碼中值得注意的有以下幾個關鍵地方:
鮪lientToScreen(&point);
鮪Wnd* pWnd = CWnd::WindowFromPoint(point);
黏WND hwndCurr = pWnd->GetSafeHwnd();

糧o三句程式碼可以獲取當前滑鼠位置所在視窗的視窗關鍵句,在SendMessage中要用到的。
::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szText);

糧o便是真正起作用的SendMessage了,其第一個參數指定了要接收消息的視窗關鍵句,我們已經通過上面的程式碼獲取到了,第二個參數就是讓Edit控件返回字串的WM_GETTEXT消息了,並將得到的內容儲存在szText中。

三、防範措施

竅J然我們搞清除了黑客軟體普遍採取的手法,那我們自然能制訂出一套防範其攻擊的措施來。下面我們就要對Password進行保護。
從以上分析我們可以看出:Edit控件的漏洞主要在於沒有對傳送WM_GETTEXT或EM_GETLINE消息者的身份進行檢查,只要能找到Edit視窗關鍵句,任何工作都可獲取其內容。所以必須要對傳送消息者的身份進行驗證,這裡指出一種方法來驗證傳送消息者的身份是否合法:

1.新增新CEdit類

簣qCEdit繼承一個子類CPasswordEdit,申明全局變數g_bSenderIdentity表明消息傳送者的身份: BOOL g_bSenderIdentity;

繕M後回應CWnd的虛函數DefWindowProc,在這個回調函數中進行身份驗證:
LRESULTCPasswordEdit:efWindowProc (UINTmessage,WPARAMwParam,LPARAMlParam)
{
//對Edit的內容獲取必須通過以下兩個消息之一
if((message==WM_GETTEXT) ||(message==EM_GETLINE))
{
//檢查是否為合法
if(!g_bSenderIdentity)
{
//非法獲取,顯示訊息
AfxMessageBox(_T ("報告:正在試圖竊取密碼!"));
return 0;
}
//合法獲取
g_bSenderIdentity=FALSE;
}
return CEdit:efWindowProc (message,wParam,lParam);
}

2.在資料輸入對話視窗中做些處理
礎b對話視窗中申明一個類成員m_edtPassword:
鮪passwordEdit m_edtPassword;

繕M後在對話視窗的OnInitDialog()中加入下列程式碼:
m_edtPassword.SubclassDlgItem(IDC_EDIT_PASSWORD,this);

簣N控制與新類做關聯。
瞻妨嵾n在對話視窗的資料交換函數中將身份設為合法:
void CDlgInput:oDataExchange (CDataExchange*pDX)
{
//如果獲取資料
//注意:對於CPropertyPage類這裡不需要 if (pDX->m_bSaveAndValidate)條件
if(pDX->m_bSaveAndValidate)
{
g_bSenderIdentity=TRUE;
}
CDialog:oDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgInput)
DDX_Text (pDX,IDC_EDIT_PASSWORD,m_sPassword);
//}}AFX_DATA_MAP
}
糧o樣,Password輸入框就擁有了合法身份,會受到保護。

繕祭蛂G

瞼H上的方法僅針對VC程序,對於其他語言如VB、Delphi等語言,需要借助VC做一個Password的ActiveX控件,實現方法與上述方法基本類似。以上程序均用VisualC++6.0編製偵錯通過。


所有時間均為台北時間。現在的時間是 04:50 AM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1