gpt4 book ai didi

c - fwrite() 将垃圾数据添加到输出(WINE 和 Windows 7、mingw 和 MSVC;不是 linux/gcc)

转载 作者:可可西里 更新时间:2023-11-01 13:26:50 29 4
gpt4 key购买 nike

在某些情况下,fwrite写入额外数据(比请求的字节数更多)。简短演示的输出是最简单的解释方式。该演示尝试创建两个 2048 字节的文件并检查每个 fwrite 之后的偏移量。调用以确定写入的字节数。第一个fwrite调用写入两个额外的字节:

len: 2048
current offset = 0
wrote 1024 bytes
current offset = 1026
EXITING:
offset % BLOCKSIZE = 2

len: 2048
current offset = 0
wrote 1024 bytes
current offset = 1024
wrote 1024 bytes
SUCCESS

程序在编译为 ELF(unix 二进制)时成功运行(向两个文件写入 2048 字节),但在编译为 PE(windows 二进制/可执行文件)时失败(如上所示)。我试过编译和测试:

Ubuntu 14.04 and gcc 4.8.2 - SUCCESS
WINE 1.6.2 and mingw 4.8.2 - FAIL
Windows 7 and mingw 4.8.2 - FAIL
Windows 7 and Visual Studio 2013 - FAIL

传递给fwrite的缓冲区中的实际数据影响写入的额外字节数,但几乎每次都会发生(除非您正在写入 NULL 字节)。

主.c:

#include <stdio.h>

#include "stub.h"
#include "stub2.h"

size_t min(size_t a, size_t b)
{
return a<b?a:b;
}

#define BLOCKSIZE 1024

void test(char buf[], size_t len)
{
FILE *f = fopen("out", "w");

printf("len: %lu\n", len);
for(size_t i=0;i<len;i+=BLOCKSIZE)
{
printf("current offset = %lu\n", ftell(f));
if(ftell(f) % BLOCKSIZE)
{
printf("EXITING:\noffset %% BLOCKSIZE = %d\n\n", ftell(f) % BLOCKSIZE);
return;
}
size_t wrote = fwrite(buf + i, 1, min(len - i, BLOCKSIZE), f);
printf("wrote %lu bytes\n", wrote);
}

printf("SUCCESS\n\n");

fclose(f);
}

int main()
{
test(stub_exe, stub_exe_len);
test(stub2_exe, stub2_exe_len);
return 0;
}

stub.hstub2.h分别从/dev/urandom 的 2048 字节和/dev/zero 的 2048 字节生成 xxd .例如:

dd if=/dev/urandom of=stub2.exe bs=2048 count=1
xxd -i stub.exe stub.h
dd if=/dev/zero of=stub2.exe bs=2048 count=1
xxd -i stub2.exe stub2.h

最佳答案

免责声明:已经 5 天了,还没有人发布“官方”答案,所以我正在做这个答案并接受它。感谢 ChristopheRetired Ninja 实际回答了这个问题。

简单的答案是您需要以二进制模式打开二进制文件(通过向fopen 的第二个参数添加“b”)。

默认情况下,fopen 以文本模式而不是二进制模式打开文件。在文本模式下,换行符 (\n) 在写入文件时被操作系统的换行符序列替换,在读取时反之亦然。与使用单个字符 (\n) 作为换行符的 POSIX 系统(Linux、OSX、BSD 等)不同,Windows 使用 \r\n 换行符序列。

关于c - fwrite() 将垃圾数据添加到输出(WINE 和 Windows 7、mingw 和 MSVC;不是 linux/gcc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25420082/

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