ANSI C:如何在我的应用程序中包含然后提取.exe文件(打包.exe到.exe)?

时间:2012-10-08 18:16:45

标签: c windows

我正在编写一个创建Windows服务的程序。所以我需要两个.exe文件 - 一个用于程序,一个用于创建服务,另一个用于服务本身。但我想将这两个文件合并为一个。我有以下想法 - 打开.exe文件,我想在文本编辑器中打包(服务应用程序),然后将其内容复制到某个字符串。然后我需要在所需目录中创建一个空的.exe文件,并将该字符串写入此文件。但我想这不是一个好主意。解决问题的最佳方法是什么?

提前致谢。

2 个答案:

答案 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