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", 若是的話, 表示你有危險啦!!!
時間沖忙有機會的話再寫祥細一點 ^_^
               (
geocities.com/tokyo/bay)                   (
geocities.com/tokyo)