为了好玩,我编写了一个使用您的方法的“启动器”程序。它可以工作,我用 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());
}
}