为什么我的 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.