From: sjm0415@ms4.hinet.net Oct 28 1997 Newsgroups: tw.bbs.comp.hacker Subject: 透視 Win95 的密碼檔 *.PWL ========================================================= 作者:蘇俊銘, 歡迎散播....................... SJMisBestHacker............................. =========================================================   基本上若您的電腦曾經讓別人使用過的話,那很可能的,您的密碼已經被他人 所獲知了 (包括您上Internet 用的 Username & Password),只要Copy您在Win95 目錄下的.PWL檔即可著手進行解碼,然後您的網路費可能就莫名其妙的增加了。   有人就問了:可是我的Win95在登入時需鍵入密碼啊,別入又不知道我的密碼! 需知道要獲得 .PWL 檔並不一定非得進入Win95,只要用一片DOS磁片開機 or 按F4 、F8 ... 在網路上有一支程式叫 Glide.EXE,此程式宣稱能解 .PWL 檔,的確是如此, 不過此程式有某些先天上的限制,以至於所解出來的東東可能只有一小部份。相信 有些人已試過這支程式了,稍後我會說明這支程式的原理以及為什麼在大多數的情 況之下只能解出一小部份的原因。幸運的話這「一小部份」已含有第一組完整的 Username & Password 了。   Win95 是採用 RC4 的編碼方法,此演算法是不可逆的,也就是說您無法將.PWL 檔解回原來的樣子,除非您有 Key(或用暴力法)。小弟先說一下 RC4 大概的流程: 你擁有一個 32 Bit 的Key & 待解碼的資料(就稱為 SData 吧) 以下為解碼程式所做的事情: 1.初始化一個Table, 此Table的資料結構為 { unsigned char Table[256]; unsigned char char x,y; } 它會將Table依序填入0,1,2,.....FFh, 最後將 x,y 設為 00. 2.將此256 Bytes 的 Table 根據 Key 做一些Swap的動作, 完成 之後, 此Table看似不規則排列了. 到目前為止算是[初始化]的動作吧. 再來是解碼的動作: 3. for(counter=0; counter 2 -> 3 再來我會判斷此20個Byte是否為正確的資料,if 正確的話我再 解開剩下的 90個Byte 流程為 2 -> 3 ,若分成多的片斷的話,則 統程應還是這樣的: 1 -> 2 -> 3 解最前面的 20 Byte 2 -> 3 再解 20 Byte 2 -> 3 再解 20 Byte 2 -> 3 再解 20 Byte 2 -> 3 再解 20 Byte 反正第一次就是從 1 開始啦!!! :) ==================================================== PWL的格式是(從0208h開始看): 20 byte (Username) 2 byte (第一組在檔案的 Offset)----------------+ 2 byte (第二組在檔案的 Offset)--------------+ | ....... | | Tag1:長度(2 byte),"連線到"的名稱,Password <-+-+ 長度(2 byte),"連線到"的名稱,Password <-+ ==================================================== Win95 大概的流程是: 1 -> 2 -> 3 解碼到Tag1減1的地方(此時Username現形了) if(Username<>登入95時的Username) { 撥號網路的密碼欄將是空的(即使儲存密碼有打勾) (跳到Step1也沒用,因為Key不對嘛,再解下去也是不對的.) } else{ Step1: 1 -> 2 -> 3 從Tag1的地方開始解碼. While(NotEND) { 2 -> 3 解2個byte(得到長度,假設解出後,得到 YY) 2 -> 3 解YY個Byte(得到"連線到"的名稱&Password) if(和"連線到"的名稱符合的話) { 將Password填入密碼欄; Break; } } } Win95的問題就出在 Username 一定是大寫, 而且不足20個Byte的地方以空白填入, 更糟糕的是PWL的檔名就是Username, 基於此原理我們已得知前面20Byte每個Byte 各是XOR什麼東東了, 我們假設為: 12 4F 33 20 7F F6 D9 3C 63 AA 11 40 32 DE 46 55 77 2C 3A AD 其實從PWL可分析到共有幾組帳號,至於怎麼分析的呢? 我也忘了.反正可以就是啦! So, 0108h+幾組*2= Tag1 . 哈,我已經知道第一組帳號存在那裡了.(0108h是固定的) 即然知道第一組的位置,當然也就得到了緊接在Username 的那 2 個Byte, 現在我們已擁有了 22 個byte了喔! 怎麼解第一組呢? 因為95在Step1的地方又重覆了一次 1 -> 2 -> 3 所以我們可直接使用我們辛苦得 到的 22 Byte 從Tag1的地方將它給XOR下去. 如果"連線到"的名稱+Password的長度 不會很長的話----> 完全顯露無遺(可能還秀出了第二組的一點點喔!) 以上就是 Glide.EXE 所利用的原理(根本不需要Key就解出一組出來了) 如果你要將所有的帳號(Hinet'Seednet'成大'廣通...不會吧!帳號那麼多,借一組 來用用可以嗎?)全部抓出來, 那很抱歉,妳必需知道 Key. \__ 在成大BBS和女生Talk多了,打錯了. 至於 Key 是怎麼來的呢? 我們在進入Win95時,不是會出現一個輸入密碼的Dialog嗎? 對啦,就是利用這密碼換算來的啦! (沒有的話,表示你沒設定密碼, 你的Key=00000000h) 以下是Win95將登入密碼轉為Key的程式(最後的eax就是你的Key喔): push esi xor eax,eax mov si,密碼長度+1 cmp si,ax jz 7fcb19e7 mov edx,offset 密碼 movzx ecx,byte ptr [edx] 7fcb19d1: add eax,ecx inc edx mov ecx,eax shl ecx,7 shr eax,19h or ecx,eax dec si mov eax,ecx jnz 7fcb19d1 7fcb19e7: pop esi ret 8 嗯,組合語言比較亂, 用 C 來看(結果一樣): unsigned long result = 0L; for( i = 0; i < passwordLen + 1; i++ ) { int tmp = ( int ) ( result >> 25 ); result += toupper( password[ i ] ); result = ( result << 7 ) | tmp; } 就是一直轉來轉去再加來加去的啦! 所以若你知道某人進入Win95的密碼,那你就可以算出 Key, 也就可取得某人 所使用的所有帳號了.怎麼做呢? 喔, 這不必寫任何程式, 只要用SoftICE就 可以了, 所有的動作都在 Mspwl32.dll中, 設個斷點, 一次一組,方便又好用. 如果妳連此人進入Win95的密碼都不知道的話, 那只好用暴力法了. 1.編個密碼-->轉成Key-->經RC4-->什麼!前20Byte的username不對--再來--+ ^\-----------------------------------------------------------+ 2.指定一個Key-->經RC4-->什麼!前20Byte的username不對--再來--+ ^\----------------------------------------------------+ 那個好用,就得看運氣了. :) Glide.EXE 好像在yhq可取得, 不知道.....忘了???????? 註: 這些Bug後來Microsoft出了一支 Mspwl32.dll 的更新程式, 聽說可解決此 問題.我沒試過,所以我也不知道. 你可看看你的 .PWL 檔的最前面4個Byte 是否為 b0h,"MFN", 若是的話, 表示你有危險啦!!! 時間沖忙有機會的話再寫祥細一點 ^_^