C通过二进制文件生成头文件 [英] C Generate a header file via a Binary file

查看:18
本文介绍了C通过二进制文件生成头文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

printf("%x", byte);
但我认为您不能使用这种格式将字节存储在无符号字符中,因为 通常的格式为

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

在Python中我可以做这件事,但我似乎想不出如何用C直接做这件事

如果您对来源有建议,请与他人分享。

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

推荐答案

您想要这样的东西吗:

#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>
", *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("};
", fpout);
      fclose(fpin);
      fclose(fpout);
    }
  }
  
  return 0;
}

当然要修改编码

编译和执行:

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结果只显示其开始和结束)

这篇关于C通过二进制文件生成头文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆