2016-01-27 24 views
3

變化的.exe我在C++寫了一個小程序:用16進制軟件

#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裏面有很多。我用Google搜索的問題,並發現了這個非常漂亮的圖片:

我搜索我的輸出Input == 5的十六進制編輯器裏面。我找到了。當我將其更改爲不同的內容並執行該文件時,程序將顯示新輸入的消息,而不是舊消息。

但現在我想改變代碼(if語句)的結構。我搜索了if,但沒有找到任何東西。那麼,代碼段(圖片)在哪裏?

+2

你需要[做一些閱讀](http://faculty.cs.niu。edu /〜mcmahon/CS241/Notes/compile.html)關於你的C++代碼(這是人類可讀的)如何變成機器代碼(不是)。 – Archimaredes

+1

@Archimaredes是每臺機器上的C++機器代碼都一樣嗎? – MyNewName

+6

@MyNewName:這不是,你的問題暗示了這一點對你來說可能太多了...... – DevSolar

回答

6

C++是一種高級語言。它用「源」(純文本,即if (...))編寫,編譯器將其轉換爲機器碼。

機器碼是一個非常不同的,低級語言。首先,C++用「if ... else」做了什麼,機器代碼使用「條件分支指令」,它是一個(序列)特定字節值,即在十六進制編輯器中看到的內容。 「如果」不再存在。

特定命令集和表示這些命令的字節值因CPU系列而異。

如果您對真的感興趣機器碼,請查看Randy Hyde的The Art of Assembly Language Programming。它有一個很好的很好的介紹x86彙編和機器代碼。一般來說,除了專業級別的彈出窗口,除非你在操作系統和/或設備驅動程序上工作,否則你不需要比ASM /機器代碼更多的令牌知識。大部分時間都沒有)。

+0

感謝您的回答!我有一些小問題。 x86是處理器的架構? 'assembly'是與處理器通信的語言? – MyNewName

+2

@我的名字:是的,沒有。如果您在桌面上運行Windows或Linux,則可能使用[x86_64](https://en.wikipedia.org/wiki/X86-64)CPU,這是一種64位版本的32位)[x86](https://en.wikipedia.org/wiki/X86)。 [彙編](https://en.wikipedia.org/wiki/Assembly_language)是一個幾乎類似於機器代碼的中介,具有一些商品特性,但與加入「機器代碼」和「人類可讀」。 (回到真正的*早期時代,我說的是20世紀60年代的這裏,人們*直接寫了機器代碼,沒有人再這樣做,不認真)。 – DevSolar

+2

@MyNewName:(續)有些工具稱爲*反彙編器*,將機器代碼重新組裝。 (對於GNU/Linux工具鏈,'objdump -D',不知道用於這個目的的Microsoft工具。)另外有用的是一個編譯器功能,它將* source *變成彙編。 (這對於GNU CC來說是'-S',我也不知道如何在MS Visual上做到這一點。)後一種方式通常更精確,因爲一些以二進制結尾的東西不是*機器碼,但反編譯器會這樣解釋,給出了一些令人困惑的輸出 - 編譯器知道什麼是更好的。 – DevSolar

7

在可執行文件中找不到if語句,因爲它將被轉換爲機器語言,這是編譯過程的全部目的 - >將C++代碼翻譯成機器知道如何執行的內容。

如果你想'破解'你的.exe,你需要的是一個反彙編程序和知識來使用它,這是一個很長的故事,這就是爲什麼你的問題可能太寬泛的Stackoverflow。

-7

C或C++語言中的if語句是相同的,所以沒有什麼,你可以得到你特殊的if語句用於C++。

而且當你建立你的程序時,它會被轉換成機器級別的語言,所以你在程序後面找不到任何東西。它直接顯示你的輸出