繁体   English   中英

为什么将EXE文件转换为二进制代码,添加到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文件的纯机器代码,以前可以完美运行。 我猜编译器中一定有什么事情发生,但我不知道到底是什么。

有人可以解释吗?

格式说明符"%s"用于以null结尾的 字节字符串 空终止符等于字节00x00 )。 可能存在于数组数据中的某个位置。 您需要其他方式编写它,例如fwrite

另外,由于要编写二进制文件,因此也应以二进制模式打开它。 否则,对应于换行符( '\\n'ASCII编码为 0x0a )的任何字节都将转换为Windows换行符序列"\\r\\n"

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

fprintf用于将文本写入文件或流。 %s格式说明符将以空字符停止,这显然不适用于可能在任何地方包含空值的二进制数据。

仅仅因为它的二进制数据足以阻止您使用fprintf和其他文本IO函数这一事实,但是特别是PE-EXE格式凭借以魔术数字开头的标头 ,可以确保其内容内包含空值。 "PE\\0\\0"

使用函数fwrite将二进制数据写入文件:

fwrite(rawData, 1, sizeof(rawData), file_ptr);

您正在编写的“二进制”文件是源文件,而不是可执行文件。 如果我翻译您的原始数据:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM