用 hexeditor 修改 .exe

Change .exe with hexeditor

我用 C++ 写了一个小程序:

#include <iostream>

int main()
{
    int input;

    std::cin >> input;

    if(input == 5){
        std::cout << "Input == 5";
    }
    else{
        std::cout << "Input != 5";
    }

    return 0;
}

我已经构建了程序。工作程序在 Release 文件夹中。现在我想更改 if 语句,而不更改 C++ 代码。我下载了一个十六进制编辑器并打开了文件。 .exe里面有很多。我在谷歌上搜索了这个问题,发现了这张非常漂亮的图片:

我在十六进制编辑器中搜索了我的输出 Input == 5。我找到了。当我将其更改为不同的内容并执行文件时,程序显示新输入的消息,而不是旧消息。

但现在我想更改代码的结构(if 语句)。我搜索了 if,但没有找到任何内容。那么,代码部分(图片)在哪里?

您不会在可执行文件中找到 if 语句,因为它已被翻译成机器语言,这是编译过程的全部目的 -> 将您的 C++ 代码翻译成机器可以理解的东西知道如何执行。

如果你想 'hack' 你的 .exe,你需要的是反汇编程序和使用它的知识,这是一个很长的故事,这就是为什么你的问题对于 Whosebug 来说可能太宽泛了。

在 C 或 C++ 语言中,if 语句是相同的,所以没有什么可以让你得到一个 特殊的 if 语句 c++.

而且,当您构建程序时,它会被转换为机器级语言,因此您无法找到程序背后的任何内容。它直接显示你的输出

C++ 是一种 high-level 语言。它以 "source"(纯文本,即 if ( ... ))编写,编译器将其翻译成机器代码。

机器码是一种非常不同、low-level的语言。首先,C++ 用 "if ... else" 做什么,机器代码用 "conditional branch instruction" 做什么,这是一个(序列)特定字节值,即你在十六进制编辑器中看到的。 "if" 已不存在。

特定的命令集和表示这些命令的字节值在 CPU 系列和 CPU 系列之间有所不同。

如果您真的对机器代码感兴趣,请查看 Randy Hyde 的 The Art of Assembly Language Programming。它非常很好地介绍了 x86 汇编和机器代码。

不过,一般来说,您只需要了解 ASM / 机器代码的象征性知识,因为即使在专业水平上,该主题也很少出现,除非您从事操作系统和/或设备驱动程序方面的工作(大多数时候甚至都不是)。