首页
社区
课程
招聘
从CHM的编译说起
发表于: 2006-5-13 17:15 15709

从CHM的编译说起

nbw 活跃值
24
2006-5-13 17:15
15709

从CHM的编译说起

by nbw[NE365]
注:本文纯属虚构,如有侵权,纯属巧合
       
       
        51回家没事。想看一下CHM电子书是怎么做的。国内好多做电子书的小软件。比如耶书制作、EasyCHM等等。原理都是一样的。
       
        这里我们拿EasyCHM看看怎么生成CHM文件的。
       
        事先声明一下,市面上的CHM编译和反编译都做得很龌龊。如果你想看具体的算法之类,以后再研究吧。

        EasyCHM制作CHM文件的过程:

                1、首先生成 hhc.exe;
               
                2、再生成三个配置文件:
                                FASM.HHP
                                INDEX.HHK
                                TOC.HHC
               
                3、然后调用hhc.exe:
                                CommandLine = ""C:\Program Files\EasyCHM\hhc.exe" "F:\DisCHM\FASM\FASM.HHP""
                                0051E443     call EasyCHM.00407308                   ; jmp to KERNEL32.CreateProcessA

        好了。电子书就制作好了。

        命令行运行一下hhc.exe,显示如下信息:
       
                Usage:   hhc <filename>
                    where <filename> = an HTML Help project file
                Example: hhc myfile.hhp

        按照提示正常编译一个CHM工程,输入上面的CommandLine,可以编译出来一个正常的CHM文件,同时hhc会有以下编译提示:
       
                Microsoft HTML Help Compiler 4.74.8702
               
                Compiling f:\DisCHM\FASM\FASM.CHM
               
                00.htm
                01.htm
                02.htm
                03.htm
                TOC.HHC
                INDEX.HHK
                C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\EasyCHM.html
               
                Compile time: 0 minutes, 1 second
                11      Topics
                16      Local links
                13      Internet links
                0       Graphics
               
               
                Created f:\DisCHM\FASM\FASM.CHM, 47,420 bytes
                Compression decreased file by 261,481 bytes.

        到了这里也就很明显了,他用的是MS出的这个工具来生成CHM文件。

        hhc.exe调用了HHA.dll文件的导出函数 #319 来进行编译,如下:

                004011A0   |> \57              push edi                                                                                        ;para4
                004011A1   |.  68 0D104000     push 0040100D                                                                ;para3
                004011A6   |.  68 00104000     push 00401000                                                                ;para2
                004011AB   |.  FF33            push dword ptr ds:[ebx]                        ;para1
                004011AD   |>  E8 22720000     call <jmp.&HHA.#319>

        看一下堆栈变化,该函数共4个参数。

        para1:
        ASCII "Compiling f:\DisCHM\FASM\FASM.CHM"

        para4为0,也不具体深究了。其中para2和para3是2个函数指针,指向的是2个外部函数,具体如下:

                //该函数用来输出编译信息
                00401000       FF7424 04       push dword ptr ss:[esp+4]                        //这里是需要输出的信息,比如ASCII "Microsoft HTML Help Compiler 4.74.8702"
                00401004       E8 17020000     call 复件_hhc.00401220
                00401009       59              pop ecx
                0040100A       C2 0400         retn 4
               
                //该函数很简单,估计这里 eax = 1是一个编译选项。
                0040100D       6A 01           push 1
                0040100F       58              pop eax
                00401010       C2 0400         retn 4

        这2个参数很特殊。
       
                由于编译时候需要实时把编译信息输出,所以由外部调用函数hhc.exe提供一个信息输出函数供HHA.dll可以及时把需要输出的编译信息显示出来。也就是para2。
        但para3仅仅为了提供一个参数,也采用此方法就有些不可思议了。

        反编译了其他调用这个函数的地方,也没发现有别的意义。与其说作者有其他考虑,还不如说就是编写时候的败笔。因为程序中还残留不少作者用于测试时候的代码:

        00401080   |.  68 C8B04000     push 复件_hhc.0040B0C8                                ;  ASCII "Cannot open hhctest.hhp"
        00401085   |.  E8 96010000     call 复件_hhc.00401220

        HHA.#319生成最后的CHM文件,需要提一下的是这里调用了系统自带的itss.dll来完成最后的工作。

        回头看一下MS的这个编译CHM文件的过程,总体还是比较混乱的。
       
        导出函数命名混乱,如#319等。模块化也不强,来回调用了数个dll,也感觉不到有什么太大意义。传递外部函数给第三方使用,貌似不符合如今的软件工程。有不少残余代码发布时候未曾去掉。

        但回头考虑一下这些xx年前采用VC 4.x编写的代码,令人感受到的不是作者水平以及MS管理得如何,而是前辈们创业发展过程中的辛酸。
       
        有时间说一下反编译。相对来说反编译要比这个要麻烦些了。
       
        看一下这个软件的介绍:
       
                主要功能:
                全自动的目录及文件导入(可以包括子目录);
                支持导入任意的文件类型;
                自动生成CHM的目录列表并自动生成所有目录项;
                为CHM的目录列表自动添加多级编号;
                批量更换CHM目录各项的图标;
                支持批量查找替换多级目录各项的标题文字内容;
                允许用户指定从文本文件的第N行自动截取标题;
                易用的目录编辑器;
                丰富实用的CHM制作选项帮助用户制作更加个性化的专业CHM电子书或CHM帮助文件。
                内嵌CHM反编译工具。
                轻松制作上下文相关的帮助文件        
       
        可以说最前面xx条功能主要都是MS的hhc.exe做的,作者花很大功夫做的“CHM反编译工具”被低调放在了最后,为什么这么不尊重自己的劳动呢?因为大家要挣钱吃饭,要养家糊口,就要把用户最需要的功能放在前面。
       
       
       
        附件里面是hhc.exe和一个工程所需要的文件。


[注意]APP应用上架合规检测服务,协助应用顺利上架!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
慢慢学习。。
2006-5-13 17:49
0
雪    币: 235
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
顶,可以自己动手做了。
2006-5-13 18:41
0
雪    币: 235
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
顶,可以自己动手做了。

网速慢,不小心发了两次。
2006-5-13 18:42
0
雪    币: 440
活跃值: (832)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
5
好久不见nbw发文章了,顶上去。
2006-5-13 21:27
0
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
6
Niu Bi Wang啊
2006-5-13 22:02
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
7
不顶是不行的~

2006-5-13 22:06
0
雪    币: 5275
活跃值: (476)
能力值: (RANK:1170 )
在线值:
发帖
回帖
粉丝
8
让我想起了很久以前写的一段代码,就是借助hhc.exe感染本机所有的chm文件。

你最近咋开始研究这个了
2006-5-13 22:07
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
9
最初由 tankaiha 发布
让我想起了很久以前写的一段代码,就是借助hhc.exe感染本机所有的chm文件。

你最近咋开始研究这个了


有这种感染的?你回头给我说一下。我也不是最近搞得,是51回家没网阿,只好从本机弄点东西看看。
2006-5-13 23:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好文章,顶.........
2006-5-13 23:48
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 无梦徽州 发布
我也这样认为:NBW 是Niu Bi Wang


比啥笔你牛?的多吧?
2006-5-14 08:51
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
12
                    
2006-5-14 09:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
仔细看看~学习一下~
2006-5-14 12:02
0
雪    币: 367
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
好像反编译CHM也是微软自己的工具完成的吧
2006-5-14 12:16
0
雪    币: 431
活跃值: (462)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
15
还有某些编辑RM的工具,其实全是调用RealProducer Plus中的东西。
2006-5-14 13:09
0
雪    币: 250
活跃值: (103)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
16
支 持 !
2006-5-14 21:21
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
17
支持一下。
2006-5-14 22:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
最初由 eating 发布
比啥笔你牛?的多吧?
麻烦请问一下,你什么意思?我引用这句话,是表示对楼主技术的钦佩.
2006-5-14 22:49
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
19
最初由 无梦徽州 发布
麻烦请问一下,你什么意思?我引用这句话,是表示对楼主技术的钦佩.


他就这样没事就骂人,别跟他一样。汉。

CHM的反编译也是调用的MS库里面的东西。
2006-5-14 23:36
0
雪    币: 241
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
中间的部分code没懂
2006-5-15 02:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
最初由 nbw 发布
他就这样没事就骂人,别跟他一样。汉。

楼主说的对,怎么能和那样的人计较.
  北岛写过:"卑鄙是卑鄙者的通行证/高尚是高尚者的墓志铭."
2006-5-15 19:04
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jbg
22
学习学习..
2006-5-17 09:36
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
23
最初由 无梦徽州 发布
楼主说的对,怎么能和那样的人计较.
北岛写过:"卑鄙是卑鄙者的通行证/高尚是高尚者的墓志铭."


你Y果然高尚
2006-5-17 11:24
0
游客
登录 | 注册 方可回帖
返回
//