使用hexeditor更改.exe

MyN*_*ame 3 c++ hex hex-editors

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

#include <iostream>

int main()
{
    int input;

    std::cin >> input;

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已经建立了这个程序.工作程序在Release文件夹中.现在我想更改if语句,而不更改C++代码.我下载了一个十六进制编辑器并打开了该文件 里面.exe很多.我搜索了问题,发现这个非常好的形象:

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

但现在我想改变代码的结构(if声明).我搜索过if,但没有找到任何东西.那么,代码部分(图像)在哪里?

dan*_*n78 7

您将无法if在可执行文件中找到语句,因为它将被翻译为机器语言,这是编译过程的全部目的 - >将C++代码转换为机器知道如何执行的内容.

如果你想"破解"你的.exe,你需要的是一个反汇编程序和使用它的知识,这是一个很长的故事,这就是为什么你的问题对于Stackoverflow来说可能过于宽泛.


Dev*_*lar 6

C++是一种高级语言.它以"source"(纯文本,即if ( ... ))编写,编译器将其转换为机器代码.

机器代码是一种非常不同的低级语言.首先,C++使用"if ... else"做什么,机器代码使用"条件分支指令",这是一个(序列)特定字节值,即您在十六进制编辑器中看到的内容."如果"不再存在.

特定命令集和表示这些命令的字节值因CPU系列而异.

如果您对机器代码非常感兴趣,请查看Randy Hyde 的汇编语言编程艺术.它有一个非常好的介绍x86汇编和机器代码.

一般来说,您不需要ASM /机器代码的令牌知识,因为即使在专业级别上,主题也很少出现,除非您正在使用操作系统和/或设备驱动程序(并且大部分是时间甚至没有).

  • @MyNewName:是和不.如果你在桌面上运行Windows或Linux,你可能会使用[x86_64](https://en.wikipedia.org/wiki/X86-64)CPU,这是一个64位的演变( 32位)[x86](https://en.wikipedia.org/wiki/X86).[Assembly](https://en.wikipedia.org/wiki/Assembly_language)是一个*几乎*类似的机器代码中介,具有一些商品功能,但是尽可能接近加入"机器代码"和"人类"可读".(回到*真正的*早期,我说的是1960年代,人们*实际上*直接写了机器代码.没有人再做了,不认真.) (2认同)
  • @MyNewName :(续)有一些名为*disassemblers*的工具,它们将机器代码重新转换为程序集.(GNU/Linux工具链的`objdump -D`,不知道用于此目的的Microsoft工具.)还有一个编译器功能可以将*source*转换为程序集.(对于GNU CC,这将是`-S`,我再也不知道如何在MS Visual上做到这一点.)后一种方式通常更精确,因为最终在二进制文件中的一些东西是*不是*机器代码,但是被反汇编程序解释为这样,给出了一些令人困惑的输出 - 编译器更清楚知道什么是什么. (2认同)