簡體   English   中英

反編譯的C#是否從IL / MSIL反向工程?

[英]Does decompiled C# get reverse engineered from IL/MSIL?

當我打開像ILSpy或dotPeek這樣的工具時,我可以選擇查看反編譯的C#或IL。

當您查看反編譯的源時,反編譯器是否將IL反向工程為反編譯的C#等效文件?

如果是這樣,那么反編譯器如何推斷出下面的IL這樣的情況呢? (請注意,這是我想到的第一種語言結構的一個簡單例子,它不能從IL中推斷出來,而不是反編譯器的實際輸出):

IL_0000: nop                  // Do nothing (No operation)
IL_0001: ldstr "C"            // Push a string object for the literal string
IL_0006: stloc.0              // Pop a value from stack into local variable 0
IL_0007: ret    

翻譯成:

public class C {
    public void M() {
        string foo = nameof(C);
    }
}

是的,反編譯工具必須從IL進行逆向工程。

這就是為什么需要為每個版本的C#/ VB更新工具,如果您希望它們反編譯新引入的語言功能。 否則,如果該工具沒有更新,它將放棄嘗試反編譯它或者它將產生高度復雜的代碼,瘋子本可以用該語言的早期版本編寫但很可能沒有。

一些反編譯工具也會嘗試找到實際的源代碼(通過PDB和源服務器),如果他們在這項工作中取得成功,那么你將看到實際的源代碼,當然在這種情況下不會發生反編譯工作。

當然,這些工具將嘗試從MSIL進行逆向工程,但談到您的特定示例 - 無法將MSIL逆向工程

public class C {
    public void M() {
        string foo = nameof(C);
    }
}

沒有extenal指導,如符號(.pdb)文件。 嘗試在庫中編譯上面的語句,然后刪除“.pdb”文件並將.dll放入dotPeek。 您將看到它將按預期反編譯:

public void M()
{
    string foo = "C";
}

現在放回.pdb文件,你會看到你的nameof(C)表達式。

現在放回.pbd文件,但是改變你用來編譯.dll的源代碼的位置(例如,重命名項目文件夾,完全刪除它,或者只是將帶有.pdb的.dll移動到不同的機器上)。 再次在dotPeek中加載它,你會再次看到string foo = "C"; 這是因為.pdb符號可能包含實際源代碼的路徑(例如,您可能會在異常堆棧跟蹤中看到這些路徑),然后反編譯工具使用它直接顯示它而不進行任何反編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM