ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 31648|回复: 34

Excel 文件二进制结构分析

[复制链接]

TA的精华主题

TA的得分主题

发表于 2002-8-19 09:23 | 显示全部楼层 |阅读模式
Excel 文件二进制结构分析
打哈欠 Email: akala_yahu@yahoo.com 以下内容仅供个人学习研究。未经作者同意,不得转载、刊登全部或部分内容。如有需要,请与作者联系。 序 我对 Excel 文件结构的学习研究,也是最近才开始。只是好奇,拿出改游戏的劲头与手段,一点点的啃。发觉似乎有不少人也对该文件格式感兴趣。只是很可惜,我找不到能力足够、并且愿意一起共享心得体会、共同学习的同道。 一人独行,自然倍感寂寞,兴趣的火花也就时燃时灭;再加上我人比较懒,工作忙,也难以抵御外界的种种诱惑,比如娱乐、游戏、小说等等,所以,火花也就灭的时候居多。这里就先请读者原谅,打声招呼,如果这篇文章写得太慢,或者不能最终完成,千万不要骂我。当然这是闲话了。 另外,因为没有正式的资料,既然是研究,下面的内容也可能全盘皆错。有早知早觉的大侠,想批,请随便拿砖头砸吧! 第一章 前言 一、前人的研究 能够找到的前人研究资料不多。MSDN online里有部分,可惜组织得很零散,微软也删除了重要内容。有人说 MS Office Develop 附带的MSDN Library 中有介绍,可是我没有这个东东,也无从知道讲了什么东西。如果有人有这些东西,不知是否方便发给我看看。先谢谢了! 不过,我还是按照我所知道的来写吧! 1996 年,德国人 martin Schwartz 写了一篇语焉不详的“Hacking Guide”,他研究了Word 6的存盘文件,文章里他叫这种文件结构为Laola。他认为Laola是一个文件系统,包含子目录与子文件。照搬到Excel中,根据这种思路,Excel 里的workbook、或VBA,都应该是一个子文件,微软好象叫它们OLE2 Storage,也就是说,一个 Excel 文件,包含了一个目录结构和若干个子文件,每个子文件都是一个 OLE2 Storage。我们下面就沿用martin Schwartz定义的Laola的概念。 不过,martin Schwartz最大的贡献是用 Perl 4 写了一个Package (类似于 VBA 里的类),提供了读取 Laola 文件系统的方法。(我正在用VBA重写这个Package,并增加写模块,工作忙,断断续续,所以还没写完)。 1997 年的《Excel Digest》里发表了一篇文章,作者是Guy Boertje,内容是一个读取Workbook里用户定义数字格式的VBA。他用的办法是直接在Excel文件里直接搜索Workbook BOF记录(Beginning of File,标识是Hex 0809),找到文件的起始偏移。关于这样的VBA程序,大家可以参考我的文章(读取 Excel 工作表的背景图片),发表在坛子里。因为当时还不知道Laola的概念,所以读出来的图片时对时错。 二、分析Excel 文件二进制结构的基本工具 为了简化,我们就使用三个基本工具,也大致够用了。一个是UltraEdit 32,可以16进制的形式编辑二进制文件。另外一个工具是WinHex,这个工具的主要特点是可以进行二进制比较,也可以直接编辑机器内存中的二进制数据,实在是改游戏、做 memory dump 的利器。再一个工具就是Windows中的计算器,我们可以用他来完成十进制——十六进制——和二进制的转换。 好,有了这些工具,我们就可以开始。 另外,讲三个基本常识: 1、数字的表示方式: 十进制:我们就用一般的表示方式,比如“1234”。 十六进制:表示为“Hex 1234”或“0x1234”。 二进制:表示为“Bin 1001”。 2、数字的存放顺序 数字在Intel的机器,二进制文件中是顺序存放的,比如 Hex 0809,就表示为0x09 0x08,高位在后,低位在前。 3、基本数据类型 我们主要涉及到三种数据类型,字节(Byte)、字(Word,占两个字节)和双字(Dword,四个字节),Word和Dword就相当于无符号的整型和无符号长整型。 第二章 Laola 结构 这第二章我们先研究 Laola 结构,第三章学习Workbook的结构,也就是xiaog贴出来的东西,第四章看看VBA,第五章就是Excel 文件中根据Laola概念分解出来的,其它有趣的东东;第六章,应用工具程序示例,我就想把一些读取Excel的VBA程序、以及通过ADO方式的VBA程序和C++程序归为这一章。 如果没意见,我们继续。 Excel 文件中的第一个512字节块(0x200),是Laola的初始块,从偏移0x00到0x1FF。我们先拿80字节出来学习一下。 0x00000h: D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 0x00010h: 00 00 00 00 00 00 00 00 3E 00 03 00 FE FF 09 00 0x00020h: 06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 0x00030h: 19 00 00 00 00 00 00 00 00 10 00 00 FE FF FF FF 0x00040h: 00 00 00 00 FE FF FF FF 00 00 00 00 18 00 00 00 偏移00开始是Laola标识,“D0 CF 11 E0 A1 B1 1A E1”,表示这是一个Laola文件系统。 偏移0x18是Word,可能是小版本号, 偏移0x1a是Word,可能是版本号,一般为3。 偏移0x 1e是Word,表示块的大小,固定为9,是2的幂次(2^9为512字节) 偏移0x 20表示小文件块的大小,2^6为64字节。 好,作了一个简单的示例,我们再讲讲一些Laola中的概念。 1、初始块 就是Excel 文件中的前512个字节。这个块中数据结构的定义表我们放在本章末尾列出,在本章的各个部分我们将逐步分析这个初始块的含义。 2、大文件块文件表 大文件块文件表是存放文件块索引号的, 比如, 0x0003200: 01 00 00 00 02 00 00 00 03 00 00 00 05 00 00 00 0x0003210: FE FF FF FF 06 00 00 00 07 00 00 00 FE FF FF FF 0x0003220: 09 00 00 00 0A 00 00 00 0B 00 00 00 0C 00 00 00 0x0003230: 0D 00 00 00 0E 00 00 00 0F 00 00 00 FE FF FF FF 0x0003240: 11 00 00 00 12 00 00 00 13 00 00 00 14 00 00 00 0x0003250: 15 00 00 00 16 00 00 00 17 00 00 00 FE FF FF FF 0x0003260: FD FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 索引号从0开始编号,一个DWORD表示一个索引。 索引的取值范围: 0xFFFFFFFD:特别块 0xFFFFFFFE:索引链结束标志 0xFFFFFFFF:未使用 0… 文件块总数:索引链中的下一个元素 大文件块文件表中是按索引链的方式排列的,通过索引链我们可以将在Excel文件中若干个不连续排放的大文件块,组织起来。 比如,我们先建立一个空的大文件块列表“{}”,我们从偏移0x0003200 + 0*4 (0为索引)中取DWORD,值为1,所以把0和1放入大文件块列表中,为{0, 1};偏移0x0003200 + 1*4处数值为2,所以把2放入列表中,为{0, 1 , 2};再到偏移0x0003200 + 2*4处取数值,为3,如此往复,一直到偏移0x0003200 + 7*4,数值为0xFFFFFFFE,表示索引链结束,而大文件块列表已经为{0, 1, 2, 3, 5, 6, 7}。这样,我们就已经取得了一个应该连续排放的若干个大文件块。 (休息一会儿,待续…..) 讲两个笑话轻松一下: 一位漂亮的女孩养了一只鹦鹉,一天女孩在浴室洗澡,鹦鹉说:“看到了,看到了。” 女孩生气地对鹦鹉说:“再叫就拔光你的毛。” 第二天一位光头的客人来到家里,鹦鹉偷偷地飞到客人的肩头,悄悄地说:“你也看到了吗?” 一个人养了一只鹦鹉,非常厉害,和它关在一起的其他鸟都被它打死了。后来主人弄回来一只鹰和它搁在了一块,等主人在来看,笼子外面挂着鹦鹉的毛。主人说:“这会不牛逼了吧。”可在仔细一看。是鹰死了,鹦鹉光着个身子说:“这孙子真厉害,不脱光膀子还真打不过丫挺的。”

TA的精华主题

TA的得分主题

发表于 2002-8-19 09:40 | 显示全部楼层
在线等待。待续。。。。 笑话也不错。

TA的精华主题

TA的得分主题

发表于 2002-8-19 10:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
期待下文! 感谢与大家分享!

TA的精华主题

TA的得分主题

发表于 2002-8-19 13:40 | 显示全部楼层
深感功力不足,但还是看完全文。 打哈欠真是好同志啊!佩服!致敬!期待……

TA的精华主题

TA的得分主题

发表于 2002-8-19 22:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看了前些日子的《Excel文件属性》文章,又看到这篇《Excel文件二进制结构分析》,我不禁要为本论坛的学术气氛叫好。真佩服高手们孜孜追求的钻研精神,真是我等的学习楷模。在DOS时代我也曾分析过一些文件的格式,目的就是能理解、操作和利用他们的格式,为自己的编程找出路子。不过DOS时代的文件规模都很小,不过几K或几十K,最大也不过百八十K,结构也简单,稍一坚持就能完成,不足为奇。Windows时代的文件就不同了,K 已经换成 M ,看着就吓人,明知任何格式的文件都是有严格的格式规范的,却不敢着手分析它们,就得着吃现成的。也只有在这个论坛上让我看到了许多敢于向未知冲锋的人,这是这个论坛必然兴旺发展的象征,在向这几位高手赞叹佩服之余,更祝愿ExcelHome广大Excel爱好者离不开的家。

TA的精华主题

TA的得分主题

发表于 2002-8-19 23:09 | 显示全部楼层
我相信 “打哈欠” 在生活中是一个 不畏艰险 行侠仗义之士

TA的精华主题

TA的得分主题

 楼主| 发表于 2002-8-20 09:54 | 显示全部楼层
今天才注意看了前面的帖子, 这篇文章看来是有点越位,脱了 Excel 的衣服来欣赏,可能不受欢迎。 各位版主,我越位了,抱歉抱歉! 我把后续的文章的文章转移走吧! 各位读者,对不起了。如果有需要,可以再跟我联系。

TA的精华主题

TA的得分主题

发表于 2002-8-20 12:58 | 显示全部楼层
很好的基础性研究,我最初做中文汉化的时候,也是看了这类文章才学会了 16 进制操作的. 放着,挺好.

TA的精华主题

TA的得分主题

 楼主| 发表于 2002-8-20 17:51 | 显示全部楼层
谢谢 Rowen 版主。 这样我就继续写。 不过,我向读者事先声明,我很懒,工作也忙,写得太慢,千万不要骂我。只要有人想看,我就继续。

TA的精华主题

TA的得分主题

发表于 2002-8-20 20:35 | 显示全部楼层

to 打哈欠

很好呀!何必妄自菲薄。我期待后续文章。翘首期待。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-19 06:53 , Processed in 0.040834 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表