转贴 RAR秒破教程.docx
- 文档编号:28005754
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:10
- 大小:20.59KB
转贴 RAR秒破教程.docx
《转贴 RAR秒破教程.docx》由会员分享,可在线阅读,更多相关《转贴 RAR秒破教程.docx(10页珍藏版)》请在冰豆网上搜索。
转贴RAR秒破教程
[转贴] RAR“秒破”教程
技术是一点点积累的,每天消化一点吧
以前的东西,绝对的经典
winrar加密分析
原作者:
天易love转载来自:
看雪学院
一、加密文件大体结构:
1、只加密文件内容时。
偏移14-15h是对其后一直到文件头结束处也就是加密数据开始处的校验值。
文件头中文件名后至文件头结束处是八字节的salt和5字节的未知区域(功能暂不详),加密数据后紧跟固定的结束字符串c43d7b00400700。
2、头和内容均加密时:
偏移14-15h是salt2,尾部还出现一次。
紧跟的是加密的文件头(头中尾部是salt1和5字节的未知区域)和加密的文件内容(压缩后再进行aes加密),最后就是salt2和经过aes加密的固定结束字符串。
注:
生成salt的函数调用了2次。
二、简述salt算法:
1、由SystemTime得到FileTime;
2、分别对FileTime的两个DWORD进行hash_process;
3、hash_final后得到的digest的最前面的两个DWORD就是salt。
三、加密过程:
1、先将salt接在unicode形式的密码后再用hash_final生成aesinit、aeskey、10轮roundkey。
2、压缩好的文件内容分组长为每一个分组128bit,开始加密前先与前一个分组xor生成一个state参与aes加密,第一个分组与aesinit进行xor。
四、隐患:
由于salt是随机产生,因而aeskey和roundkey也是随机的,文件加密结果就是随机的。
这个变量的使用给我们提供了利用空间。
插一句,假如由加密后数据逆推得到aeskey但由于是经过hash得到,这是不可逆的,所以不可能知道密码。
唯一可行就是让其加密过程中自己将密码保存到salt处最好用可逆向的加密算法处理一下,这不会有任何影响,只是让它多了层含义。
以上是我的一点肤浅的认识,望批评指正!
天易love
winrar加密“秒破”
原作者:
天易love 转载来自:
看雪学院
第一步:
用winhex将下面数据生成rar格式的文件。
526172211A0700CF907300000D0000000000000056947424965E00600000004900000002E3B1696DEE413D3B1D33310020000000C3EBC6C6B2E2CAD44279CCECD2D76C6F76652E74787400796AD234784B6DD58B0A427929591366006C6F7665002E7478742E2E5B7A2D7B7D2E2E39423843569449C8691BEC768E16663C5F9ED737AE6CDDC6178C0837F6BB88DAA8356B02A700C776FC0F1091C1D16712FC075A011D5B5DEF7E46966E8B878B80DABCDF9683C49165FFB993A77CDE8600A1262200F3D3D5315DF0FC4E2B3ACAA3943F142EC43D7B00400700
第二步:
在winhex中取65h-71h一段数据ctrl+c后粘贴到密码输入框点确定完成秒破。
(实例一)
实例二
526172211A0700CE997380000D00000000000000395B7A2D7B7D2E2ED417190FDC99688612D2B31773CD93FE082F30D3229C8F77F51B936AD003E65AADF605471FA4ED0E3655748BCC8F5FA5BFDE4651275A2AA306CB7999C579C249C5AF56A0D3744BD7A695586FEF9FB1AB146CA80DED886936DE3AB003EC44215BA8497E4C1A974D45810C8F1277726881548FBAB842BCF9E17B815C116260ADFEB9151DF97C6F93A673629691B767F883950018B7DE7C0D86FFF04A10905E32BD1DB015B709A298DB8D2C42DF23A131F2AD999AA3BB2316F031C5115c179a2f877a41393761683939
选中14h-1bh一段数据ctrl+c后粘贴到密码输入框中后面再加上dch-e3h处的ASCII字符,确定后即秒破了!
信不信由你!
轩辕小聪的分析:
了楼主给的文件,再学习一下RAR文件头结构,算是明白楼主的意思:
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字节的密码。
按照这个思路,我调试了一下我电脑上的WINRAR3.70。
我只考虑密码不超过8字节,实际上问题就是找到WINRAR程序操作压缩的过程,在程序把SALT和密码连在一起之前,把SALT改为和密码一样,这样压缩出来的就是那样的文件了。
超过8字节的代码只要按照上述思路自己修改生成后的RAR就可以了。
具体步骤:
创建一个新RAR文件,OD载入WINRAR程序,F9跑起来,打开这个空RAR文件,往里面添加一个文件,这时WINRAR程序会弹出添加文件到压缩文件的对话框。
第一步要做的是在这个对话框保存我们输入的密码时断下。
怎么定位这个并不难,因为当在添加文件的对话框中高级选项卡点击“设置密码”的时候,会弹出输入密码的框,就从拦截这个对话框入手,程序弹出这个子对话框采用的是DialogBoxParamA,只要在这个API上下断就可以断下:
77D3B144>8BFFmovedi,edi;WinRAR.004BB5D0
看堆栈:
0012A40400482A3B/CALL到DialogBoxParamA来自WinRAR.00482A36
0012A40800400000|hInst=00400000
0012A40C004AC73C|pTemplate="GETPASSWORD2"
0012A41000040714|hOwner=00040714('高级',class='#32770',parent=001B06FA)
0012A4140047D78A|DlgProc=WinRAR.0047D78A
0012A4180012A428\lParam=0012A428
进到调用来源00482A36,看一下调用过程:
00482A1E|.8D957CFFFFFFleaedx,dwordptr[ebp-84]
00482A24|.52pushedx;/lParam
00482A25|.688AD74700push0047D78A;|DlgProc=WinRAR.0047D78A
00482A2A|.53pushebx;|hOwner
00482A2B|.683CC74A00push004AC73C;|pTemplate="GETPASSWORD2"
00482A30|.FF3548214B00pushdwordptr[4B2148];|hInst=00400000
00482A36|.E895F10100call
00482A3B|.85C0testeax,eax
00482A3D|.0F95C1setnecl
00482A40|.83E101andecx,1
00482A43|.8BD9movebx,ecx
00482A45|.84DBtestbl,bl
00482A47|.7415jeshort00482A5E
00482A49|.8D857CFFFFFFleaeax,dwordptr[ebp-84]
00482A4F|.50pusheax
00482A50|.57pushedi
00482A51|.E82A520100call00497C80;CopyString
由于对话框调用完后紧接着是一个字符串拷贝,因此可以推断传送给密码对话框的这个lParam参数就是让密码对话框保存密码的位置,对话框关闭之后又将密码Copy到一个全局数据区保存起来(对对话框窗口过程的调试证明这个推测是正确的),而此时的edi就是保存密码的全局数据区地址,这个值是004BB5D0。
在callDialogBoxParamA的下一句下断,F9让密码对话框出现,填写密码(不要超过8字节),按确定,断下了,然后F8观察CopyString的参数证实上面的推测是正确的。
现在仍然在对话框的窗口过程中:
00446AB4|.E827BF0300call004829E0
00446AB9|.84C0testal,al
00446ABB|.7447jeshort00446B04
00446ABD|.B8E6000000moveax,0E6
00446AC2|.803DD0B54B00>cmpbyteptr[4BB5D0],0
00446AC9|.7505jnzshort00446AD0
00446ACB|.05F8020000addeax,2F8
00446AD0|>E8FBBAFCFFcall004125D0
显然后续代码证实了4BB5D0开始的全局数据区的确是在存取密码的。
于是下一步在WINRAR程序从这里取出密码进行加密操作的时候把它断下。
对4BB5D1下硬件访问断点(为什么要下在4BB5D1而不直接在4BB5D0,那是因为如果下在4BB5D0,将会断到大量的cmpbyteptr[4BB5D0],0,而只有开始读取4BB5D1处才能说明是真正的在读取其内容而不是单独地比较密码是否为空),F9跑起来,完成添加文件对话框的设置点确定关闭这个对话框,OD断下:
00497C53|.2BC3|subeax,ebx
00497C55|.7526|jnzshort00497C7D
00497C57|.84DB|testbl,bl
00497C59|.7422|jeshort00497C7D
00497C5B|.8A4102|moval,byteptr[ecx+2]
00497C5E|.8A5A02|movbl,byteptr[edx+2]
这是一个CompareString,Ctrl+F9
0041139D|>/FF75FC/pushdwordptr[ebp-4]
004113A0|.|69C3AA000000|imuleax,ebx,0AA
004113A6|.|81C0303F4A00|addeax,004A3F30;ASCII".,];/[]"
004113AC|.|50|pusheax
004113AD|.|E882680800|call00497C34
004113B2|.|83C408|addesp,8;到这里
004113B5|.|85C0|testeax,eax
004113B7|.|0F858F000000|jnz0041144C
在一个循环里,在下面F4跳出循环:
00411456|>\807DEB00cmpbyteptr[ebp-15],0
0041145A|.0F850B020000jnz0041166B
00411460|.8D9560FEFFFFleaedx,dwordptr[ebp-1A0];保存UNICODE形式的密码
00411466|.B97F000000movecx,7F
0041146B|.8B45FCmoveax,dwordptr[ebp-4];004BB5D0,密码字符串指针
0041146E|.E841F0FFFFcall004104B4;ANSI转换成UNICODE
00411473|.66:
C7855EFFF>movwordptr[ebp-A2],0
0041147C|.8D9558FDFFFFleaedx,dwordptr[ebp-2A8]
00411482|.8D8560FEFFFFleaeax,dwordptr[ebp-1A0]
00411488|.B900000001movecx,1000000
0041148D|.E842F0FFFFcall004104D4;stringcopy
00411492|.8D8560FEFFFFleaeax,dwordptr[ebp-1A0]
00411498|.E8CBF2FFFFcall00410768;取UNICODE字符串长度
0041149D|.03C0addeax,eax
0041149F|.85FFtestedi,edi
004114A1|.8945E4movdwordptr[ebp-1C],eax
004114A4|.7419jeshort004114BF
004114A6|.6A08push8
004114A8|.57pushedi
004114A9|.8D9558FDFFFFleaedx,dwordptr[ebp-2A8]
004114AF|.0355E4addedx,dwordptr[ebp-1C]
004114B2|.52pushedx
004114B3|.E8D8650800call00497A90;memcpy?
004114B8|.83C40Caddesp,0C
004114BB|.8345E408adddwordptr[ebp-1C],8
上面这段代码就很清楚了,就是把密码变为UNICODE并把SALT加在后面。
因此此时的edi就是保存SALT的指针,数据窗口中观察:
02A32D6CECD4D14B47600F6E煸袺G`n?
.
如果此时不修改这个SALT值,让WINRAR完成整个过程,再在RAR文件中观察文件头结构会发现SALT的确是这个内容。
现在在这里直接把这个位置用密码字符串代替(为了学习楼主,我把密码同样搞成几个标点符号):
02A32D6C2E2C5D3B2F5B5D00.,];/[]
解除断点让WINRAR完成操作。
生成的RAR文件内容:
526172211A0700CF907300000D000000000000003A917424843000200000000800000002FA9EF760CB28553B1D3308002000000073686F772E7478742E2C5D3B2F5B5D007FAA3C3EB323E42592EE85B9EC80F2BAA3389C0C5733224118F8A872B9086EF3C43D7B00400700
WINHEX打开文件,在文件3ch-43h处正是SALT值,也正是我设的密码(只有7个字节,所以最后是00):
Offset0123456789ABCDEF
000000302E2C5D3B.,];
000000402F5B5D00/[].
至此我成功在WINRAR3.70中通过OD调试WINRAR程序实践了楼主所说的内容,显然只剩下把这个过程转化成patch就可以实用化了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 转贴 RAR秒破教程 RAR 教程