|
盒子资源分类 |
|
|
|
|
UnWebCompiler v1.01 |
|
关键字:UnWebCompiler LHA 反编译 |
来 自:转载,http://www.winu.cn/thread-1714-1-1.html |
平 台:Win2k/XP/NT,Win2003 |
下载所需:0 火柴 |
深浅度:中级 |
完成时间:2002/9/22 |
发布者:dfw@94378 |
发布时间:2007/10/7 |
编辑器:DELPHI6 |
语 种:简体中文 |
分 类:文件 |
下载浏览:874/10079 |
|
|
|
|
WebCompiler 1.01 反编译 WebCompiler 生成的 .EXE 文件中的文件. 修正了 1.0 中的一处 bug, 修正了文件压缩与否的判别方式, 也稍稍增强了用户界面.
关于 WebCompiler 的源文件的获取
前段时间在做一个文档时需要得到一个 WebCompiler 生成的 EXE 文件中包含的 .htm 源代码,但在我的机器上源代码已经丢失, 我想通过某种方式找回它们, 于是到 WebCompiler 的主页去看有没有什么方法,但该程序主页是的说明令人失望, 以下是该程序主页上的说明:
问 I've lost the source files for my presentation. Is there any way to decompile the presentation to get back to the source?
答 No, afraid not. Whilst it would be technically possible to do so it would involve an awful lot of work which we don't intend to undertake.
失望之余, 我又在网上找其它的相关工具,找到一个 unWC.exe ,但该程序的未注册版本不能解压出全部的文件(至少有三分之一的文件的内容被故意清除). 没办法,我只好自己从 EXE 文件中解压出 .htm 源代码来.
通过对 WebCompiler 生成的 EXE 文件的分析,发现保存在其中的数据文件是以标准的 LHA 格式压缩保存的. EXE 文件大体上由三部分组成,它们依次是:1 是控制部分, 2 是压缩后的数据, 3 是压缩文件的文件名等信息. 我们首先从文件尾说起:
文件尾结束串为 EF 51 2A 01
"文件尾结束串" 前面四字节指,指向压缩数据文件的文件名信息块,文件名信息块的开始的四字节是该 EXE 文件中包含的数据文件数.
接着上面所述的是各文件的文件名信息,每一个文件的文件名信息由以下内容组成:
1 开始四字节是文件名长度. 2 接下来四字节是该文件的 *压缩数据在 EXE 文件中的偏移位置* 3 接下来四字节是 *压缩数据的长度* 4 接下来是四字节标识 2CEDFE7F (也许是文件日期什么的,但与本程序要达到的目的无关,就不去研究它了) 5 接下来四字节是该文件的标题一的长度(如果有的话),紧接其后的着是标题一的正文 6 接下来四字节是该文件的标题二的长度(如果有的话),紧接其后的着是标题二的正文
上述的文件名及标题都是经过加密处理的,加密/解密的算法是(当然,加密解密都用它):
for j := 1 to filenamelen do begin while aj > 129 do aj := aj - 129; ii := ord(Buffer[j]) xor (aj + 126); s := s + CHR(ii); inc(aj); end;
其中的加密参数 aj 是累加的(所有的文件名长度+标题一长度+标题二长度累加),当大于 129 时则减去 129 (以 129 为模的余数)
每个压缩文档以 SPIS.LH5 开始 (其中的 "." 是 ascii 的 26),接下来的四字节是压缩前的文件长度
压缩是采用标准的 lha 模式五的压缩法,只是文件头与 lha 标准不同,文件头是放在别的地方而没有在压缩数据本身之中.
有些文件是没有压缩的,如 .jpg/.gif 等,具体情况请看程序中的处理和注释. ********** ********** 有任何问题可以我们联系: RMH: njjane@21cn.com ********** **********
附 lha 文件格式: ********** LHA, LZH, LZS (LHArc 压缩文件) 格式说明 *** LHA, LZH, LZS (LHArc 压缩文件) *** 文档 revision 1.1 **********
这些文件是由 LHA 在 C64 (或 C128) 的基础上创建的, 并可以代表典型 PC 用户的特殊问题. 压缩使用的是 LH1, 一种 LZH 1.xx (pre-version 2) 使用的老式的方法, 因此在 PC 上许多版本的 LHA 都可以解压它们. 但是, LHA 允许文件名多至 18 字节长, 而 DOS 不知道应该如何处理长文件名 (Windows 95 的 unLHA 实用程序可以解压出完整的长文件名). 通常, 因为在 DOS 下的文件名相同(指长文件名切短为短文件名后) 一些已经解压的文件将被其它正在解压的文件复盖. 但对于 LHA 来说, 这些文件名是相当不同的.
LHA 文档总是在文件中有着使用的压缩类型的串 ("-L??-") . 在整个 LHA 的开发周期使用过一些不同的压缩算法. 在 "-L??-" 中的 "??" 可以是一系列可能的值, 但在 C64 它好象被限制到 "H0" (无压缩) 和 "H1". 但是 LHA/LZH 版本使用了其它的组合如 "H2", "H3", "H4", "H5", "ZS", "Z5" 及 "Z4" 等. 在压缩串中使用的字母通常来自 LZ 算法, Lempel/Ziv 算法的最初的创建人和 LHA 程序的作者 Haruyasu Yoshizaki 的组合.
以下是一个 LHA 头的示例. 注意字节 $0002 开始的串:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII ---------- ---------- 0000: 24 93 2D 6C 68 31 2D 39 02 00 00 16 04 00 00 00 ..-lh1-......... 0010: 08 4C 14 00 00 0E 73 79 73 2E 48 6F 75 73 65 20 .......... 0020: 4D 34 00 53 DE 06 11 1C 12 C4 C8 FA 3A 5B DC CE .......... 0030: B2 FA 38 1E 46 B0 B6 9E 9B 75 7A 49 71 72 B3 53 .......... 0040: 6E 4E B4 A0 BF 5E 95 B3 05 8A 75 D5 6C E3 03 4A .......... 0050: 2C 54 F4 AF 05 18 59 E2 F4 34 4A 0A 28 D4 33 E2 .......... 0060: C4 9D 04 D7 C7 8B 91 66 0E E5 DE 98 3C 92 CC B5 ..........
头的外观相当直观. 各文件的头开始于串 "-lh?-" 的前 *两* 字节. 上面的示例已经包括了这两个字节. 各个头有相同的外观, 只有代表文件长度的值是变化的. 下面是上面的示例的说明.
字节 $0000: 24 - 头的长度 (也就是下文中的 "LEN", 不包括该字节和下一字节). 如果是零, 则已经到了文件尾. 0001: 93 - 头的 checksum 0002: 2D 6C 68 31 2D - LHA 压缩类型 "-LH1-" 0007: 39 02 00 00 - 压缩后的文件大小 ($00000239) 000B: 16 04 00 00 - 解压后的文件大小 ($00000416) 000F: 00 08 4C 14 - 时间日期 stamp 0013: 00 - 文件属性 0014: 00 - 头的级 00 = 非扩展头 01, 02 = 扩展头 0015: 0E - 跟随在后的是文件名 0016: 73 79 73 2E 48 6F 75 - 文件名, 带的一个零和添加的文件类型 73 65 20 4D 34 00 53 ("SYS.HOUSE M4"). 文件名可以多至18 个字符长. 注意长度 *包括* 零和文件 类型, 实际的文件名长该数值小 2 字节. 0024: DE 06 - 文件数据 checksum (开始于 LEN) 0026: 11 1C 12 C4 C8 FA... - 文件数据 (开始于 LEN+2)
在 $0001 位的头的 checksum 是按添加从 $0002 (LHA 压缩类型) 到 LEN+1 (文件数据 checksum) 的字节数来计算的, without carry.
time/date 印 (第 $000F-$0012 字节), 分为以下两部分:
字节:$000F-0010: 最后修改时间: 位 0- 4: 秒除以 2 (0-58, only even numbers) 位 5-10: 分 (0-59) 位 11-15: 小时 (0-23, 不是 AM 或 PM) 字节:$0011-0012: 最后修改日期: 位 0- 4: 日 (1-31) 位 5- 9: 月 (1-12) 位 10-15: 年减去 1980
要在这里给出压缩数据的格式就太困难了. 因为要理解压缩数据的格式要求具有 Huffman 编码和 sliding 字典的知识, 而且与 ZipCode 没有相似之处!LHA 源代码中给出的不同压缩模式的说明如下:
-lh0- 无压缩, 只保存文件 -lh1- 4k sliding 字典 (最大 60 字节) + 动态 Huffman + 固定位置解码 -lh2- 8k sliding 字典 (最大 256 字节) + 动态 Huffman -lh3- 8k sliding 字典 (最大 256 字节) + 静态 Huffman -lh4- 4k sliding 字典 (最大 256 字节) + 静态 Huffman + 增强的位置和树解码 -lh5- 8k sliding 字典 (最大 256 最大) + 静态 Huffman + 增强的位置和树解码 -lzs- 2k sliding 字典 (最大 17 字节) -lz4- 无压缩, 只保存文件 -lz5- 4k sliding 字典 (最大 17 字节)
有一些你可以用来解压这些文件的实用程序, 如上面提及的 PC 上的 LHA 或 Star LHA. 如果你使用 Star LHA, 记住它需要程序 LHA v2.14 (或以上) 来进行解压. 如果使用较早版本的 LHA (如通用版本 2.13), 则解压文件将损坏. 它将直接解压文件到一个 D64 文档, 因此长的 C64 文件名将不会丢失.
对于一个不使用这些文件的 emulator 用户, 由于它们只是利用 C64 来保存和传送文件的好处. PC 上的标准压缩程序是 PKZIP (或 ZIP 兼容), 因此除非你需要发送 *压缩后的* 文件回 C64, 此方法在 LHA 中没有使用(指不压缩模式). ********** LHA, LZH, LZS (LHArc 压缩文件) 格式说明 *** LHA, LZH, LZS (LHArc 压缩文件) *** 文档 revision 1.1 ********** |
|
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们! |
相关文章 |
|
|
|
相关评论 |
|
|
|
|