2012-05-08 23 views
0

我正在編程生成.NET程序集清單的庫,我需要獲取程序集模塊的圖像基值。我怎樣才能在C#中獲得它?如何在C#中獲取.NET模塊的圖像基值?

+4

什麼是「影像基地值」?如果我們不得不穀歌來找出這意味着什麼,那麼Google或許可以自己得到答案。 –

+0

您的意思是[DLL的首選基址](http://msdn.microsoft.com/zh-cn/library/b1awdekb.aspx)? – dtb

+0

我認爲他的意思是'ImageBase',ILDASM將提供[如果你問它。](http://msdn.microsoft.com/en-us/library/ceats605.aspx) –

回答

3

您必須閱讀DLL或EXE的Portable Executable頭。說明這樣做可以在這裏找到:

閱讀C#中的可移植可執行(PE)頭
http://code.cheesydesign.com/?p=572

ImageBase位於IMAGE_OPTIONAL_HEADER32

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public struct IMAGE_OPTIONAL_HEADER32 { 
    public UInt16 Magic; 
    public Byte MajorLinkerVersion; 
    public Byte MinorLinkerVersion; 
    public UInt32 SizeOfCode; 
    public UInt32 SizeOfInitializedData; 
    public UInt32 SizeOfUninitializedData; 
    public UInt32 AddressOfEntryPoint; 
    public UInt32 BaseOfCode; 
    public UInt32 BaseOfData; 
    public UInt32 ImageBase;   <------------------ Here 
    public UInt32 SectionAlignment; 
    public UInt32 FileAlignment; 
    public UInt16 MajorOperatingSystemVersion; 
    public UInt16 MinorOperatingSystemVersion; 
    public UInt16 MajorImageVersion; 
    public UInt16 MinorImageVersion; 
    public UInt16 MajorSubsystemVersion; 
    public UInt16 MinorSubsystemVersion; 
    public UInt32 Win32VersionValue; 
    public UInt32 SizeOfImage; 
    public UInt32 SizeOfHeaders; 
    public UInt32 CheckSum; 
    public UInt16 Subsystem; 
    public UInt16 DllCharacteristics; 
    public UInt32 SizeOfStackReserve; 
    public UInt32 SizeOfStackCommit; 
    public UInt32 SizeOfHeapReserve; 
    public UInt32 SizeOfHeapCommit; 
    public UInt32 LoaderFlags; 
    public UInt32 NumberOfRvaAndSizes; 
}