第一步:用winhex将下面数据生成rar格式的文件。

526172211A0700CF907300000D0000000000000056947424965E00600000004900000002E3B1696DEE413D3B1D33310020000000C3EBC6C6B2E2CAD44279CCECD2D76C6F76652E74787400796AD234784B6DD58B0A427929591366006C6F7665002E7478742E2E5B7A2D7B7D2E2E39423843569449C8691BEC768E16663C5F9ED737AE6CDDC6178C0837F6BB88DAA8356B02A700C776FC0F1091C1D16712FC075A011D5B5DEF7E46966E8B878B80DABCDF9683C49165FFB993A77CDE8600A1262200F3D3D5315DF0FC4E2B3ACAA3943F142EC43D7B00400700

第二步:在winhex中取65h-71h一段数据ctrl+c后粘贴到密码输入框点确定完成秒破。(实例一)

实例二

526172211A0700CE997380000D00000000000000395B7A2D7B7D2E2ED417190FDC99688612D2B31773CD93FE082F30D3229C8F77F51B936AD003E65AADF605471FA4ED0E3655748BCC8F5FA5BFDE4651275A2AA306CB7999C579C249C5AF56A0D3744BD7A695586FEF9FB1AB146CA80DED886936DE3AB003EC44215BA8497E4C1A974D45810C8F1277726881548FBAB842BCF9E17B815C116260ADFEB9151DF97C6F93A673629691B767F883950018B7DE7C0D86FFF04A10905E32BD1DB015B709A298DB8D2C42DF23A131F2AD999AA3BB2316F031C5115c179a2f877a41393761683939

选中14h-1bh一段数据ctrl+c后粘贴到密码输入框中后面再加上dch-e3h处的ASCII字符,确定后即秒破了!信不信由你!

参考:http://bbs.pediy.com/showthread.php?t=98684&highlight=%3F&page=8

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

winrar“秒破”尝试与原理简介相关推荐

  1. winrar密码“秒破”的分析与尝试

    winrar密码"秒破"的分析与尝试 发布时间:2010-08-17 15:53文章来源:网络  文章作者:秩名 点击次数: 654次 摘要:第一步:用winhex将下面数据生成r ...

  2. 一个菜鸟关于winrar密码无法秒破的…

    http://bbs.pediy.com/showthread.php?t=62908 研究的原因: 由于有一个重要的Rar文件,极需解开,首先试用了ARPC,但是解压的速度极慢,每秒只有30个左右, ...

  3. javascript原理_JavaScript程序包管理器工作原理简介

    javascript原理 by Shubheksha 通过Shubheksha JavaScript程序包管理器工作原理简介 (An introduction to how JavaScript pa ...

  4. 量子计算机编程原理简介 和 机器学习

    量子计算机编程原理简介 和 机器学习 本文翻译自D-Wave公司网站 www.dwavesys.com/en/dev-tutorial-intro.html D-wave公司在2007年就声称实现了1 ...

  5. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)...

    上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢? 测试代码 publi ...

  6. CountDownLatch原理简介和使用过程

    前言 本文介绍下面试的高能考点 countDownLatch 的原理和应用 countDownLatch具有的功能 CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这 ...

  7. Redis分布锁原理简介和实现过程

    前言 这篇文章介绍下如何实现redis来实现分布式锁及原理简介 原理简介 redis 获取分布式锁使用lua脚本的命令 setnx pexpire(提供了毫秒的过期时间,expire提供了基于秒的过期 ...

  8. oracle bam教程,Oracle BAM原理简介

    Oracle BAM原理简介 Oracle BAM全称为Oracle Busines Activity Monitoring,中文叫Oracle 业务活动监视 ,BAM有两种功能 1.创建实时repo ...

  9. Linux安全原理简介

    Linux安全原理简介 介绍 在设置Linux计算机的所有阶段,安全性应是首要考虑之一.要在计算机上实施良好的安全策略,需要对Linux的基础知识以及所使用的某些应用程序和协议有充分的了解. Linu ...

  10. ntp服务器授时原理,NTP原理简介

    一.NTP协议简介NTP是Network Time Protocol,SNTP是Simple Network Time Protocol.SNTP是NTP的一个子集,比NTP协议简单,可确保秒级精度, ...

最新文章

  1. 24. Leetcode 61. 旋转链表 (链表-基础操作类-旋转链表)
  2. 使用Spring Webservices构建SOAP Webservices代理模块
  3. wsl2 Ubuntu 18.04 安装 ROS
  4. 浪潮服务器5112面板灯_SA5112M4 – IPMI设置
  5. bpmn流程图_流程图怎么做?金舟在线流程图教你高逼格制作
  6. 国内最火5款Java微服务开源项目
  7. 内核使用硬件ip的dma,dma_alloc_coherent 与 dma_alloc_writecombine (转)
  8. 完整nagios安装最新pnp版绘图-sync模式
  9. 改变Tomcat的端口de方法
  10. Discuz!NT v1.0 正式版发布
  11. win10用android手柄游戏手柄,win10系统使用游戏手柄的步骤
  12. c++ opencv的简单数字识别
  13. 上网行为管理(使用软件Panabit)
  14. 佐治亚理工学计算机硕士,美国计算机专业硕士留学推荐:佐治亚理工学院
  15. Unity中关于Destroy的API
  16. 独立思考的迷失很可怕!!!
  17. 如何在电脑上进行PDF压缩?
  18. 题解:luogu P2634 [国家集训队]聪聪可可
  19. Mybaits中association的用法详解
  20. c语言无法用3字母序列,当字符序列工作为下图输入时,输出长度为3的,且可用作C语言标识符的序列的有()。【浙江大学2004...

热门文章

  1. win10pe命令打开计算机,手把手教你如何制作win10PE启动盘
  2. 使用微软官方工具MediaCreationTool制作Windows10的U盘系统安装盘
  3. java遍历键值对_map集合中的键值对对象遍历
  4. 图标文字对齐的几种常见方法
  5. 如何打开屏幕坏的手机_手机屏幕碎了怎么开usb?不通过屏幕打开usb调试方法
  6. python pygame鼠标点击_Python之pygame学习鼠标操作(12)
  7. atmega328p引脚图_atmega328p中文手册
  8. linux-uboot 移植四 uboot的移植
  9. 分享个手游剑侠情缘2挂机脚本,能够多开刷银两的工具
  10. 4.6 Data符号调制——16QAM