天天看點

winrar密碼“秒破”的分析與嘗試

winrar密碼“秒破”的分析與嘗試

釋出時間:2010-08-17 15:53 文章來源:網絡  文章作者:秩名 點選次數: 654次 摘要:第一步:用winhex将下面資料生成rar格式的檔案。 526172211A0700CF907300000D0000000000000056947424965E00600000004900000002E3B1696DEE413D3B1D33310020000000C3EBC6C6B2E2CAD44279CCECD2D76C6F76652E74787400796AD234784B6DD58B0A427929591366006C6F76650...

第一步:用winhex将下面資料生成rar格式的檔案。

526172211A0700CF907300000D0000000000000056947424965E00600000004900000002E3B1696DEE413D3B1D33310020000000C3EBC6C6B2E2CAD44279CCECD2D76C6F76652E74787400796AD234784B6DD58B0A427929591366006C6F7665002E7478742E2E5B7A2D7B7D2E2E39423843569449C8691BEC768E16663C5F9ED737AE6CDDC6178C0837F6BB88DAA8356B02A700C776FC0F1091C1D16712FC075A011D5B5DEF7E46966E8B878B80DABCDF9683C49165FFB993A77CDE8600A1262200F3D3D5315DF0FC4E2B3ACAA3943F142EC43D7B00400700

第二步:在winhex中取65h-71h一段資料ctrl+c後粘貼到密碼輸入框點确定完成秒破。(執行個體一)

執行個體二

526172211A0700CE997380000D00000000000000395B7A2D7B7D2E2ED417190FDC99688612D2B31773CD93FE082F30D3229C8F77F51B936AD003E65AADF605471FA4ED0E3655748BCC8F5FA5BFDE4651275A2AA306CB7999C579C249C5AF56A0D3744BD7A695586FEF9FB1AB146CA80DED886936DE3AB003EC44215BA8497E4C1A974D45810C8F1277726881548FBAB842BCF9E17B815C116260ADFEB9151DF97C6F93A673629691B767F883950018B7DE7C0D86FFF04A10905E32BD1DB015B709A298DB8D2C42DF23A131F2AD999AA3BB2316F031C5115c179a2f877a41393761683939

選中14h-1bh一段資料ctrl+c後粘貼到密碼輸入框中後面再加上dch-e3h處的ASCII字元,确定後即秒破了!信不信由你!

RAR加密的原理,是将UNICODE格式的密碼,與随機生成的一個8位元組的SALT連在一起,根據它生成AES算法的密鑰來進行加密。

而加密後的RAR中,除了加密後的原壓縮内容之外,檔案頭結構還儲存了這個SALT值用于解密。

原則上SALT的生成過程跟使用者輸入時的密碼一點關系都沒有,是以它本來不儲存關于密碼的顯式資訊,但是我們可以對WINRAR程式進行patch,使SALT跟密碼發生直接聯系,進而使這個SALT成為潛在的“後門”。

由于SALT隻有8個位元組,是以對于8個位元組以内的密碼,可以直接儲存在SALT中(或者簡單的XOR一下或其他,反正可以用很容易的可逆的算法處理)。

那麼密碼超出8位元組怎麼辦?這裡樓主分為兩種方式處理,分别是執行個體一和執行個體二。

執行個體一應該是利用了把檔案頭的HEAD_SIZE字段改大,這樣檔案頭多出來的地方(WINRAR讀取檔案頭時是跳過這部分的)就可以儲存密碼8位元組以後的内容。執行個體一中的65h-6ch内容就是SALT,而6dh-71h就屬于把HEAD_SIZE改大之後多出來的部分了。

但是執行個體一這種方法應用的前提是檔案頭沒加密。如果檔案頭被加密(這時MAIN_HEAD的HEAD_FLAGS包含0x0080),那麼MAIN_HEAD後面緊跟着的就是SALT(執行個體二的14h-1bh内容),SALT後面則是被加密的所有内容(包括檔案頭)。那麼怎麼把密碼8位元組以後部分搞進去?執行個體二的做法,我猜是因為加密過程是16位元組為一組,加密後的内容也應該是16位元組的倍數,是以解密時也以16位元組為機關讀取,當檔案内容最後跟着一段小于16位元組的資料時,WINRAR解密時直接無視這段資料。于是就可以把密碼的後半部分放在檔案最後(但是不能超過16位元組),這樣用這種方法可以儲存不超過23位元組的密碼。

按照這個思路,我調試了一下我電腦上的WINRAR 3.70。

我隻考慮密碼不超過8位元組,實際上問題就是找到WINRAR程式操作壓縮的過程,在程式把SALT和密碼連在一起之前,把SALT改為和密碼一樣,這樣壓縮出來的就是那樣的檔案了。超過8位元組的代碼隻要按照上述思路自己修改生成後的RAR就可以了。

具體步驟:

建立一個新RAR檔案,OD載入WINRAR程式,F9跑起來,打開這個空RAR檔案,往裡面添加一個檔案,這時WINRAR程式會彈出添加檔案到壓縮檔案的對話框。第一步要做的是在這個對話框儲存我們輸入的密碼時斷下。

怎麼定位這個并不難,因為當在添加檔案的對話框中進階頁籤點選“設定密碼”的時候,會彈出輸入密碼的框,就從攔截這個對話框入手,程式彈出這個子對話框采用的是DialogBoxParamA,隻要在這個API上下斷就可以斷下:

77D3B144 >  8BFF            mov     edi, edi                         ; WinRAR.004BB5D0

看堆棧:

0012A404   00482A3B  /CALL 到 DialogBoxParamA 來自 WinRAR.00482A36

0012A408   00400000  |hInst = 00400000

0012A40C   004AC73C  |pTemplate = "GETPASSWORD2"

0012A410   00040714  |hOwner = 00040714 ('進階',class='#32770',parent=001B06FA)

0012A414   0047D78A  |DlgProc = WinRAR.0047D78A

0012A418   0012A428  /lParam = 0012A428

進到調用來源00482A36,看一下調用過程:

00482A1E  |.  8D95 7CFFFFFF lea     edx, dword ptr [ebp-84]

00482A24  |.  52            push    edx                              ; /lParam

00482A25  |.  68 8AD74700   push    0047D78A                         ; |DlgProc = WinRAR.0047D78A

00482A2A  |.  53            push    ebx                              ; |hOwner

00482A2B  |.  68 3CC74A00   push    004AC73C                         ; |pTemplate = "GETPASSWORD2"

00482A30  |.  FF35 48214B00 push    dword ptr [4B2148]               ; |hInst = 00400000

00482A36  |.  E8 95F10100   call    <jmp.&USER32.DialogBoxParamA>    ; /DialogBoxParamA

00482A3B  |.  85C0          test    eax, eax

00482A3D  |.  0F95C1        setne   cl

00482A40  |.  83E1 01       and     ecx, 1

00482A43  |.  8BD9          mov     ebx, ecx

00482A45  |.  84DB          test    bl, bl

00482A47  |.  74 15         je      short 00482A5E

00482A49  |.  8D85 7CFFFFFF lea     eax, dword ptr [ebp-84]

00482A4F  |.  50            push    eax

00482A50  |.  57            push    edi

00482A51  |.  E8 2A520100   call    00497C80                         ;  CopyString

由于對話框調用完後緊接着是一個字元串拷貝,是以可以推斷傳送給密碼對話框的這個lParam參數就是讓密碼對話框儲存密碼的位置,對話框關閉之後又将密碼Copy到一個全局資料區儲存起來(對對話框視窗過程的調試證明這個推測是正确的),而此時的edi就是儲存密碼的全局資料區位址,這個值是004BB5D0。

在call DialogBoxParamA的下一句下斷,F9讓密碼對話框出現,填寫密碼(不要超過8位元組),按确定,斷下了,然後F8觀察CopyString的參數證明上面的推測是正确的。

現在仍然在對話框的視窗過程中:

00446AB4  |.  E8 27BF0300   call    004829E0

00446AB9  |.  84C0          test    al, al

00446ABB  |.  74 47         je      short 00446B04

00446ABD  |.  B8 E6000000   mov     eax, 0E6

00446AC2  |.  803D D0B54B00>cmp     byte ptr [4BB5D0], 0

00446AC9  |.  75 05         jnz     short 00446AD0

00446ACB  |.  05 F8020000   add     eax, 2F8

00446AD0  |>  E8 FBBAFCFF   call    004125D0

顯然後續代碼證明了4BB5D0開始的全局資料區的确是在存取密碼的。

于是下一步在WINRAR程式從這裡取出密碼進行加密操作的時候把它斷下。

對4BB5D1下硬體通路斷點(為什麼要下在4BB5D1而不直接在4BB5D0,那是因為如果下在4BB5D0,将會斷到大量的cmp     byte ptr [4BB5D0], 0,而隻有開始讀取4BB5D1處才能說明是真正的在讀取其内容而不是單獨地比較密碼是否為空),F9跑起來,完成添加檔案對話框的設定點确定關閉這個對話框,OD斷下:

00497C53  |.  2BC3          |sub     eax, ebx

00497C55  |.  75 26         |jnz     short 00497C7D

00497C57  |.  84DB          |test    bl, bl

00497C59  |.  74 22         |je      short 00497C7D

00497C5B  |.  8A41 02       |mov     al, byte ptr [ecx+2]

00497C5E  |.  8A5A 02       |mov     bl, byte ptr [edx+2]

這是一個CompareString,Ctrl+F9

0041139D  |> /FF75 FC       /push    dword ptr [ebp-4]

004113A0  |. |69C3 AA000000 |imul    eax, ebx, 0AA

004113A6  |. |81C0 303F4A00 |add     eax, 004A3F30                   ;  ASCII ".,];/[]"

004113AC  |. |50            |push    eax

004113AD  |. |E8 82680800   |call    00497C34

004113B2  |. |83C4 08       |add     esp, 8                          ;  到這裡

004113B5  |. |85C0          |test    eax, eax

004113B7  |. |0F85 8F000000 |jnz     0041144C

在一個循環裡,在下面F4跳出循環:

00411456  |> /807D EB 00    cmp     byte ptr [ebp-15], 0

0041145A  |.  0F85 0B020000 jnz     0041166B

00411460  |.  8D95 60FEFFFF lea     edx, dword ptr [ebp-1A0]         ;  儲存UNICODE形式的密碼

00411466  |.  B9 7F000000   mov     ecx, 7F

0041146B  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ;  004BB5D0,密碼字元串指針

0041146E  |.  E8 41F0FFFF   call    004104B4                         ;  ANSI轉換成UNICODE

00411473  |.  66:C785 5EFFF>mov     word ptr [ebp-A2], 0

0041147C  |.  8D95 58FDFFFF lea     edx, dword ptr [ebp-2A8]

00411482  |.  8D85 60FEFFFF lea     eax, dword ptr [ebp-1A0]

00411488  |.  B9 00000001   mov     ecx, 1000000

0041148D  |.  E8 42F0FFFF   call    004104D4                         ;  string copy

00411492  |.  8D85 60FEFFFF lea     eax, dword ptr [ebp-1A0]

00411498  |.  E8 CBF2FFFF   call    00410768                         ;  取UNICODE字元串長度

0041149D  |.  03C0          add     eax, eax

0041149F  |.  85FF          test    edi, edi

004114A1  |.  8945 E4       mov     dword ptr [ebp-1C], eax

004114A4  |.  74 19         je      short 004114BF

004114A6  |.  6A 08         push    8

004114A8  |.  57            push    edi

004114A9  |.  8D95 58FDFFFF lea     edx, dword ptr [ebp-2A8]

004114AF  |.  0355 E4       add     edx, dword ptr [ebp-1C]

004114B2  |.  52            push    edx

004114B3  |.  E8 D8650800   call    00497A90                         ;  memcpy?

004114B8  |.  83C4 0C       add     esp, 0C

004114BB  |.  8345 E4 08    add     dword ptr [ebp-1C], 8

上面這段代碼就很清楚了,就是把密碼變為UNICODE并把SALT加在後面。是以此時的edi就是儲存SALT的指針,資料視窗中觀察:

02A32D6C  EC D4 D1 4B 47 60 0F 6E                          煸袺G`n?.

如果此時不修改這個SALT值,讓WINRAR完成整個過程,再在RAR檔案中觀察檔案頭結構會發現SALT的确是這個内容。

現在在這裡直接把這個位置用密碼字元串代替(為了學習樓主,我把密碼同樣搞成幾個标點符号):

02A32D6C  2E 2C 5D 3B 2F 5B 5D 00                          .,];/[]

解除斷點讓WINRAR完成操作。

生成的RAR檔案内容:

526172211A0700CF907300000D000000000000003A917424843000200000000800000002FA9EF760CB28553B1D3308002000000073686F772E7478742E2C5D3B2F5B5D007FAA3C3EB323E42592EE85B9EC80F2BAA3389C0C5733224118F8A872B9086EF3C43D7B00400700

WINHEX打開檔案,在檔案3ch-43h處正是SALT值,也正是我設的密碼(隻有7個位元組,是以最後是00):

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000030                                        2E 2C 5D 3B               .,];

00000040   2F 5B 5D 00                                        /[].

至此我成功在WINRAR3.70中通過OD調試WINRAR程式實踐了樓主所說的内容,顯然隻剩下把這個過程轉化成patch就可以實用化了。

繼續閱讀