C 通过二进制文件生成头文件

C Generate a header file via a Binary file

我正在尝试制作一种简单的加密类型的东西。所以我想做的是读取可执行文件的内容,对其进行加密并生成一个头文件,该文件将包含一个带有加密 bytes/binaries 的变量,然后它将解密它等等。所以问题是我如何导出加密的东西到一个头文件中。因为例如,如果您尝试打印内容的字节表示,您可以使用

printf("%x", byte);

但我认为您不能使用那种格式将字节存储在 unsigned char 中,因为 通常的格式是

unsigned char bytes[] = {0x010, 0x038, 0x340 etc...}

在 Python 中我可以做到,但我似乎无法弄清楚如何直接在 C 中做到这一点。

如果您有资源推荐,请分享。

我现在正试图专注于 Windows 可执行文件,很可能我会尝试在虚拟分配的内存上执行二进制代码,我已经看到一些代码可以做到这一点,所以我想自己试试。

快速而肮脏,不安全且未经测试。读取INPUT_FILE中定义的文件,输出到OUTPUT_FILE,格式为:unsigned char var[] = { 0xXX, 0xXX ... }; 变量名由VARIABLE_NAME控制。您应该添加自己的健全性检查,即检查来自 fopen() 之类的 returns。

#include <stdio.h>
#include <stdlib.h>

#define INPUT_FILE "file.exe"
#define OUTPUT_FILE "out.txt"
#define VARIABLE_NAME "bytes"

int main(int argc, char *argv[]) {
    FILE *fp = fopen(INPUT_FILE, "rb");

    // Get file size
    fseek(fp, 0, SEEK_END);
    long size = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    // Alloc, read
    unsigned char *buf = malloc(size);
    fread(buf, size, 1, fp);
    fclose(fp);

    // Write the data out
    fp = fopen(OUTPUT_FILE, "wb");
    fprintf(fp, "unsigned char %s[] = { ", VARIABLE_NAME);
    for (long i = 0; i < size; i++) {
        fprintf(fp, "0x%02x%s", buf[i], (i == size-1) ? " };" : ", ");
    }
    fclose(fp);
    free(buf);
    return 0;
}

你想要这样的东西吗:

#include <stdio.h>

int encode(int c)
{
  return (unsigned char) (c ^ 0xf);
}

int main(int argc, char ** argv)
{
  if (argc != 3) {
    fprintf(stderr, "usage: %s <file in> <file out>\n", *argv);
  }
  else {
    FILE * fpin;
    FILE * fpout;
    
    if ((fpin = fopen(argv[1], "rb")) == NULL) /* under Windows 'b' is necessary to read binary */
      perror("cannot open inpout file");
    else if ((fpout = fopen(argv[2], "w")) == NULL)
      perror("cannot open inpout file");
    else {
      const char * sep = "unsigned char bytes[] = {";
      int c;
     
      while ((c = fgetc(fpin)) != EOF) {
        fprintf(fpout, "%s0x%x", sep, encode(c));
        sep = ", ";
      }
      
      fputs("};\n", fpout);
      fclose(fpin);
      fclose(fpout);
    }
  }
  
  return 0;
}

当然要修改encode

编译与执行:

pi@raspberrypi:/tmp $ gcc -Wall e.c
pi@raspberrypi:/tmp $ ./a.out ./a.out h
pi@raspberrypi:/tmp $ cat h
unsigned char bytes[] = {0x70, 0x4a, 0x43, 0x49, 0xe, 0xe, 0xe, 0xf ... 0xf, 0xf, 0xf, 0xf, 0xf};
pi@raspberrypi:/tmp $ ls -l h
-rw-r--r-- 1 pi pi 43677 juil.  4 18:44 h

(我将 cat h 结果剪切为仅显示其开始和结束)