我正在编写一个创建Windows服务的程序。所以我需要两个.exe文件 - 一个用于程序,一个用于创建服务,另一个用于服务本身。但我想将这两个文件合并为一个。我有以下想法 - 打开.exe文件,我想在文本编辑器中打包(服务应用程序),然后将其内容复制到某个字符串。然后我需要在所需目录中创建一个空的.exe文件,并将该字符串写入此文件。但我想这不是一个好主意。解决问题的最佳方法是什么?
提前致谢。
答案 0 :(得分:2)
为了好玩,我写了一个使用你的方法的“启动器”程序。它工作正常,我用zoomin.exe测试它作为有效载荷。
创建启动器可执行文件后,在Notepad++中打开它和有效负载文件(在我的情况下为zoomin.exe),并复制(使用编辑|选择性粘贴|复制二进制内容和粘贴二进制文件内容菜单选项)。
通过在Notepad ++中搜索“File Goes Here”和“End”,您可以在启动器文件中找到有效负载所在的位置。
注意,我不以任何方式推荐这个,它很狡猾,容易出错并且可以使用不同的编译器设置轻松破解。我已经在过去解决这个问题的方法是将有效负载添加为资源,这样可以更加可维护。
#include <stdio.h>
#define SIZE_OF_ZOOMIN_EXE 11264
char buffer[SIZE_OF_ZOOMIN_EXE] = "File Goes Here";
char end_of_buffer[] = "End";
int main()
{
FILE *fp = fopen("myzoomin.exe", "wb");
fwrite(buffer, sizeof(buffer), 1, fp);
fclose(fp);
return 0;
}
这是我用C ++编写的自安装服务的main()函数。此外,该程序允许以交互方式运行服务。
int main( int argc, char *argv[] )
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ SERVICE_NAME, Eng3ServiceStart },
{ NULL, NULL }
};
try {
if (argc >= 2) {
if (argc >= 3)
if (!(logfile = fopen(argv[2], "a")))
logfile = stdout;
if (0 == _stricmp(argv[1], "install")) {
DeleteEng3Service(); // ignore return value -- don't care if error
return CreateEng3Service();
}
else if (0 == _stricmp(argv[1], "uninstall"))
return DeleteEng3Service() ;
}
// not installing or uninstalling, start the service,
// passing it all the command-line arguments.
if (!StartServiceCtrlDispatcher( DispatchTable ) ) {
if (GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) {
fprintf(logfile, "Failed to connect to service. Starting in console mode.\n");
return svcmain(argc, argv);
}
throw sys_ex();
}
} catch (exception& ex ) {
fprintf(logfile, ex.what());
}
}
答案 1 :(得分:1)
应该可以将二进制数据作为resouce添加到win32可执行文件中。
使用win32 resource functions这应该是可行的。
谷歌搜索提出了这个问题:http://www.codeproject.com/Articles/4221/Adding-and-extracting-binary-resources