一直到提取流这一步,多看下其他人写的介绍复合文档的帖子就很容易能做到.但是后面该怎么做就没找到什么资料了,,没办法,自己看官方的介绍文档吧,.
20页中有这样的一段介绍,上说VBA代码在Module流中,但是有哪些Module,叫什么名字,在什么位置不知道.这些信息保存在dir流中,而且这个dir是肯定存在的.那第一步先到dir中读这些信息.具体的让我们跳到2.3.4.2(30页)中去看
30页第一段又说The entire stream MUST be compressed as specified in Compression (section 2.4.1).也就是说整段流都被压缩过,压缩的,翻到2.4.1(54页),,这关于这个压缩过程的介绍也太多了..没耐心看下去..但看到这个压缩技术叫run length encoding.OK,网上搜一下,搜到一个解压的API RtlDecompressBuffer 直接用就行.
把整段dir流通过RtlDecompressBuffer解压.发现失败了..返回值是个非0值,正确应该是返回0.翻来覆去查看文档..没看出来问题出在哪
106页有个最简单的例子,,01 03 B0 02 61 45 00,解压缩的话结果是73个61,试了一下,同样不行,,,那就试下用RtlCompressBuffer将73个61压缩看看结果是什么,结果是03 B0 02 61 45 00,原来是不要第1个字节拿去解压缩.
刚好看了下dir流,第1个字节也是1,把第1个01去掉再解压缩,函数返回0(表示成功了)
但这个解压缩后的文件仍是个二进制的文件.隐约能看到Thisworkbook,sheet1,之类的东西,从官方文档30页开始,在介绍dir流,前面都是些无关紧要的东西,一直往下翻
30页翻到50页,这里说count(2字节),代表Module的数量,刚好非常巧.前面ID,SIZE是个固定值,为00 0F 00 00 00 02,,我们直接去找找看(注意是低字节在前,搜索应该搜0F 00 02 00 00 00)
搜到这个地方,往后2个字节是Module的数量,为03 00,倒过过就是0x0003,也就是3个模块.做到这一步,几乎可以肯定,前面做得没错.因为这3个模块是thisworkook,sheet1,模块1
一直翻到46页,这里ID 0x0019,下面4字节是长度,然后是模块的名字
搜19 00,后个4个字节是0C 00 00 00,这个表示的是名字的长度,倒过来,表示十进制的12,也就是名字长度12,往后数12个字节,在VBA中可以能过StrConv转成文字,就是thisworkbook
再往后翻到48页, 在文档中搜31 00 04 00 00 00,就可以定位到TextOffset,这个表示VBA代码在module流中的偏移位置..也就是知道这个偏移量就可以定位到代码了
直接定位到模块1的偏移量,应该是0x00000388,
打开模块1流文件,定位到388(这个388是十六进制),刚好可以看到这个地方以01开始,应该是以run length encoding压缩过..去掉01,通过RtlDecompressBuffer解压,再StrConv可转化成文本
得到以上结果.到这一步,成功达到目的,再试了试试其他文件也都顺利,包括 word的vba代码也都能顺序取到.OK
后面什么模块隐藏,让工程不可查看,,都可以修改这个vbaProject.bin文件做到,难度也不大
流2.rar
(3.32 KB, 下载次数: 30)
|