2024年4月7日发(作者:)

CHEMCAD的汉化及其帮助文件在线功能的恢复

戴 斌

徐 宏

1

(南京化工职业技术学院化学工程系 南京 210048)

摘要:本文介绍了CHEMCAD的汉化技术及其帮助文件在线功能恢复,探索出了一条CHM格式帮助文件汉化后恢复在线帮助功

能的技术路线:使用Microsoft HtlmHelp Workshop反编译原帮助文件,翻译网页格式的帮助文档,使用反向工程工具IDA pro或

OllyDbg追踪出原帮助文件的帮助主题ID,重新编写预定义别名和ID的头文件,连同汉化后的网页,重新使用Microsoft HtlmHelp

Workshop编译成CHM格式的帮助文件,即可恢复汉化后帮助文件的在线帮助功能。

关键词 汉化 在线帮助 反向工程 CHEMCAD IDA pro OllyDbg

Location of CHEMCAD and Recovery of It’s On-line Help Function

Dai Bin

1

Xu Hong

1

1

(Department of Chemical Engineering, NanJing College of Chemical Technology, 210048

China)

Abstract: A technical route about recovering the function of on-line help which is chm format file after it is localized is explored: first, using Microsoft HtlmHelp

Workshop to decompile the original help file and then translating the web pages; second, using reverse engineering tool, IDA pro or OllyDbg, to trace the help topic ID

of original file; finally, rewriting the alias and ID in the header file, along with the localized web pages, to be compiled into chm format help file by Microsoft

HtlmHelp Workshop again. So the on-line help function is restored after location.

Key words: Localizion on-line help reverse engineering CHEMCAD IDA pro OllyDbg

0 引 言

化工流程模拟软件CHEMCAD作为辅助教学软件被引入到课程教学中,极大的提高师生专业知识融会贯通和应用能力;但是

CHEMCAD一直是英文版的,这使得只有既懂化工流程模拟的原理又具有很强的英语水平的人才能正常的学习和使用它。随着化

工生产要求的进一步提高,对化工流程模拟软件的使用普及是大势所趋,然而具有大量专业词汇的流程模拟软件对广大非英语语

种的工程师及高职层次的学生来说,是一个难以逾越的障碍。英文软件的汉化,网上有不少资源介绍,笔者也是在学习了这些资

料后,汉化了CHEMCAD;采用的技术如下:①使用SDL Passolo 汉化CHEMCAD的主窗口和菜单,②使用CHEMCAD自身的

二次开发工具如Dialog Editor汉化各个单元操作设备的窗口,③汉化如、等的外挂文件,这些文件主要用于显

示消息框和结果报表,④针对结果报表中的中文乱码,使用UltraEdit32修改CHEMCAD中相关动态链接库文件中有关字体字号

的反汇编代码,⑤汉化帮助文件。⑥使用Wise Installation System制作中英文版的补丁包。但是当笔者汉化了帮助文件之后,却发

现无法实现其原有的在线帮助功能,着实是一个很大的遗憾,网络上也鲜有解决此问题的帖子。下面就以笔者汉化的帮助文件

为例,讨论一下以在线帮助功能实现机制为基础,应用反向工程来恢复在线帮助功能的技术路线。

1 研究方法与实现

1.1 选用编译和反编译CHM格式帮助文件的软件

反编译帮助文件,可以将帮助文件的各个章节离解成一个个的网页文件,然后逐个翻译即可;翻译好的网页再通过编译,制

作成帮助文件。编译和反编译CHM格式帮助文件的软件有很多,但是考虑到今后在线功能的恢复,最好是用Microsoft HtlmHelp

Workshop,因为它可以提供映射表的制作,这是实现在线功能所必须的步骤。

1.2 Htmlhelp帮助系统的接口

调用CHM格式的帮助文件需要用HtmlHelpAPI函数HtmlHelp(),这个函数驻留在HtmlHelp ActiveX控件中

[1]

函数HtmlHelp()语法如下

[2]

HWND HtmlHelp(HWND hwndCaller, LPCSTR pszFile, UNIT uCommand, DWORD dwData)

参数hwndCaller为调用HtmlHelp()的窗口句柄,pszFile为文件、URL,或是经过编译的帮助文件的路径,uCommand指定了

要执行的动作,dwData是uCommand所需要的参数。

1.3 实现在线帮助的机制

[3,4]

所谓在线帮助,就是当应用程序弹出某一个人机交互窗口的情况下,按下F1键,将直接弹出该窗口所对应的帮助页面。

收稿日期: 2011-12-28。

作者简介:戴斌,硕士,讲师,主研领域:化工流程模拟与优化。

例如在CHEMCAD中,双击流程图中某一个单元设备图标,弹出该设备操作参数窗口,点击该窗口左

下方的帮助按钮,或按F1,即可调出帮助文件所对应的该设备的帮助页面。

要实现程序的在线帮助,从MFC提供的帮助函数来看,要直接调用HTMLHelp,则需要提供给按钮“帮

助”一个执行函数。使用ClassWizard增加按钮“帮助”的单击消息处理函数。以CHEMCAD中“简捷精

馏塔”的窗口实现在线帮助为例,“帮助”按钮单击消息处理代码可能如下:

ON_BN_CLICKED(ID_HELP, OnHelp)

void CVchelpDlg::OnHelp()

{

// TODO: Add your control notification handler code here

HtmlHelp(NULL, "", HH_HELP_CONTEXT,3002);

}

上述HtmlHelp函数中的 3002这个数值,就是程序员为“简捷精馏塔”的在线帮助页面指定的帮助主

题ID。大型的帮助文件通常包含许多在线帮助页面,程序员分别为它们分配一个唯一的ID,并编写一个.h

格式的头文件,预定义在线帮助页面的别名和ID;没有这样的头文件就无法实现在线帮助功能。

1.4 恢复在线帮助的功能

要想恢复汉化后帮助文件的在线帮助功能,关键是获得预定义在线帮助页面的别名和ID的头文件,如

果程序的作者不能直接提供给你,那就只能通过反向工程跟踪主程序调用HtmlHelp函数的动态过程。笔者

主要使用了汇编级工具IDA pro和OllyDbg,前者以静态分析分析为主,后者以动态跟踪分析为主

[5]

通过对调用函数HtmlHelp()实现在线帮助功能的机制分析可知,函数的第一个参数NULL;函数的第

二个参数是文件名 “*.CHM”;第三个参数是HH_HELP_CONTEXT,这个参数在Microsoft HtlmHelp

Workshop文件夹下的“HtmlHelp.h”头文件中被预定义为0F,即第三个参数是数值0F;如果在反汇编代

码中找到以上信息,那么就容易找到第四个参数——帮助主题ID的数值了。下面以笔者恢复汉化后的帮助

文件为例,分别应用IDA pro和OllyDbg追踪到帮助主题ID的过程。

(1) IDA pro 追踪法

用IDA pro 5.0打开CHEMCAD的运行程序,在“strings”窗口查找“”,共计6个,逐个双

击找到的字符串,返回到反汇编窗口——“IDA View-A”,字符串处于“初始化的数据块”,通过“跳转”

菜单下的“跳转到操作数”或“跳转到交叉参考”查看在“指令代码”区块中参数传递的代码,如果在该

代码附近有“push 0F”,可以初步判断为函数HtmlHelp()对四个参数的读取和传递,如图1所示;

图1 函数HtmlHelp读取参数的反汇编代码区

在图1显示的“push 0Fh”之后,有三个“call”,尽管“sub_4A6C11”没有被IDA pro分析出是函数

“HtmlHelp”,把鼠标放在“sub_4A6C11”上面,显示出这个函数有5个指针参数,符合调用函数HtmlHelp

时参数压入内存堆栈的情况。跳转到地址“4A6C11”,在这一段代码中有字符串“”,更加证明

了“sub_4A6C11”就是函数“HtmlHelp”。

接着在该地址处设定断点,然后按“F9”开始跟踪调试,IDA pro打开CHEMCAD后,按下“F1”调

用帮助文件,IDA pro调试窗口“IDA View-EIP”停止在地址004A6C11处,同时在“IDA View-ESP”窗

口中显示了四个参数的传递,如图2所示;

图2 IDA pro的调试窗口

其中第三个参数是“0Fh”,第四个参数“unk_37EA8”,是帮助主题ID的数值,点击“查看”菜单下的

“计算器”命令,可查看到该数值是229032,如图3所示;

图3不同进制的数值转换的计算器窗口

(2) OllyDbg 追踪法

用OllyDbg(汉化第三版)打开CHEMCAD的运行程序,该版本有丰富的插件和右键菜单,应用起来

极其简单方便。通过右键菜单的“超级字串参考”命令,弹出“超级字串参考”窗口,通过字符串“”

或“”,按照上述方面,同样可以找到函数HtmlHelp()所在的地址004A6C11,用右键菜单“断

点 > 切换”或直接用“F2”按键设定该处断点。按下“F9”键,由OllyDbg调试运行CHEMCAD,在打

开的CHEMCAD主窗口中拖放一个简捷精馏塔图标,双击该图标,弹出“简捷精馏塔”操作界面,按下“F1”

键,OllyDbg的“CPU-主线程”窗口停止在地址004A6C11处;OllyDbg右下方的“堆栈”窗口,如图4

所示,从第二行起就是HtmlHelp的四个参数,通过右键菜单“Extra”的下拉菜单,看到帮助主题ID的数

值是3002。

图4 OllyDbg右下方的“堆栈”窗口

1.5 重新编译帮助文件

[3]

逐一找出帮助主题ID,编写预定义别名和ID的头文件,连同Microsoft HtlmHelp Workshop工程下的

帮助页面文档一起编译,即可恢复汉化后帮助文件的在线帮助功能。

2 结 论

笔者探索出了一条CHM格式帮助文件汉化后恢复在线帮助功能的技术路线:使用Microsoft HtlmHelp

Workshop反编译原帮助文件,翻译网页格式的帮助文档,使用反向工程工具IDA pro或OllyDbg追踪出原

帮助文件的帮助主题ID,重新编写预定义别名和ID的头文件,连同汉化后的网页,重新使用Microsoft

HtlmHelp Workshop编译成CHM格式的帮助文件,即可恢复汉化后帮助文件的在线帮助功能。

参考文献

[1] 冯慧军. 跟我学HtmlHelp [J/OL].(1999-11-06).

/Book/

[2] 韩永生, 姚峥. MFC与HtmlHelp帮助系统的集成[J]. 电脑编程技巧与维护,2005(7):11-14

[3] 周德兴,管键,张凤均.应用程序帮助系统制作指南[M].北京: 科学出版社,2002.

[4] 心铃.一步一步开发CHM在线帮助系统[J/OL].软件报,2004-10-14 /?Id=160&Title=

一步一步开发CHM在线帮助文件系统-1

[5] 段钢.加密与解密[M].北京:电子工业出版社, 2003

[6]