gpt4 book ai didi

c - fmemopen 正在更改映射文件结构

转载 作者:太空宇宙 更新时间:2023-11-04 01:08:39 26 4
gpt4 key购买 nike

我正在尝试使用 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 * 的长度。

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

最佳答案

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

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

    如果你有一 block 内存你想复制到一个可执行文件,简单地fwrite那 block 内存:

    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. 如果您尝试使用 "rb",最好在调用 fopen 时使用 "wb" > 在您对 fmemopen 的调用中。这样您就不会在执行此操作的系统上收到换行符翻译(Windows)。如果您使用的平台没有此要求,请从调用中删除 b 或保留它。无论您选择什么,都要保持一致。

关于c - fmemopen 正在更改映射文件结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17661042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com