fgetc 在读取文件时丢失字节
fgetc misses bytes while reading a file
我用函数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;
}
以二进制模式打开文件。
// if ((fdIn = fopen((char*)argv[1], "rt")) == NULL) {
// >.<
if ((fdIn = fopen((char*)argv[1], "rb")) == NULL) {
在文本模式下,可能是基于 Windows 的机器给定 "rt"
,'\r'
、'\n'
对肯定会翻译成 '\n'
。 IAC,OP 的十六进制转储目标不需要翻译。
第 2 期:fgetc()
returns int
在 unsigned char
或 EOF
范围内。使用类型int
区分EOF
和所有数据输入。
// char c = 0;
int c = 0;
...
c = fgetc(fdIn);
// also add
if (c == EOF) break;
我用函数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;
}
以二进制模式打开文件。
// if ((fdIn = fopen((char*)argv[1], "rt")) == NULL) {
// >.<
if ((fdIn = fopen((char*)argv[1], "rb")) == NULL) {
在文本模式下,可能是基于 Windows 的机器给定 "rt"
,'\r'
、'\n'
对肯定会翻译成 '\n'
。 IAC,OP 的十六进制转储目标不需要翻译。
第 2 期:fgetc()
returns int
在 unsigned char
或 EOF
范围内。使用类型int
区分EOF
和所有数据输入。
// char c = 0;
int c = 0;
...
c = fgetc(fdIn);
// also add
if (c == EOF) break;