破解Windows 9X螢幕保護程序的口令

2023-01-18 12:27:04 字數 3778 閱讀 8232

作者:劉起凌

筆者在破解 windows 9x 螢幕保護程式口令的過程中,用的是乙個超強的軟體除錯工具:numega 公司的 soft-ice 3.01 for windows 95,鑑於 soft-ice 使用上的複雜性以及整個破解工作的枯燥和繁瑣,筆者略去了對跟蹤破解過程的敘述。

對於 windows 9x 螢幕保護程式的口令,有三點是需要首先明白的:

(1)口令的有效字元為從 0x20 到 0xff 的可列印字元共計224 個;

(2)允許的口令最大長度為 128 個位元組;

(3)對於26個英文本母,大小寫等效。

值得注意的是對於 windows 9x 中文版來說,由於在螢幕保護程式啟動後遮蔽了中文輸入法的啟用熱鍵,所以,儘管你可以將 windows 9x 螢幕保護程式的口令設定為漢字,但通常很少有人這樣做。因為那樣的話你將只能通過事先將口令複製到剪貼版(選中字串再按ctrl+c或ctrl+x),然後再從剪貼版貼上(ctrl+v)的辦法才能實現漢字口令的輸入。這顯然是比較麻煩的。

對於上述的第二點,我們可以通過先複製一段長於 128 個位元組的字串到剪貼版,再在口令輸入欄將字串貼上的辦法來驗證。你會發現,windows 9x 將我們字串中長於 128 字元後的部分截掉並忽略了。

現在,我們首先要確定的乙個問題就是:windows 9x 將我們輸入的口令存放在什麼地方?

我們知道,windows 9x 的使用者口令儲存在乙個由"使用者名稱+.pwl"的檔案中;在 windows 3.1 和 windows nt 4.

0 中,螢幕保護程式的口令是存放在檔案 中的。而事實上 windows 9x 對螢幕保護程式口令的儲存並不在上述檔案中。windows 9x 將我們輸入的螢幕保護程式口令經過加密變換後儲存到了它的系統登錄檔中!

具體的存放路徑如下:

\hkey_current_user\control panel\desktop\screens**e_data

我們可以執行 regedit 來檢視,會發現 screens**e_data 註冊項有如下特徵:

1)以 0x00 空結束符收尾

2)長度為我們所輸入的口令長度的兩倍加一( 0x00 空結束符)

3)除了 0x00 空結束符外,所有數值都在字元'0'到'9'和'a'到'f'間變化(即 0x30~0x39,0x41~0x46)

4)最大長度為 257 ( 含 0x00 空結束符)

上述第一點,如果以乙個 c 程式設計師的觀點來看,說明 screens**e_data 註冊項儲存的實際上是乙個字串。而第二點和第三點,正是我們需要處理的部分。事實上,將這些字元兩兩一組合併再轉換成相應的 ascii 數值就得到了經過 windows 9x 加密(如果我們認為這也算加密的話)的資料。

具體的轉換規則是:

字元'0'( ascii 值 0x30 )----> 0x00

字元'1'( ascii 值 0x31 )----> 0x01

……字元'9'( ascii 值 0x39 )----> 0x09

字元'a'( ascii 值 0x41 )----> 0x0a

字元'b'( ascii 值 0x42 )----> 0x0b

……字元'f'( ascii 值 0x46 )----> 0x0f

例如:加密字串

對應ascii值:0x30 0x39 0x46 0x43 0x44 0x36 0x38 0x43 0x32 0x33 0x00

轉換得的值:0x09 0xfc 0xd6 0x8c 0x23

經過以上論述,再看第四點,也可以證明 windows 9x 所承認的螢幕保護程式的口令的最大長度是 128 個字元。

具體程式設計而言,我們可以用以下 mfc **調 win32 sdk 中的 api 函式從系統登錄檔中讀出 screens**e_data 註冊項的值:

hkey  hkey;

char strvalue[256+1];

dword dwtype,dwsize=sizeof(strvalue);

// 開啟登錄檔的指定鍵(註冊項)

if(regopenkeyex(hkey_current_user,"control panel\\desktop",

0, key_all_access, &hkey)!=error_success)

// 取註冊項(鍵)的值

if(regqueryvalueex(hkey,"screens**e_data",null,

dwtype,(lpbyte)strvalue,&dwsize)!=error_success)

// 關閉開啟的指定鍵(註冊項)

regclosekey(hkey);

而將 windows 9x 用字串形式所儲存的所謂加密值轉換為我們所需要的 ascii 數值,對於乙個熟練的 c 程式設計師來說是極為簡單的,下面給出 mfc 示範**:

cstring lockdata;

// 說明:以上兩句若以純粹的 c **來寫只需一句:

unsigned char lockdata[128]=;

for(int i=0;i<(int)dwsize/2;i++)

現在的問題是:windows 9x 對我們的口令做了哪些變換後得到的上述轉換值?

事實上,windows 9x 只是用了乙個簡單的陣列對我們的口令中的每一字元進行了逐字節異或運算而已。這一點可以這樣來驗證:我們先設定口令為"abcd",這時系統登錄檔中的 screens**e_data 註冊項的值假定是對應的 ascii 值分別為:

0x30, 0x39, 0x41, 0x43, 0x33, 0x35, 0x35, 0x39, 0x00 ;對應的轉換值為: 0x09, 0xac, 0x35, 0x59 );再將口令更改為"alcd",檢視系統登錄檔的註冊項,我們會發現值變成了這表明字串中的轉換值都沒改變,進一步來說,就是整個口令字串中的每乙個位元組都是在與乙個相應的固定值在運算。而之所以在這裡說 windows 9x 對位元組的運算是異或運算,這一點正是筆者在破解過程中的最重要的心得,也是破解 windows 9x 螢幕保護程式的口令的關鍵所在。

至於這個用以對位元組異或運算的陣列(也就是所謂的金鑰)的獲得,至少可以有兩個辦法。

第一種辦法是基於上述研究心得的最直接的辦法,這裡給出簡單描述,有興趣的朋友可以自行程式設計來加以驗證:先輸入乙個 128 位元組長的口令並確定,再讀出系統登錄檔中 screens**e_data 鍵的值並轉換後,和我們剛才輸入的口令字串逐字節異或,就得到了這個 windows 9x 的所謂金鑰。

第二種辦法是基於另乙個研究心得上的。在對 windows 9x 本身加解密口令字串執行機制的跟蹤分析過程中,筆者發現 windows 9x 本身在生成金鑰時(尤其是在螢幕保護程式啟用後對使用者的輸入做比較檢驗時)使用的主要是乙個花裡胡哨的隨機交換演算法,下面是經筆者簡化後效果完全相同的生成演算法:

設定乙個四位元組長的增效器陣列,值分別為 0xb2,0xdc,0x90,0x8f ;

設定乙個 256 位元組長的運算陣列和乙個 128 位元組長的金鑰陣列;

設定上一次運算的增效值並賦初值 0;

首先將運算陣列中各元素的下標值賦各元素( 256 次迴圈 );

從運算陣列的首元素開始迴圈:計算出要運算陣列中要交換元素值的元素下標(也就是有規律的所謂隨機值)並與當前元素交換;記下本次運算中用到的增效值以供下次迴圈時使用( 256 次迴圈 );

再乙個 128 次迴圈,只是要交換的元素的開始下標是從第二個元素開始的,交換法則也稍有不同,同時從運算陣列中按一定法則取值賦金鑰陣列。

至此金鑰陣列生成完成。

下面給出相應的 c **:

unsigned char multiplier=;

unsigned char matrix[256], keydata[128];

inti;

破解windows 2019密碼詳解

破解win2008口令的瑞士軍刀 erd commander boot cd 我們在日常使用計算機的過程中,大多都經歷過由於忘記口令從而無法進入系統的遭遇。遇到這種問題該如何處理呢?很多朋友一定想到了形形色色的口令破解工具,這些工具中名氣最大的就是erd commander boot cd。erd ...

EC6108V9A吉林破解教程

1 悅盒需要網線連線到路由器不可以使用無線連線。2 準備電腦一台需要連線路由器 不區別有線無線連線,但需要與悅盒在同乙個路由器下 3 群內共享檔案檔案 吉林v9a破解檔案.rar。4 解壓檔案後放置在u盤根目錄 開啟u盤就能看到目錄 5 群內共享檔案檔案 到電腦任意目錄備用。6 將u盤插入網線 一定...

Windows7旗艦版X64安裝說明

windows 7 x32 x64 旗艦版安裝截圖說明本安裝盤為純淨原版,windows 7 32位 windows7 64位 從光碟啟動電腦,出現安裝光碟的起始介面 此介面下有多個安裝選項 按下鍵盤上的 1 之後,就開始安裝windows7 sp1 原版注意 此時螢幕會變黑,螢幕最頂上只有一段文字...