当前位置:网络安全 > 在几秒钟内分析并尝试破解 winrar 密码

在几秒钟内分析并尝试破解 winrar 密码

  • 发布:2023-10-01 19:07

在几秒钟内分析并尝试破解 winrar 密码

发表时间:2010-08-17 15:53​​文章来源:互联网文章作者:排名名称点击次数: 654次 摘要:第一步:使用winhex将以下数据生成rar格式文件。 526172211A0700CF907300000D0000000000000056947424965E00600000004900000002E3B1696DEE413D3B1D33310020000000C3EBC6C6B2E2CAD44279CCEC D2D76C6F76652E74787400796AD234784B6DD58B0A427929591366006C6F76650...

步骤1:使用winhex将以下数据生成rar格式文件。
526172211A0700CF907300000D0000000000000056947424965E00600000004900000002E3B1696DEE413D3B1D33310020000000C3EBC6C6 B2E2CAD44279CCECD2D76C6F76652E74787400796AD234784B6DD58B0A427929591366006C6F7665002E7478742E2E5B7A2D7B7D2E2E39423843569449C8691BEC 768E16663C5F9ED737AE6CDDC6178C0837F6BB88DAA8356B02A700C776FC0F1091C1D16712FC075A011D5B5DEF7E46966E8B878B80DABCDF9683C49165FFB993A77CDE86 0 0A1262200F3D3D5315DF0FC4E2B3ACAA3943F142EC43D7B00400700
第二步:在winhex中取一段65h到71h的数据,用ctrl+c粘贴到密码输入框中,点击确定完成。 (例1)

示例 2
526172211A0700CE997380000D0000000000000395B7A2D7B7D2E2ED417190FDC99688612D2B31773CD93FE082F30D3229C8F77F51B936AD 003E65AADF605471FA4ED0E3655748BCC8F5FA5BFDE4651275A2AA306CB7999C579C249C5AF56A0D3744BD7A695586FEF9FB1AB146CA80DED886936DE3AB003EC44215BA8497E4C 1 A974D45810C8F1277726881548FBAB842BCF9E17B815C116260ADFEB9151DF97C6F93A673629691B767F883950018B7DE7C0D86FFF04A10905E32BD1DB015B709A29 8 DB8D2C42DF23A131F2AD999AA3BB2316F031C5115c179a2f877a41393761683939
选择数据ctrl+c的14h-1bh部分粘贴到密码输入框中,然后在dch-e3h处添加ASCII字符,秒破之后确认!信不信由你!


RAR加密的原理是将UNICODE格式的密码与随机生成的8字节SALT连接起来,并用它生成AES算法的密钥进行加密。
在加密的RAR中,除了加密的原始压缩内容外,文件头结构中还保存了这个SALT值,用于解密。
原则上,SALT生成过程与用户输入的密码无关,因此不会保存有关密码的显式信息。不过,我们可以给WINRAR程序打补丁,让SALT直接链接到密码,这样就使这个SALT成为潜在的“后门”。
由于SALT只有8个字节,所以8个字节以内的密码可以直接保存在SALT中(或者简单的异或或者其他,反正可以用简单的可逆算法处理)。
密码超过8个字节怎么办?这里发帖人用两种方式处理,分别是例1和例2。

第一个例子中,应将文件头的HEAD_SIZE字段改大一些,这样文件头中多余的空间(WINRAR读取文件头时会跳过这部分)可以保存密码后8个字节的内容。例1中65h-6ch的内容是SALT,6dh-71h是把HEAD_SIZE改大后多余的部分。

但例一中应用该方法的前提是文件头未加密。如果文件头是加密的(此时MAIN_HEAD的HEAD_FLAGS包含0x0080),则MAIN_HEAD后面是SALT(例2中的14h-1bh内容),SALT后面是所有加密内容(包括文件头)。那么8个字节之后的密码如何获取呢?例2中,我猜测是因为加密过程以16字节为一组,加密的内容也应该是16字节的倍数,所以解密时也是以16字节为单位读取的。当文件内容最后跟随的一段数据小于16字节时,WINRAR在解密时直接忽略这段数据。所以可以将密码的后半部分放在文件的末尾(但不能超过16字节),这样就可以通过这种方式保存不超过23字节的密码。

按照这个思路,我在自己的电脑上调试了WINRAR 3.70。
我只考虑密码不要超过8个字节。其实问题就是找到WINRAR程序的压缩过程。在程序将SALT和密码连接在一起之前,将SALT更改为与密码相同,以便压缩结果像该文件一样。对于超过8字节的代码,只需按照上述思路自行修改生成的RAR即可。

具体步骤:

新建一个RAR文件,OD加载WINRAR程序,运行F9,打开空RAR文件,向其中添加文件。这时,WINRAR程序会弹出一个对话框,向压缩文件中添加文件。框架。第一步是保存我们在此对话框中输入的密码。

如何找到这个并不难,因为当你在添加文件的对话框中点击高级选项卡上的“设置密码”时,会弹出一个输入密码的框。首先拦截这个对话框,程序会弹出这个子对话框,该框使用DialogBoxParamA,可以通过这个API上的disconnect来断开连接:

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

查看堆栈:

0012A404 00482A3B /从 WinRAR.00482A36
0012A408 00400000 |hInst = 00400000
0012A40C 004AC73C |pTemplate = "GETPASSWORD2 调用 DialogBoxParamA "
0012A410 00040714 |hOwner = 00040714 ('高级',class='#32770' ,parent=001B06FA)
0012A414 0047D78A |DlgProc = WinRAR.0047D78A
0012A418 0012A428 /lParam = 0012A428

转到调用源 00482 A36,看一下调用过程:

00482A1E |. 8D95 7CFFFFFF lea     edx,dword ptr [ebp-84]
00482A24 |。 52            推    edx                              ; /lParam
00482A25 |. 68 8AD74700   推    0047D78A                         ; |DlgProc = WinRAR.0047D78A
00482A2A |。 53            推    ebx                              ; |hOwner
00482A2B |. 68 3CC74A00   推    004AC73C                         ; |pTemplate =“GETPASSWORD2”
00482A30 |。 FF35 48214B00 推送    双字指针 [4B2148]               ; |hInst = 00400000
00482A36 |。 E8 95F10100   致电        ; /DialogBoxParamA
00482A3B |. 85C0          测试    eax, eax
00482A3D |。 0F95C1        设置 cl
00482A40 |。 83E1 01       和     ecx,1
00482A43 |。 8BD9          mov     ebx, ecx
00482A45 |. 84DB          测试    bl, bl​​00482A47 |. 74 15         je      短 00482A5E
00482A49 |。 8D85 7CFFFFFF lea     eax,dword ptr [ebp-84]
00482A4F |。 50推 eax
00482A50 |. 57 推 edi
00482A51 |. E8 2A520100 拨打 00497C80 ; ; CopyString 由于调用对话框后会进行字符串复制,因此可以推断,传递给密码对话框的lParam参数是让密码对话框保存密码的位置。对话框关闭后,将密码复制到一个全局数据区并保存(调试对话框窗口流程证明这个猜测是正确的),而此时EDI就是保存密码的全局位置。数据区地址,该值为004BB5D0。

在调用DialogBoxParamA的下一句时,F9使出现密码对话框,填写密码(不超过8个字节),按确定,然后F8观察CopyString的参数,确认上述猜测是否正确。
还是在对话框的窗口过程中:

00446AB4|。 E8 27BF0300 拨打 004829E0
00446AB9 |。 84C0 测试 00446ABB |。 74 47 je je 短 00446B04
00446ABD | 。 B8 E6000000 mov eax,0E6
00446AC2 |。 803D D0B54B00>cmp 字节指针[4BB5D0],0
00446AC9 |。 75 05 jnz 短 00446AD0
00446ACB |。 05 F8020000 add eax, 2F8
00446AD0 |> E8 FBBAFCFF call 004125D0

显然后续代码证实了从4BB5D0开始的全局数据区确实是在访问密码。
所以下一步就是当WINRAR程序从这里取出密码进行加密操作时断开连接。

设置硬件访问断点为4BB5D1(为什么设置为4BB5D1而不是直接设置为4BB5D0?那是因为如果设置为4BB5D0,大量的cmp byte ptr[4BB5D0],0就会被断掉,并且只有在开始读取的时候才会被断掉4BB5D1 can you 表示真正正在读取内容而不是比较密码是否为空)。运行F9,完成添加文件对话框的设置点并确认关闭对话框。外径切断:

00497C53 |。 2BC3 |子 eax,ebx
00497C55 |。 75 26 |jnz 短 00497C7D
00497C57 |。 84DB |测试 bl,bl
00497C59 |。 74 22 |je 短 00497C7D
00497C5B |。 8A41 02 |mov al,字节​​ptr [ecx+2]
00497C5E |。 8A5A 02 |mov bl, byte ptr [edx+2]

这是一个比较字符串,Ctrl+F9

0041139D |> /FF75 FC /push dword ptr [ebp-4]
004113A0 |。 |69C3 AA000000 |imul eax,ebx,0AA
004113A6 |。 |81C0 3 03F4A00 |添加 eax, 004A3F30 ; ASCII "., ];/[]"
004113AC |. |50 |push eax
004113AD |. 。 |83C4 08 |添加 esp, 8 ;去这里
004113B5 |。 |85C0 |测试 eax,eax
004113B7 |。 |0F85 8F000000 |jnz 0041144C

循环中,F4如下跳出循环:

00411456 |> /807D EB 00 cmp 字节 ptr [ebp-15],0
0041145A |。 0F85 0B020000 jnz 0041166B
00411460 |。 8D95 60FEFFFF lea edx, 双字指针 [ebp-1A0] ;以 UNICODE 格式保存 密码
00411466 |。 B9 7F000000 mov ecx,7F
0041146B |。 8B45 FC mov eax, 双字 ptr [ebp-4] ; 004BB5D0,密码字符串指针
0041146E |。 E8 41F0FFFF 呼叫 004104B4 ; ANSI 转换为 UNICODE
00411473 |。 66:C785 5EFFF>mov 字指针 [ebp-A2], 0
0041147C |。 8D95 58FDFFFF lea edx,双字指针 [ebp-2A8]
00411482 |。 8D85 60FEFFFF lea eax,双字指针 [ebp-1A0]
00411488 |。 B9 00000001 mov ecx,1000000
0041148D |。 E8 42F0FFFF 呼叫 00410 4D4                                                                                  -1A0]
0041149 8 |.添加eax,eax
0041149楼|。 85ff 测试 edi,EDI
004114A1 |。 8945 E4 MOV 双字 PTR [EBP-1C],Eax
004114a4 |。 74 19 Je 短 004114bf
004114a6 |。 6A 08 推 8
004114a8 |。 57 推 edi
004114a9 |. 8d95 58fdffff lea edx,双字 PTR [ebp-2a8] 004114AF |。 0355 E4 添加 EDX、DWORD PTR [EBP-1C] 004114b2 |。 52 Pushhh edx
004114B3 |。 E8 D8650800 拨打 00497A90 ;内存拷贝?
004114B8 |。 83C4 0C 添加esp,0C
004114BB |。 8345 E4 08 add dword ptr [ebp-1C], 8 上面的代码很清楚了,就是把密码改成UNICODE,后面加SALT。所以此时EDI就是保存SALT的指针。在数据窗口中观察:
02A32D6C EC D4 D1 47 60 0F 6E 袺 G`n? .

如果此时不修改这个SALT值,让Winrar完成完整的整个过程,如果观察RAR文件中的文件头结构,你会发现SALT确实是这个内容。

现在直接把这个位置替换成这里的密码字符串(为了向原帖学习,我还把密码改成了几个标点符号):

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

释放断点,让WINRAR完成操作。

生成的RAR文件内容:
526172211A0700CF907300000D000000000000003A917424843000200000000800000002FA9EF760CB28553B1D3308002000000073 686F772E7478742E2C5D3B2F5B5D007FAA3C3EB323E42592EE85B9EC80F2BAA3389C0C5733224118F8A872B9086EF3C43D7B00400700

WINHEX打开文件3ch中的文件-4 3h处的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​​ 在.70中,我通过OD调试WINRAR程序实现了海报所说的内容。显然,剩下要做的唯一的事情就是将这个过程转换成补丁以使其实用。

相关文章