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就可以實用化了。