1

我正在尝试使用 fmemopen 函数将可执行文件的 char* 映射到内存中,该函数应该返回 FILE * 以便能够使用它(根本不将其写入硬盘驱动器)。fmemopen 函数更改文件的问题,因此当我从 FILE* 写入文件时,它具有无法识别的不同格式。

    FILE * stream;
stream = fmemopen(value, strlen(value), "rb");                                                                                                FILE *fp;
fp = fopen("testing.exe", "w");
    fwrite(stream, leng, 1, fp);

其中 value 是 (char*),leng 是 char * 长度。

任何建议将不胜感激。谢谢

4

2 回答 2

4

重读你的代码,我有更多的观察:

  1. 很明显,您没有将正确的参数传递给fwrite. 第一个参数是指向内存缓冲区的指针,而不是另一个FILE*. 在这种情况下,您将奇怪的内存复制到新的可执行文件中,这就是它无法执行的原因。

    如果您有一块内存要复制到可执行文件,只需fwrite该内存块:

    FILE* fp_out = fopen("testing.exe", "wb");
    /* ... */
    fwrite(value, sizeof(value), 1, fp_out);
    

    但是,这假定value是一个完整且完整的可执行映像,适合执行(您可能需要一个chmod +x testing.exe. 我想知道,给定扩展名.exe,这个二进制映像是否甚至包含适用于您的平台的有效可执行文件。

  2. 在处理假定的可执行映像时,您不想使用strlen它,即使它“存储”在char*. 可执行文件包含字节值 0,即 C 字符串分隔符 NUL(例如'\0')。这将导致strlen摸索。您需要使用sizeof或跟踪可执行映像的大小。

  3. 如果您努力在对 的调用中使用,则最好"wb"在调用中使用。这样您就不会在执行此操作的系统(Windows)上收到换行符翻译。如果您使用的平台没有此要求,请从调用中删除或保留它。无论您选择什么,都要保持一致。fopen"rb"fmemopenb

于 2013-07-15T18:42:23.123 回答
1

由于您说 fmemopen 改变了文件的方式,请注意您选择“rb”作为模式。代表读取为二进制。尝试只使用“r”。

编辑[感谢 Scott] 由于您正在写入可执行文件,因此您将保留“rb”,然后您必须使用“wb”写入。

于 2013-07-15T18:29:59.947 回答