gpt4 book ai didi

c - 为什么将 EXE 文件转换为二进制代码、添加到 C 并重新创建不起作用?

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:49 25 4
gpt4 key购买 nike

这纯粹是实验性的,没有实际用处(至少据我所知不是)。我正在阅读一些关于 PE 格式的文献,如果可能的话想尝试一下。

我创建了一个用 C 语言打印“Hello World”的简单程序,并将其编译为 Windows 计算机上的 EXE,之后我在十六进制编辑器中打开文件并将内容保存为 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 文件的纯机器代码,之前运行良好。我想编译器中一定发生了什么,但我不明白到底是什么。

谁能解释一下?

最佳答案

格式说明符 "%s" 用于null-terminated 字节串空终止符 等于字节0 (0x00)。 很可能它存在于数组数据中的某处。你需要一些其他的方式来写它,比如fwrite .

此外,由于您正在编写二进制文件,因此您也应该以二进制模式打开它。否则任何与换行符对应的字节('\n'ASCII encoding 中的0x0a)将被转换为 Windows 换行符序列 "\r\n ".

最后,您创建的文件的属性将不包括可执行标志。

关于c - 为什么将 EXE 文件转换为二进制代码、添加到 C 并重新创建不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53398168/

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