第十一章第1節涉及到很多PE結構的概念順便複習一下:
1、SEH表:編譯器在編譯程序的時候把異常處理函數的地址提取出來,編入一張安全SEH表中,把這張表放到.rdata節區;VS2003以後版本的編譯器默認開啓該選項;可以通過VS自帶的Vistual Studio命令提示dumpbin /loadconfig xxxx來查看:
ida顯示如下:
其實是一個叫load config結構,遺憾的是PEView沒能很好的顯示這部分內容。除了有SEH表還有GS中的cookie和pdb文件路徑,這個SEH表位置緊挨着pdb路徑位置,在winhex看如下:
2、IMAGE_OPTIONAL_HEADER32結構中的DllCharacteristics項和異常有關
typedef struct _IMAGE_OPTIONAL_HEADER
{
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
其中#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 // Image does not use SEH. No SE handler may reside in this image(鏡像不使用SEH)
3、IMAGE_DATA_DIRECTORY數組的第4項DataDirectory[3]規定是EXCEPTION Table,以上面測試的PE文件爲例,EXCEPTION Table表爲空(雖然裏面含有SEH函數),EXCEPTION Table指向內容是什麼?以後探討
4、ILonly標識,有着個標誌(其實就是C#程序)是不涉及異常處理
C、C++生成的PE程序,.text節區存儲的都是彙編代碼;
C#生成的PE程序,.text節區存儲的不僅有彙編代碼,還有C#相關的結構體,而且這裏的彙編代碼也不再是CPU可以直接識別的,而是IL(中間彙編代碼);
爲了兼容C#的程序,微軟使用了IMAGE_DATA_DIRECTORY數組的第15項DataDirectory[14],指向Common Language Runtime Header結構體,該結構體有這個標誌: