hcxbuild工具用于构建HCX(Hello China eXecutable)文件,即Hello China的可执行文件。应用程序经开发环境编译后,生成的是PE格式的可执行文件。而hcxbuild则PE文件进行进一步的修改,使之符合Hello China的加载需要。具体来说,这个工具对PE文件做了如下修改:
(1)使用一个新定义的文件头__HCX_HEADER,覆盖MS-DOS头。
(2)对PE格式的每个节进行分析,根据它们在内存中的位置重新进行了定位,确保其存储格式与加载格式一致。这样的结果就是,操作系统只需要把文件读入内存即可直接运行,无需再对各个节做重定位。
(3)在PE文件的末尾处增加一个图标,用于显示在操作系统的GUI shell主屏幕上。
hcxbuild的运行结果:如图14-2所示。

图14-2 hcxbuild的运行结果
其中二进制可执行文件,就是待处理的PE文件,而应用程序图标就是附加在PE文件之后的128×128×32规格的位图。一旦选择好待处理的PE文件,工具就会把该文件的相关信息,比如入口点、文件和内存对齐方式、各个节的详细信息等,都显示在“原始文件概要信息”栏内。一旦选择好图标文件,文件内容就会被显示在信息栏右面的图标区域内。
应用程序的可视化名称,是Hello China在枚举该应用程序时显示的名字。主要和次要两个版本号,用于标记程序的版本。最后的目标文件路径及名称,则是最终生成的hcx文件的路径和名称。注意,最后生成的文件的后缀名,一定要为hcx(或大写的HCX)。
使用该工具对PE文件进行处理后,即可把生成的HCX文件复制到Hello China的应用程序目录下(HCGUIAPP目录),这样启动Hello China的GUI功能,即可看到应用程序。点击应用程序图标,即可启动这个应用程序了。(https://www.xing528.com)
hcxbuild的工作原理比较简单,无非是生成一个hcx文件头,然后用这个头覆盖原有的PE文件MS-DOS头。hcx文件头中包含了诸如操作系统版本号、入口地址等等信息。这个过程比较简单,我们重点看一下这个工具如何处理节。
在介绍PE格式的时候,我们指出,节在文件中的位置,可能与被加载到内存后的位置不一致。在VC 6.0中,通过设置/Align等选项,可以确保节的文件相对地址和虚拟相对地址保持一致,但到了VS 2003以上的开发环境,即使这样设置,也不能确保两者一致。下面这个例子说明了这种情况。下面的信息是从hcxbuild工具的“原始信息概要”栏中复制的:

重点关注黑体标注的内容,其中第一列是节在内存中的加载地址(即虚拟相对地址,对应于节头中的VirtualAddress变量),而第二列则是文件相对地址,对应于节头中的PointerToRawData变量。显然这两列是不一样的,文件相对地址比虚拟相对地址要大32个字节(注意上面是以十六进制显示的)。
这意味着PE文件的文件尺寸,要大于被加载到内存后的实际内存占用量。我们需要修改这种情况,使得PE文件的内存布局与文件布局一样。具体修改方式也很简单,无非是把源文件中的节读入内存,然后按照其在内存中的虚拟相对地址,写入另外一个文件(即目标HCX文件)。现摘录部分代码,说明这个过程。为了便于说明,删除了代码中的不相关内容,比如注释、安全检查代码等:


这段代码比较简单,就是使用PE文件的几个头,对源文件进行分析。然后针对每个节,从源文件中读取其内容,然后写入目标文件中VirtualAddress偏移处。这样的结果就是,目标文件的布局,与PE文件被加载到内存后的布局保持一致。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
