![](/img/trans.png)
[英]Why does fseek work when you are writing (fwrite) to a binary file, but when reading (fread) it doesn't? - C
[英]Why doesn't it work to convert EXE-file to binary code, add to C and re-create?
这纯粹是实验性的,没有真正的用处(至少据我所知)。 我正在阅读一些有关PE格式的文献,如果可能的话,我想尝试一下。
我创建了一个简单的程序,用C打印“ Hello World”,并将其编译为Windows计算机上的EXE,之后,我在十六进制编辑器中打开了文件,并将内容另存为C文件(十六进制编辑器将其保存为C选项)并将其作为字符串添加到另一个C脚本中。
C程序:
#include <stdio.h>
int main(void)
{
printf("Hello World");
return 0;
}
C的二进制代码:
0x23, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x20, 0x3C, 0x73, 0x74,
0x64, 0x69, 0x6F, 0x2E, 0x68, 0x3E, 0x0D, 0x0A, 0x23, 0x69, 0x6E, 0x63,
0x29, 0x3B, 0x0D, 0x0A, 0x09, 0x0D, 0x0A, 0x09, 0x72, 0x65, 0x74, 0x75,
0x72, 0x6E, 0x20, 0x30, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A [...]
这另一个C脚本将字符串中的内容写到磁盘上,并将其另存为EXE文件(根据我的理论)可以执行。 但是,当我执行它时,会收到消息“此应用程序无法在您的PC上运行”。
另一个C程序:
#include <stdio.h>
int main()
{
FILE* file_ptr = fopen("test_file.exe", "w");
unsigned char rawData[106] = {
0x23, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x20, 0x3C, 0x73, 0x74,
0x64, 0x69, 0x6F, 0x2E, 0x68, 0x3E, 0x0D, 0x0A, 0x23, 0x69, 0x6E, 0x63,
[...]
0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x22,
0x29, 0x3B, 0x0D, 0x0A, 0x09, 0x0D, 0x0A, 0x09, 0x72, 0x65, 0x74, 0x75,
0x72, 0x6E, 0x20, 0x30, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A
};
fprintf(file_ptr, "%s", rawData);
fclose(file_ptr);
return 0;
}
为什么不起作用? 我的意思是,这是EXE文件的纯机器代码,以前可以完美运行。 我猜编译器中一定有什么事情发生,但我不知道到底是什么。
有人可以解释吗?
您正在编写的“二进制”文件是源文件,而不是可执行文件。 如果我翻译您的原始数据:
unsigned char rawData[106] = {
0x23, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x20, 0x3C, 0x73, 0x74,
0x64, 0x69, 0x6F, 0x2E, 0x68, 0x3E, 0x0D, 0x0A, 0x23, 0x69, 0x6E, 0x63,
它对应于文本:
#include
(等等)
这不是可执行文件,而是源文件!
您不能简单地保存带有“ exe”扩展名的C源文件并使其能够运行。 您实际上需要对其进行编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.