如果你使用ILDASM(在.NET Framework SDK的一部分),它會告訴你相應的代碼字節。
向他們展示,你需要選擇查看 - >顯示字節顯示方法之前。我把一個小的示例應用程序測試,並得到了以下內容:
![Disassembly of a simple property getter in ILDASM with "Show Bytes" enabled](https://i.stack.imgur.com/E6Iln.png)
爲了使用這個數據很重要的是要知道,上的左字節「|」在.dll/.exe中按順序顯示,右邊的按小端編碼。考慮到這一點,我搜索的.exe以下(注意,我強調的是在little-endian順序的字節):
00 02 7B 0A 2B 06 2a
在我的(儘管很小)測試可執行文件中,這個字節序列只出現一次。
注意,在上面的截圖,這也表明,該方法RVA(相對虛擬地址)。爲了將其轉換爲文件位置,您需要確定可執行文件的佈局。有許多PE工具可用,但我使用了Visual Studio附帶的dumpbin
來查看PE標頭(dumpbin /headers <your exe name>
)。這個可執行文件中的有關數據:
SECTION HEADER #1
.text name
1824 virtual size
2000 virtual address (00402000 to 00403823)
1A00 size of raw data
200 file pointer to raw data (00000200 to 00001BFF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
Execute Read
這裏,.text
部分的虛擬地址被表示爲爲0x2000,並具有0x1824字節的虛擬大小。由於該方法的RVA爲0x2464,因此它必須駐留在此部分中。 「文件指針的原始數據」,在從dumpbin
的輸出指示包含我們的方法的部分在爲0x200在可執行文件的開頭,所以我們可以在可執行文件中計算的方法的偏移量爲:
(Method RVA - Section RVA) + File Location
= (0x2464 - 0x2000) + 0x200
= 0x664
去測試可執行文件中的位置0x664,我們要查找的字節確實可以在那裏看到(它們不是完全在這個位置,而是它之後的幾個字節,因爲在IL字節之前有一個小方法頭)。
謝謝你的有趣和有用的描述。在我的情況下,我使用Reflector或ILSpy來實現此方法。這只是從其他方法開始的一種方式。而在這個地方,我只能看到Reflector/ILspy展示給我的東西。他們不顯示十六進制代碼。但是我看到RVA的方法。大! – Oleg
很好的回答!我不知道ildasm有字節視圖!同樣作爲你的答案,看起來不需要dumpbin,因爲ildasm有一個「標題」視圖,顯示所有需要的信息。 – JoeKir