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

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

2008-11-1 17:27
134049
收藏
免费 7
支持
分享
最新回复 (257)
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
176
1、必须使用解密后的文件来查找位置,原因:Word/Excel加密时会根据情况对明文进行调整,故在原始明文中找出的位置是不可靠的;
2、位于文件偏移0x200--0x3ff之间的固定位置都是可以的,但靠前的位置为佳,因为计算输出B时效率自然要高些;
3、(这些交集,如果在加密后也为00,是不是就不能使用?)不知你的意思是啥。求交集时与加密已经无关了,见1;
4、见1。
2008-12-21 14:19
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
177
为方便理解,对两个位置集合重新说明如下(与原来本质上是一样的):
S1 := {P | Word密报解密后在字节偏移位置P的的数据为某固定值};
S2 := {P | Excel密报解密后在字节偏移位置P的数据为某固定值};
2008-12-21 14:21
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
178
jeffcjh,有两个问题请教您:

第一个问题:是不是从0x200-0x400的任何位置如果满足条件都可以作为S1与S2的交集?

应该不是任何位置都满足条件的吧。
1、EXCEL分为记录头(包括记录类型和记录长度)是不用解密的,所以属于记录头的位置应该是不能作为交集部分的。
2、EXCEL的0x200--0x213这20个字节原封不动的复制到新文件中,也是不用解密的,所以这部分也是不能作为交集部分的。

所以满足交集的条件应该是:
1、0x200-0x400;
2、属于EXCEL记录体的部分。
是否是这样?

第二个问题:产生B值是否可以这样(找到P1-P5五个交集的位置)
RC4(K, 16, ks, 512);
B值等于(ks[P1],Ks[P2],Ks[P3],Ks[P4],Ks[P5])?
2008-12-22 11:11
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
179
你的两个理解都是对的,请按此进行。
2008-12-22 13:42
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
180
好像EXCEL与WORD不能使用同一个查表数据库的。主要原因在于EXCEL加密文档的0x214--0x24D位置的这些数据在解密保存的文件中直接丢掉。而我们求交集的时候是使用解密后的文档,也就是说,我们求出了5个地方的交集(P1--P5),那么对于加密后的文档,这5个位置并不是相同的:
对于WORD的位置是不变的(即为原来的P1、P2、P3、P4、P5);
而对于EXCEL这5个交集的位置则是P1+58、P2+58、P3+58、P4+58、P5+58;

使用RC4(K, 16, ks, 512);函数生成ks值后:
对于WORDl来说,B值是:(ks[P1],Ks[P2],Ks[P3],Ks[P4],Ks[P5])
对于Excel来说,B值则是:(ks[P1+58],Ks[P2+58],Ks[P3+58],Ks[P4+58],Ks[P5+58])

所以EXCEL与WORD产生的B值的方法就不统一了啊。有什么办法能够解决这个问题吗?
2008-12-22 16:41
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
181
而且如果excel的加密文件带有修改密码的话,在0X214的地方还增加了4个字节:00000214h: 86 00 00 00
在0x2d6的地方增加了一个17个字节的记录体:
000002d6h: 5B 00 0D 00 E0 BC AB 86 D5 61 75 7D 63 31 DE 2B
000002e6h: 7E

对于带有修改密码的加密excel文档来说,除了在解密的时候要去掉这两个位置的字节之外,还需要考虑什么情况吗?
2008-12-22 19:57
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
182
你的确对于我们正在讨论的技术还存在一些错误认识,应该可以理解。尽管我并没有实际去计算这个造表过程,但是我从数学方面作过分析,并且联.网.破.译.获得了成功,所以我一点都没有疑问,对于你不断提出的问题基本上都能进行分析。

没有别的意思,我是希望你能够在接受他人的某些帮助的条件下,更多地学会独立思考和分析能力,毕竟看雪论坛这种人未必很多吧。

可以确定地说,EXCEL与WORD可以使用同一个查表数据库,原因我前面已经表述得不少了,不再啰嗦。我仅针对你的疑问说几句吧,希望你自己琢磨琢磨。
2008-12-22 20:16
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
183
不错,EXCEL加密文档的0x214--0x24D位置的这些数据在解密保存的文件中直接丢掉,但是这个根本不影响全查表的计算,它仅仅是为了让Excel软件能打开而已,否则你自己写个Excel文件解析程序都行。
2008-12-22 20:19
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
184
我真的非常感谢您,没有您的帮助,我也不可能那么快的做到这一步。一方面我会继续研究,另一方面,也希望能够继续得到您的帮助。感谢!!!
2008-12-22 20:25
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
185
我说的不是0x214--0x24D位置的数据,而是说如果EXCEL加密文档中还包括了修改密码(而不是打开密码),那么还会在我上面说的两个地方多出两段数据。
2008-12-22 20:28
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
186
这个问题没有分析过。
但是,我认为,不论是增加一个记录,还是减少一个记录,我们现在盯着的是固定底码位置,只要两个位置集合的交集不为空(存在5个以上点),那么就行了。找出这个集合来,除非你说的增加这个记录后找不到有效位置了。
2008-12-22 20:35
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
187
如果实在不行,那可以分成两种情况来考虑。但是,我觉得真的没有必要,请多些理性思维,这种小问题你可以慢慢悟透。
2008-12-22 20:37
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
188
哈,想明白了。
其实我刚才已经找到S1和S2的交集了,并且已经能够生成适合WORD和EXCEL的解密的全查表了,是我开始想的太复杂了,绕来绕去把自己的绕进去了。主要是刚才研究二进制文件,把我搞的晕头转向,出去吹了会冷风思维就清晰了。
谢谢您那么耐心的解答我的疑问。
2008-12-22 21:06
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
189
好,感觉你慢慢会自己的思考了。
2008-12-22 21:36
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
190
不知道是不是我的代码有误,测试了一下,还是有点问题,下面是我生成全查表的代码:
  unsigned char byteA[9];      
  unsigned char key[16];
  unsigned char ks[512];
  unsigned char ByteB[5];//存放B值
  blockcnt = 0;
  *(unsigned int *)(byteA + 5) = blockcnt;
  MD5Data((unsigned char*)byteA, 9, key);
  RC4(key, 16, ks, 512);
  //我已经找到S1与S2的5个交集,分别为p1=2B7  p2=2CF  p3=2D5  p4=2E7  p5=2F0
  ByteB[0] = ks[183];
  ByteB[1] = ks[207];
  ByteB[2] = ks[213];
  ByteB[3] = ks[231];
  ByteB[4] = ks[240];

代码是否是这样?

上面那段代码使用WORD加密文档来测试,生成的B值在WORD加密文档中的对应位置完全匹配。但是使用EXCEL加密文档来测试,生成的B值就不对了,如果修改为
  ByteB[0] = ks[183+58];
  ByteB[1] = ks[207+58];
  ByteB[2] = ks[213+58];
  ByteB[3] = ks[231+58];
  ByteB[4] = ks[240+58];
这样生成的B值才能够与EXCEL加密文档中的对应位置匹配。但是这样生成的B值又不适应WORD加密文档了。

感觉思路有点乱了。。。
2008-12-22 23:48
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
191
我现在想到的解决办法就是:
先使用
ByteB[0] = ks[183];
  ByteB[1] = ks[207];
  ByteB[2] = ks[213];
  ByteB[3] = ks[231];
  ByteB[4] = ks[240];
生成适合WORD的B值,然后再使用
ByteB[0] = ks[183+58];
  ByteB[1] = ks[207+58];
  ByteB[2] = ks[213+58];
  ByteB[3] = ks[231+58];
  ByteB[4] = ks[240+58];
生成适合EXCEL的B值。
然后一起存入到文件中,但是这样生成的全查表的大小就多了一倍的空间啊。如果这样,就失去了找到S1与S2的交集的意义了。继续找其它的方法......
2008-12-23 17:08
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
192
jeffcjh:我这几天都在分析这个问题,百思不得其解,按照我的分析思路,很难产生一个同时适合WORD和EXCEL的全查表,并且这个全查表的大小与之前我生成的只适合WORD的全查表的大小一样。您能否帮看看我的分析哪里出了问题:

    由于要使用同一个生成程序来生成WORD与EXCEL的全查表,那么就必须选取WORD与EXCEL获取B值的同一个位置,那么就必须满足下面几个条件:
1、BLOCK必须设置为0,并且只能是0x200--0x400的地方。这是由于我们根据A值在解密文档的时候,WORD与EXCEL的解密方式几乎一样,都是从0X200处开始解密,不同的地方就是WORD每次获取512字节,EXCEL每次获取1024字节,必须是在这两个的交集的地方,也就是0x200-0x400的地方获取B值。
2、在满足第一个条件的前提下,选取的交集的位置在解密时必须是需要解密的,而不能直接复制或者丢弃的,也就是说,对于EXCEL来说:a、记录头(包括记录类型和记录长度部分)是不能作为交集的选择部分的,b、0x214--0x24D这部分解密时是需要丢弃的,所以也不能作为交集的选择部分。c、其它不需要解密的部分也不能作为交集的选择位置。

    目前已经根据解密后的文档找出了S1与S2的5个交集的地方,假设为P1--P5,那么在生成全查表的过程中,使用RC4(key, 16, ks, 512)函数产生了一个512字节长度的数组,然后我们根据已知交集部分的位置来获取数组相应部分的值,也就是我们前面说的ks[P1]、ks[P2]、ks[P3]、ks[P4]、ks[P5]。现在我就在这个地方的思路被卡住了:
    因为p1-p5我们是根据解密后的文档来查找的,那么对于WORD的加密文档来说,解密的时候是一部分字节原封不动的拷贝到解密文档中,一部分字节需要解密,而没有要丢弃的部分,所以对于p1-p5的交集来说,不管在WORD的加密文档或者解密文档中,位置都是不变的,也就是说根据全查表生成的B值ks[P1]、ks[P2]、ks[P3]、ks[P4]、ks[P5]对应的就是WORD加密文档中相应位置的B值;
    而对于EXCEL的加密文档来说就比较复杂一些,解密的时候除了一部分字节原封不动的拷贝、一部分需要解密,还有一部分字节却是需要丢弃的。所以对于p1-p5的交集来说,在EXCEL的加密文档和解密文档中位置有可能会不相同,我们假设选择的P1-P5的交集部分都在被丢弃字节部分的后面,被丢弃字节的大小为58个字节,那么在EXCEL解密后的文档的交集部分P1、P2、P3、P4、P5,对应于EXCEL加密文档的位置就是P1+58、P2+58、P3+58、P4+58、P5+58,所以在产生全查表的时候,生成的B值所取的ks的数组的位置就是ks[P1+58]、ks[P2+58]、ks[P3+58]、ks[P4+58]、ks[P5+58](这个我做过测试,确实是只有这样产生的B值才能在EXCEL的加密文档中找到)。

    根据上面的分析,使用RC4(K, 16, ks, 512);函数生成ks值后:
对于WORD来说,B值是:(ks[P1],Ks[P2],Ks[P3],Ks[P4],Ks[P5])
对于Excel来说,B值则是:(ks[P1+58],Ks[P2+58],Ks[P3+58],Ks[P4+58],Ks[P5+58])
我想不明白怎样才能使用同一个程序来生成同时适合WORD与EXCEL的全查表。
2008-12-24 16:02
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
193
上面分析的EXCEL的加密文档,是只有打开密码的,而如果还有修改密码的话,那么在0X214的位置还会增加4个字节,也就是说,根据我的分析结果,对于除了有打开密码,还有修改密码的EXCEL加密文档,最后产生的B值是
(ks[P1+58+4],Ks[P2+58+4],Ks[P3+58+4],Ks[P4+58+4],Ks[P5+58+4])
这样对于这三种不同的情况(WORD加密文档、只有打开密码的EXCEL加密文档、同时有打开密码及修改密码的EXCEL加密文档),必须要生成3份全查表才能够解密。显然,说明我的这种产生全查表的方法(或者说我的分析)是有问题的。实际应该是只用产生一份全查表就能够同时适合于WORD及EXCEL的各种加密情况的。jeffcjh,能否再次指点一二?
2008-12-24 16:12
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
194
本来这不是一个什么问题,但既然你又再次表示了疑惑,我还是说一下吧。
首先需要澄清一点,Excel解密后某些记录要丢掉,这其实并不关解密的事(也就是说与乱数数量的多少无关,因为这些没有参与加密/解密的部分,也是要占乱数的位置的。如果你不能理解这点,就暂时不要多想吧。)

下面我以你发给我的Word和Excel解密文件为例,说明两个位置交集的概念。
前面是Word解密文件的某些字节,后面是Excel解密文件的某些字节(没有丢掉记录,它们仍然是要占位置的):

0x200: ECA5C100236009040000F852BF003400
0x210: 000000100000000000060000CE090000
0x220: 0E00626A626A6DA56DA5000000000000
0x230: 00000000000000000000000004081600
0x240: 321400000FCF00000FCF0000CD000000
0x250: 00000000190000000000000000000000
0x260: 000000000000000000000000FFFF0F00
0x270: 0000000000000000FFFF0F0000000000
0x280: 00000000FFFF0F000000000000000000
0x290: 0000000000000000A400340000005604
0x2a0: 000034000000560400008A0400000000

0x200: 0908100000060500E91FCD07C9C00000
0x210: 060300002F0036000100010001009F77
0x220: 09902E7CE8ADBF7BB427A422D47B0038
0x230: 2A6607927B2A8A2D7C16875E77A1004C
0x240: 7F578B42EB09F5B8519CC708851E2020
0x250: 20202020202020202020202020202020
0x260: 20202020202020202020202020202020
0x270: 20202020202020202020202020202020
0x280: 20202020202020202020202020202020
0x290: 202020202020202042000200B0046101
0x2a0: 02000000C00100003D01060001000200

我不知你是用什么原则确定的那5个位置P1-P5,我没看出规律来。实际上,这5个位置的选择是需要遵循某些特点的,一是尽量靠前面,不要到老后面去了;二是尽量集中在某一段,且构成一个等差级数为佳。

无论你说的Excel加密的情况有几种,我所说的位置交集都是很容易找到的。恕我不能把现成的答案告诉你,已经摆在面前了,请用心看看吧。
2008-12-24 20:45
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
195
感谢您在平安夜里还给我解答。
我明白您不直接说现成答案的意思,有线索就行了。谢谢!!!研究中。。。
2008-12-24 21:10
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
196
......我不知你是用什么原则确定的那5个位置P1-P5,我没看出规律来......

我是使用二进制对照工具,分别打开两个文件,对照二进制相同的地方来找出这5个位置的。估计是这个地方有问题。
2008-12-24 21:12
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
197
5个位置靠得近一点,成等差级数(差4为佳),这实际上是根据word文件格式定出来的。你根据上面给出的Word和Excel解密结果基本可以确定。 (你说的Excel有修改口令,也会增加4个字节。注意:4是一个有特点的数量。)
2008-12-24 23:01
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
198
明白了。我陷入一个误区,以为是使用解密后的文档来进行交集的查找,原来还有这么一个技巧在里面。感谢!!!
2008-12-24 23:22
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
199
jeffcjh:
我测试了从OFFICE97、OFFICE2000、OFFICE2002、OFFICE2003这四个版本的OFFICE文档,每个版本都分别有4个文件,分别是:
a、只有打开密码的WORD文档;
b、包括打开密码和修改密码的WORD文档;
c、只有打开密码的EXCEL文档;
d、包括打开密码和修改密码的EXCEL文档。
   
    总共产生了16个文档。这16个文档的S1与S2找不到一个完全的交集,最多只找到了适合13个文档的5个交集交集,而没有适合所有16个文档的1个交集。我除了按照您前面说的方法去找交集之外,甚至还把所有文档的从0x200--0x3ff的所有512个字节取出来,然后与我使用程序产生的相应位置的512个字节的数据做对比,而且对比的数据相差5也算是匹配成功(例如文档中某个位置的数值为A1,程序产生的相应位置的数值为A6或者9C,我也算是匹配成功),然后所有匹配成功的位置做交集,即使这样,这16个文件也没有任何一个交集。

    我把这16个文档都发给您了,有空能否帮看看?
    如果实在不行的话,我就只能生成多个全查表来解密文档了。
2008-12-27 18:43
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
200
如果实在找不到,就算了,你也不能指望把所有情况一次搞定。
能够解决绝大多数问题就行了。
2008-12-27 19:27
0
游客
登录 | 注册 方可回帖
返回
//