2012-07-01 20 views
4

我有一個測試組件,我想找到方法在文件如何在hex中查找彙編文件中的方法?

[CompilerGenerated] 
public bool get_CreateFlash() 
{ 
    return this.cZBH; 
} 

我用十六進制編輯器和模板來搜索

2B * 26 16 02 7B * * * * 0A 2B * 06 2A 

,其中*是任何字節,因爲我沒有看到確切的字節像ILSpy這樣的工具。

我發現有1500個匹配,自然就是吸氣。不同的是在7B * * * *中,像這樣

"2B 02 26 16 02 7B 1D 00 00 04 0A 2B 00 06 2A" 
"2B 02 26 16 02 7B 1E 00 00 04 0A 2B 00 06 2A" 
... 
etc. 

我怎樣才能找到我需要的東西?

回答

7

如果你使用ILDASM(在.NET Framework SDK的一部分),它會告訴你相應的代碼字節。

向他們展示,你需要選擇查看 - >顯示字節顯示方法之前。我把一個小的示例應用程序測試,並得到了以下內容:

Disassembly of a simple property getter in ILDASM with "Show Bytes" enabled

爲了使用這個數據很重要的是要知道,上的左字節「|」在.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字節之前有一個小方法頭)。

+0

謝謝你的有趣和有用的描述。在我的情況下,我使用Reflector或ILSpy來實現此方法。這只是從其他方法開始的一種方式。而在這個地方,我只能看到Reflector/ILspy展示給我的東西。他們不顯示十六進制代碼。但是我看到RVA的方法。大! – Oleg

+0

很好的回答!我不知道ildasm有字節視圖!同樣作爲你的答案,看起來不需要dumpbin,因爲ildasm有一個「標題」視圖,顯示所有需要的信息。 – JoeKir