【发布时间】:2016-10-20 22:52:41
【问题描述】:
我使用函数fgetc读取文件的每个字节,然后用printf写入。
我刚刚注意到,当我将结果与十六进制编辑器进行比较时,fgetc 有时会丢失一些字节。
例如,第一个错误从第 118 个字节开始,其他很多错误都是随机的……
有人经历过吗?
这是代码(Windows)
char main(int argc, char* argv[]) {
FILE* fdIn;
FILE* fdOut;
long size = 0;
long i = 0;
char c = 0;
if (argc == 3) {
if ((fdIn = fopen(argv[1], "rt")) == NULL) {
printf("FAIL\n");
return 0;
}
if ((fdOut = fopen(argv[2], "w+")) == NULL) {
printf("FAIL\n");
return 0;
}
fseek(fdIn, 0L, SEEK_END);
size = ftell(fdIn);
fseek(fdIn, 0L, 0);
fprintf(fdOut, "unsigned char shellcode[%ld] = {", size);
while (i < size) {
c = fgetc(fdIn);
if (!(i % 16))
fprintf(fdOut, "\n\t");
fprintf(fdOut, "0x%02X", (unsigned char)c);
if (i != size - 1)
fprintf(fdOut, ", ");
i++;
}
fprintf(fdOut, "\n};\n");
fclose(fdIn);
fclose(fdOut);
printf("SUCCESS");
system("PAUSE");
}
return 0;
}
【问题讨论】:
-
以二进制模式打开文件。
-
向我们展示您的代码、您的测试数据、预期结果和实际结果。
-
您在使用 Windows 吗?缺少的字符是 CR(
\r、\012)吗?或者 ^Z (\032)?你是用文本模式还是二进制模式打开文件? -
问你可能不公平,Adam(所以这实际上是针对整个世界的),但我想知道:为什么人们坚持使用
fgetc()而不是getc()?对于新手问题,这里有一种强烈的趋势,即使用fgetc()进行单字符输出并使用printf()进行所有输出,即使putchar()会出色地完成这项工作。嗯,这可能是不可思议的——但这对我来说很奇怪。 -
你可以输出
unsigned char shellcode[] = {;这样你就不再需要size了。