首页
社区
课程
招聘
[讨论]对office加密文档的快速破译问题的研究
发表于: 2008-11-1 17:27 134049

[讨论]对office加密文档的快速破译问题的研究

2008-11-1 17:27
134049
收藏
免费 7
支持
分享
最新回复 (257)
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
51
这个帖子我每次都来看是否有新续贴,但我从不回复
因为我很感兴趣但很无奈这个话题,因为我不懂
2008-11-12 17:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
52
我是新手刚进来两天在破解简单的软件时遇到了2个问题 1. getvbres v0.51上一个修改的按纽不能用也就是说不能修改字符串了.  2.为什么用OD的时候总是搜索不到关键的字符串呢?  那为大侠帮帮我解决一下  不胜感激啊!!!!
2008-11-12 18:31
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
53
关于OD中找不到关键字符串的问题,以前也遇到过,明明用UltraEdit打开看二进制数据是有那些关键词的,但OD查找失败。我认为可能有如下原因:
1、Unicode编码问题
2、对关键字符串进行了变形隐蔽,直接查找是不行的
当时我用W32dasm8.93进行反汇编查找,可以找到,所以建议你试试,有时需要几个工具配合使用才能达到目的。
2008-11-12 19:31
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
54
不是测试有误,而是你没有看清我说的,代码其实早就给你提供了。

你的唯一错误就是将块号搞错了,你提供的数据对应的块号是0x00000000,
你只需将块号赋值为0x00000001,肯定就行了。
2008-11-12 19:40
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
55
我这几天做了各种测试,包括您说的把块号改为1,也就是把byteA[]的第5至8字节赋值1。也还是不成功。继续找原因。。。
2008-11-12 22:22
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
56
将块号设置为0x00000001后(原因已经讲过了),正确的数据为:

A值:(49 109 90 10 4)
A值经由md5得到128比特的rc4密钥:(102, 136, 177, 231, 82, 233, 192, 60, 211, 78, 151, 162, 168, 168, 90, 57)
然后通过RC4加密得到B值:(140, 242, 76, 34, 95)
2008-11-12 23:25
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
57
我认为是你的编程有问题。
2008-11-12 23:26
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
58
jeffcjh;534374]将块号设置为0x00000001后(原因已经讲过了),正确的数据为:

A值:(49 109 90 10 4)
A值经由md5得到128比特的rc4密钥:(102, 136, 177, 231, 82, 233, 192, 60, 211, 78, 151, 162, 168, 168, 90
然后通过RC4加密得到B值:(140, 242, 76, 34, 95)

这个B值与0x400位置所取的连续5字节的B值不相同。
有可能是我开始获取A值的代码都有问题。检查中。。。
2008-11-13 09:09
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
59
还有一个问题

  // 对9字节(不是64字节)作标准的MD5 !!!
  MD5Data((unsigned char*)byteA, 9, byteB);

为什么是9字节而不是64字节?
在http://www.team509.com/download/MS_Word_encrypt.pdf这篇文章里的内容以及开源软件wv-0.7.2里面的代码都说是64字节啊。而且我编写的那个暴力破解word的密码也是通过了测试了。
2008-11-13 10:46
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
60
MD5算法本来是对任意长度的数据(包括长度为0的空数据)进行散列得到16字节结果。
其实将数据传给MD5算法后,在MD5内部是要按照算法本身的需要进行填充的,而你现在在MD5外面进行了填充,这个填充不知道是否正确(我认为可能错误)。到底是对是错,你拿上面我给出的测试数据进行调试验证一下即可,再贴一次也无妨:

将块号设置为0x00000001后(原因已经讲过了),正确的数据为:

A值:(49 109 90 10 4)
A值经由md5得到128比特的rc4密钥:(102, 136, 177, 231, 82, 233, 192, 60, 211, 78, 151, 162, 168, 168, 90, 57)
然后通过RC4加密得到B值:(140, 242, 76, 34, 95)
2008-11-13 11:09
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
61
如果按你原来的填充能得到这个结果,说明填充与MD5本身的需要一致。不过即便正确,这个填充也是完全多余的。
2008-11-13 11:11
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
62
按照您说的改成这样了:

ArrayByteA = array [0..4] of byte;
Array16Byte = array [0..15] of byte;

function MakeKey(byteA: ArrayByteA):Array16Byte;
var
  mdContext: MD5Context;
  pwarray: array [0..8] of byte;
  byteB: Array16Byte;
  block: DWord;
begin
  block := 0;
  Fillchar(pwarray,sizeof(pwarray),0);        //pwarray数组清零
  CopyMemory(@pwarray, @byteA, 5);     //拷过去40位(5个字节)
  //put block number in byte 6...9
  pwarray[5] := 1;
  pwarray[6] := 1;
  pwarray[7] := 1;
  pwarray[8] := 1;

  //对pwarrey计算一轮标准的MD5 hash begin
  MD5Init(mdContext);
  MD5Update (mdContext, @pwarray, 9);
  MD5StoreDigest(mdContext);
  //对pwarrey计算一轮标准的MD5 hash end

  CopyMemory(@byteB, @mdContext.Digest, 16);
  result := byteB;
end;

byteA值:(49 109 90 10 4)
调用 MakeKey(byteA) 得到128比特的rc4密钥却是:
(1, 35, 69, 103, 137, 171, 205, 239, 254, 220, 186, 152, 118, 84, 50, 16)
2008-11-13 15:42
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
63
A值:(49 109 90 10 4)
A值经由md5得到128比特的rc4密钥:(102, 136, 177, 231, 82, 233, 192, 60, 211, 78, 151, 162, 168, 168, 90, 57)
然后通过RC4加密得到B值:(140, 242, 76, 34, 95)

您的这个结果是对的。查询word文档中的0x400的值就是您算出来的那个B值。估计是我的md5的算法有问题,奇怪了,我的md5的算法是通用的啊,已经在其它程序中测试通过了啊。您能不能把您的MD5的三个函数MD5Init(&ctx);MD5Update(&ctx, data, len);MD5Final(digest, &ctx);的具体代码贴出来?我看看与我的md5的算法有啥区别。
2008-11-13 16:22
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
64
你早把你的VB代码贴出来问题就早解决了。
我认为你的MD5算法没问题,而是你对块号的填充不对,应该为:
pwarray[5] := 1;
  pwarray[6] := 0;
  pwarray[7] := 0;
  pwarray[8] := 0;
我早反复说了块号要赋值为0x00000001啊,而你现在的赋值是0x01010101,能对吗?

改了这里就对了,我想。
2008-11-13 20:55
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
65
块号要赋值为0x00000001,如果一个字节一个字节赋值的话,就要颠倒过来看了,所以是:
pwarray[5] := 1;
pwarray[6] := 0;
pwarray[7] := 0;
pwarray[8] := 0;
这是32bite整数在I(NTEL指令格式)内存中的布局方法,你应该理解。
2008-11-13 20:57
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
66
[QUOTE=jeffcjh;534968]块号要赋值为0x00000001,如果一个字节一个字节赋值的话,就要颠倒过来看了,所以是:
pwarray[5] := 1;
pwarray[6] := 0;
pwarray[7] := 0;
pwarray[8] := 0;
这是32bite整数在I(NTEL指令格式)内存中的布局方法,...[/QUOTE]
这是32比特整数在(INTEL指令格式)内存中的布局方法,你应该理解。
2008-11-13 20:58
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
67
谢谢了。就是这个原因了。唉,这个小小的问题困扰了我几乎两个星期啊。再次感谢!
2008-11-13 21:07
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
68
看来我的直觉没错,我之前明示你的编程有问题。
2008-11-13 21:13
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
69
不过有了这样的教训,以后遇到问题可能会有更多的思路。
2008-11-13 21:17
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
70
嗯。谢谢你这几个月以来一直耐心的给我讲解。太感谢了!!!
2008-11-13 21:26
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
71
互相学习,共同提高。
2008-11-13 21:28
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
72
我觉得大家应该讨论一下彩虹链的方法。用全表查找的方法需要大量的空间。我想大家应该不会有那么多的空间和那么强的计算能力。你花费那么多的代价不太值。如果我用128bit的加密,那空间就更不能承受了
2008-11-19 18:50
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
73
如果想保证100%的成功率,只有使用完全查表的方法;当然对于128比特的密钥,目前来说是没有什么破解方法的。

彩虹链可以大大降低存储条件,但通常只能保障99%以上的成功率。

然而,不论是全查表还是彩虹链,两种方法都是要预先对整个密码函数的输入空间都计算一遍的,所以需要同样的计算能力。不过,LZ有这样大的计算能力和存储空间,所以他就没有深入考虑彩虹链的实现了。
2008-11-19 20:56
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
74
不一定,国外那些破解软件应该就是用全查表的方法的吧。其实8T左右的空间应该还能够承受。只是生成时间久了点而已。
彩虹链和全查表的方法各自所侧重的使用对象不同而已。
2008-11-30 21:07
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
75
jeffcjh,得到密码之后,您做过使用密码来解密文档的内容的工作吗?
一个加密的WORD或者EXCEL文档,用二进制工具来查看,不是所有的字节都加密的,那么该怎样处理呢?
2008-11-30 21:17
0
游客
登录 | 注册 方可回帖
返回
//