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", 若是的話, 表示你有危險啦!!!

時間沖忙有機會的話再寫祥細一點   ^_^


    Source: geocities.com/tokyo/bay/8420

               ( geocities.com/tokyo/bay)                   ( geocities.com/tokyo)