gpt4 book ai didi

c - C异或可执行文件加密/解密的问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:09 24 4
gpt4 key购买 nike

我正在尝试用 C 语言为 .exe 文件创建一个简单的 XOR 加密器/解密器。我在 C 中还是个新手,还不了解所有内容,尤其是内存方面的东西。所以我一直在关注一个关于如何制作一个简单的 XOR 字符串加密器的在线教程,它运行良好。现在我想修改它以便我可以加密/解密可执行文件并决定使用 fwrite() 和 fread() 函数。这是我想出的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // execve function

#define XOR_KEY 0xAA // key

#define JOB_CRYPT 1 // alter flow depending on the job
#define JOB_DECRYPT 2


//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////

void xorFile (char *infile, char *outfile) {

FILE *nFile, *eFile;

long nFileSize; // store file size of the file we want to read

char *buffer; // buffer for reading
char *eBuffer; // buffer for storing encrypted data

size_t rResult;
size_t wResult;

///// READ FILE /////

nFile = fopen(infile, "rb");

if(nFile == NULL) {

fputs("Error opening file...", stderr);
exit(EXIT_FAILURE);

}

fseek(nFile, 0, SEEK_END);
nFileSize = ftell(nFile);
rewind(nFile);

buffer = (char *) malloc(sizeof(char) * nFileSize);

if(buffer == NULL) {

fputs("Error allocating memory...", stderr);
exit(EXIT_FAILURE);

}

rResult = fread(buffer, 1, nFileSize, nFile);

if(rResult != nFileSize) {

fputs("Error reading file...", stderr);
exit(EXIT_FAILURE);

}

fclose(nFile);

printf("File size is: %ld\n", nFileSize);
printf("Buffer size is (pointer): %u\n", sizeof(buffer));
printf("Reading result: %lu\n", rResult);

////// WRITE TO FILE //////

eFile = fopen(outfile, "wb");


if(eFile == NULL) {

fputs("Error creating file...", stderr);
exit(EXIT_FAILURE);

}

eBuffer = (char *) malloc(sizeof(char) * nFileSize);

if(eBuffer == NULL) {

fputs("Error allocating memory (2)...", stderr);
exit(EXIT_FAILURE);

}

// encrypt byte by byte and save to buffer
printf("Proceeding with encryption!\n");

for(int i = 0; buffer[i] != EOF; i++) {

eBuffer[i] = buffer[i] ^ XOR_KEY;

}

printf("Proceeding with fwrite()!\n");

wResult = fwrite(eBuffer, 1, nFileSize, eFile);

fclose(eFile);

printf("eBuffer size is (pointer)%u\n", sizeof(eBuffer));
printf("Writing result: %lu\n", wResult);

free(buffer); // free buffers in heap
free(eBuffer);

}


//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////


int main(int argc, char *argv[]) {

// checking if all parameters were given

if(argc < 4) {

fprintf(stderr, "Usage: %s [CRYPT | DECRYPT] [IN-FILE] [OUT-FILE]\n", argv[0]);
exit(EXIT_FAILURE);

}

int job;

// DOLOCIMO JOB

if(strcmp(argv[1], "CRYPT") == 0) {

job = JOB_CRYPT;

} else if (strcmp(argv[1], "DECRYPT") == 0) {

job = JOB_DECRYPT;

} else {

fprintf(stderr, "Please select [CRYPT | DECRYPT]!");
exit(EXIT_FAILURE);

}

// CRYPT/DECRYPT OUR FILE

xorFile(argv[2], argv[3]);


if(job == JOB_DECRYPT) {

char *args[] = {argv[3], NULL};

int errExec = execve(args[0], args, NULL);

if(errExec == -1) {

perror("Error executing file...");
exit(EXIT_FAILURE);

}

}


return 0;
}

对于看起来丑陋的代码,我很抱歉,但我首先想让它工作,稍后我会对其进行改进。

无论如何,当我在命令提示符下运行它时,加密工作正常,它生成一个加密文件,但是当我运行解密作业时,程序在解密过程中崩溃。这是发生的情况的图片,因此您可以更好地想象它。

由于我的声望不到10,所以不允许嵌入图片。 Here is a link to Imgur .

这里出了什么问题?我在解密时会造成缓冲区溢出吗?

谢谢!

最佳答案

问题是:

    for(int i = 0; buffer[i] != EOF; i++) {
eBuffer[i] = buffer[i] ^ XOR_KEY;
}

二进制文件可以包含任意值的字节。所以 EOF 值是有效的并且不指定文件的结尾。这意味着如果文件包含具有此值的字节,则循环将提前退出并且您不会对所有字节进行异或。如果文件不包含此字节,循环将运行到调用 undefined behavior 的已分配内存的末尾。在这种情况下表现为崩溃。

你知道你需要处理多少字节,所以用它作为你的循环控制:

    for(int i = 0; i < nFileSize; i++) {

其他一些小的更正:

buffer = (char *) malloc(sizeof(char) * nFileSize);
if(buffer == NULL) {
fputs("Error allocating memory...", stderr);
exit(EXIT_FAILURE);
}

Don't cast the return value of malloc .此外,根据定义,sizeof(char) 为 1,因此您可以忽略它。

此外,如果系统或库函数失败,您应该使用perror 来打印错误消息。这将打印有关函数失败原因的附加信息。

buffer = malloc(nFileSize);
if(buffer == NULL) {
perror("Error allocating memory...");
exit(EXIT_FAILURE);
}

关于c - C异或可执行文件加密/解密的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48152444/

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