为什么我的 XOR 程序在对可执行文件进行异或时无法在 Windows 上运行
why is my XOR program not working on Windows when XORing executables
我用 C 编写了一个 XOR 程序。该程序的目的是对文件进行 XOR,我已经在 Linux 上测试了这个程序,因为它是我的主要 OS 并且它与'.exe'(我使用 wine 在 Linux 上执行 exe)。然而,当程序在 Windows 上进行测试时,我注意到当我对文件进行异或时我正在丢失数据字节,我不知道为什么,如果有人能阐明这种情况,我将不胜感激。下面我已经将代码发布到我的 XOR 程序中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
//XOR key
#define XOR_KEY 0x6F
void XORFile(char *infile, char *outfile)
{
FILE *fp;
FILE *fp2;
int rlen;
char buf[4096];
fp = fopen(infile, "r");
fp2 = fopen(outfile, "w");
while (1) {
rlen = fread(buf,1,sizeof(buf),fp);
if (rlen <= 0)
break;
// XOR read file buffer
for (int i = 0; i < rlen; ++i)
buf[i] ^= XOR_KEY;
fwrite(buf,1,rlen,fp2);
}
fclose(fp);
fclose(fp2);
}
int main (int argc, char *argv[]) {
if(argc <= 3){
fprintf (stderr, "Usage: %s [CRYPT] [IN FILE] [OUTFILE]\n", argv[0]);
exit(1);
}
XORFile (argv[2], argv[3]);
return 0;
}
正如评论中所指出的,您应该在 fopen
调用中使用 "rb"
和 "wb"
模式(添加的 b
opens/creates 二进制 模式的文件)。
在 text 模式(默认)中,Windows 对某些字符进行一些特殊处理(例如在单个 \n
和 \r\n
对).
来自cppreference:
Text files are files containing sequences of lines of text. Depending
on the environment where the application runs, some special character
conversion may occur in input/output operations in text mode to adapt
them to a system-specific text file format. Although on some
environments no conversions occur and both text files and binary files
are treated the same way, using the appropriate mode improves
portability.
我用 C 编写了一个 XOR 程序。该程序的目的是对文件进行 XOR,我已经在 Linux 上测试了这个程序,因为它是我的主要 OS 并且它与'.exe'(我使用 wine 在 Linux 上执行 exe)。然而,当程序在 Windows 上进行测试时,我注意到当我对文件进行异或时我正在丢失数据字节,我不知道为什么,如果有人能阐明这种情况,我将不胜感激。下面我已经将代码发布到我的 XOR 程序中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
//XOR key
#define XOR_KEY 0x6F
void XORFile(char *infile, char *outfile)
{
FILE *fp;
FILE *fp2;
int rlen;
char buf[4096];
fp = fopen(infile, "r");
fp2 = fopen(outfile, "w");
while (1) {
rlen = fread(buf,1,sizeof(buf),fp);
if (rlen <= 0)
break;
// XOR read file buffer
for (int i = 0; i < rlen; ++i)
buf[i] ^= XOR_KEY;
fwrite(buf,1,rlen,fp2);
}
fclose(fp);
fclose(fp2);
}
int main (int argc, char *argv[]) {
if(argc <= 3){
fprintf (stderr, "Usage: %s [CRYPT] [IN FILE] [OUTFILE]\n", argv[0]);
exit(1);
}
XORFile (argv[2], argv[3]);
return 0;
}
正如评论中所指出的,您应该在 fopen
调用中使用 "rb"
和 "wb"
模式(添加的 b
opens/creates 二进制 模式的文件)。
在 text 模式(默认)中,Windows 对某些字符进行一些特殊处理(例如在单个 \n
和 \r\n
对).
来自cppreference:
Text files are files containing sequences of lines of text. Depending on the environment where the application runs, some special character conversion may occur in input/output operations in text mode to adapt them to a system-specific text file format. Although on some environments no conversions occur and both text files and binary files are treated the same way, using the appropriate mode improves portability.