分享
 
 
 

实现WINDOWS平台下帮助文件的反编译

王朝system·作者佚名  2006-01-30
窄屏简体版  字體: |||超大  

实现WINDOWS平台下帮助文件的反编译

http://91mail.51.net

摘要:本文论述了CHM及HLP类型的帮助文件反编译的意义及其反编译工具的实现。介绍了WIN32程序中进程的创建,C++Builder中资源的创建及调用与VC中的资源创建及管理的区别。

关键词:hlp,chm,API,反编译,进程,C++Builder,TresourceStream

中图分类号:TP3 文献标志识码 B

软件的易用性很大程度上受其帮助系统的好坏的影响,优秀的软件必须有优秀的帮助系统。作为一个程序员不但要能够制作自己的帮助系统,而且还要能够反编译这些帮助系统的文件,从而对这些文件中的资源进行重新编辑和修改,于是如何提取帮助文件中的资源便成为一个必须完成的任务。

目前WINDOWS系统中使用的帮助文件主要有两种格式,扩展名为hlp的文件和chm的文件。Hlp文件是较早的一种帮助文件,目前使用最多的是chm文件。现在国内外反编译帮助文件的工具很少,,作者曾在网络上发现过这样的工具,可是都是DOS下的程序,很难操作,界面也不太友好,于是制作一个WINDOWS下的程序就是相当必要的了。制作这个工具的方案有两种,一种是代码移植,一种是给DOS程序加上WINDOWS外壳。第一种方式比较繁琐,我选用第二种方式。下面对反编译HLP文件的DOS程序进行移植,制作一个WINDOWS中使用的工具。

这个工具的实现有两个技术要点:

1. 后台进程的创建

2. 在C++Builder 中如何实现资源的分离

1. 后台进程的创建:

在Win32中,为保证多任务之间的独立性,当各个模块可以分开独立执行时,可以使用多进程。创建进程可以使用CreateProcess函数。

该函数的原形为

BOOL CreateProcess(

LPCTSTR lpApplicationName,

LPCTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

)

CreateProcess函数是一个Windows API函数,它的含义包含在Windows.h头文件中。它的参数多而繁杂,下面介绍它的各个参数的含义:

lpApplicationName 指向可执行文件名的字符串,注意必须为路径全名。

LpCommandLine 指向可执行的应用程序的命令行的字符串。若lpApplicationName和lpCommandLine都不为空,则lpApplicationName指定执行模块,lpCommandLine指定命令行,如果任何一个为空,WINDOWS使用不空的那一个来调用可执行程序。

lpProcessAttributes 指向一个安全的结构,用以说明创建进程的安全属性。

lpThreadAttributes 用以指定创建进程的主线程的安全属性。

bInheritHandles 决定新进程是否从调用进程中继承句柄。如为真,则调用进程中每个可继承的打开句柄。

dwCreationFlags 为新进程的附加标志。

lpEnvironment 指向一个用于新进程的环境块。如果此参数为空,则新进程使用调用进程的环境。

lpCurrentDirectory 指向一个字符串,该字符串将创建进程指定当前工作驱动器和目录,必须为一全路径名。如果此字符串为空,则新进程使用调用进程一样的当前工作驱动器和工作目录。

lpStartupInfo 指向STARTUPINFO 结构,该结构用于指定新进程的主窗口启动时如何显示。

lpProcessInformation 参数指向一个PROCESS_INFORMATION 结构,该结构用于接受有关新进程的标识信息。

除了用CreateProcess函数创建进程外,还可以使用WinExec函数和LoadModule函数。WinExec源于Windows3.1操作系统,但在Win32中仍然可用。WinExec函数较CreateProcess函数简单的多,但是与之相应的是少了许多控制或安全的功能。此函数原形如下:

UINT WinExec(LPCSTR lpCmdLine,UINT uCmdShow);

lpCmdLine 是命令行

uCmdShow 是应用程序窗口显示方式

LoadModule函数的使用也比CreateProcess函数简单,其原形如下:

DWORD LoadModule(

LPCSTR lpModuleName, // 指向可执行文件名的字符串

LPVOID lpParameterBlock // 指向LOADPARMS32 结构,LOADPARMS32 结构定义了程序参数,包括如何显示,命令参数等。

);

如果想结束一个进程,可以调用ExitProgress 函数或TerminateProgress 函数,若使用ExitProgress,则此进程的所有附属的DLL和线程都将被终止。

2.在 C++Builder 中如何实现资源的分离:

C++Builder在资源的创建和引用中与VC不同。在VC中有专门的资源编辑器,只要在资源编辑器中创建了资源并赋予ID,然后引用ID就可以了。虽然感觉VC这种可视化的资源管理方式很方便,可是感觉总是不如C++Builder对资源管理和引用灵活。在C++Builder中只要用记事本按照“资源名资源类型 文件名(包括路径)”的格式书写,然后保存为扩展名为rc的文件,将这个文件加入项目中。完成以上步骤后就可以用TresourceStream类中的方法处理定义的这些资源。

具体实现请看如下代码。

GetCurrentDirectory(sizeof(currentpath),currentpath);

if(FileListBox1->FileName!="")

{

tmppath=FileListBox1->FileName.Delete(FileListBox1->FileName.Length()-3,4);

CreateDirectory(tmppath.c_str(),NULL); strcpy(exefile,(AnsiString(tmppath)+AnsiString("\\Helpdeco.exe")).c_str());

ret=GetFileAttributes(exefile); CopyFile(FileListBox1->FileName.c_str(),(AnsiString(tmppath)+AnsiString("\\tmp.hlp")).c_str(),FALSE);

if(ret=0xffffffff)

{

TResourceStream &rs=*new TResourceStream((int)HInstance,AnsiString("helpfile"),"HELPFILE");

rs.SaveToFile(AnsiString(exefile));

delete &rs;

cmd=AnsiString(tmppath)+"\\helpdeco.exe"+" "+"tmp.hlp";

ShowMessage(cmd); proc_create_state=CreateProcess(NULL,cmd.c_str(),NULL,NULL,false,NULL,NULL,tmppath.c_str(),&siStartInfo,&piProcInfo);

if(proc_create_state)ShowMessage("反编译成功");

TerminateThread(piProcInfo.hProcess,0);//终止进程 DeleteFile((AnsiString(tmppath)+"\\Helpdeco.exe").c_str());

DeleteFile((AnsiString(tmppath)+"\\tmp.hlp").c_str());

}

}

else

{

ShowMessage("请选择要反编译的文件");

}

结论:本文的目的在于推荐一种DOS程序向WINDOWS程序移植的方式。用这种方式制作的工具可以实现:选择需要编译的文件即可在和这个文件相同的目录里创建一个文件夹,存放反编译提取的资源。此工具经过作者的多次测试,运行稳定,占用系统资源较少,不产生临时的垃圾文件,基本能够满足用户的要求。

参考文献:

[1] 梁肇新 编著,编程高手箴言,电子工业出版社,2003年10月第一版

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有