将十六进制数据写入可执行文件无效? C ++

时间:2012-02-16 09:57:52

标签: c++ installer hex executable

我一直在试图弄清楚安装程序如何工作以及如何将所有内容捆绑到一个可执行文件中以及如何创建自己的文件。我尝试使用名为HxD的十六进制编辑器,它允许您将文件的当前十六进制转储导出到.c源文件中,该文件包含一个类似于下面的十六进制转储的数组。

enter image description here

兴奋,我尝试使用一些简单的C ++代码编写文件:

ofstream newbin("test.exe", ios::binary);
newbin << hex << rawData;
newbin.close();

...然后尝试运行它。

enter image description here

经过一些进一步的研究后发现,我的小程序只编写了PE文件在Windows中使用的MZ.标题,并排除了其余的代码。创建的可执行文件具有4D 5A 90或ASCII MZ.的十六进制转储。这是我的编码错吗?为什么不写十六进制数据?我需要使用一些较低级别的书写工具或装配吗?如果是这样,是否有允许我在这样的级别编写的C / C ++库?谢谢!

2 个答案:

答案 0 :(得分:4)

rawDatachar*,由流操作符解释为字符串,由它遇到的第一个0x00字节终止。

对于二进制书写,最好使用

ostream& write(const char*, int);

方法,导致

newbin.write(rawData, 65536);

假设65536是缓冲区的实际使用大小。

希望这会有所帮助:)

答案 1 :(得分:1)

存储二进制数据的更好方法是使用资源。菜单,图标,位图存储在资源中。

您可以创建自定义资源并使用FindResource函数LoadResource,然后使用LockResource将其映射到内存中。

然后你可以用数据做任何你想做的事,当然把它写到文件中。

安装程序通常使用类似的东西,而不是在源代码中嵌入大量二进制数据。这种方法还有其他优点:

  • 您不必将数据重新转换为源代码,然后在数据更改时重新整理整个应用程序。只需重新编译和重新链接资源。
  • 在使用上述功能之前,资源不会加载到内存中,直到您需要它们为止。因此,应用程序加载到内存中更快。 (资源数据实际上直接从文件映射到地址空间。)
    使用您当前的方法,所有数据都会加载到内存中,因此您的应用程序需要更多内存。

此外,您最好使用专门的工具来创建安装程序。