2016-07-08 4 views
0

IMAGE_COR_ILMETHOD_SECT_EH가 작거나 지방을 사용해야하는 것을 어떻게 감지합니까? 다른 내부 CLR 구조/opcode 세부 정보도 제공합니다. 아래 답변은 이것과 다른 많은 질문에 답합니다. 이 경우 예CLR에 뚱뚱한 또는 작은 예외 프레임이 있습니까?

public static Main(string args[]){ 
    int i=0; 
    try{ 
    Console.Write("OK"); 
    } catch(Exception){ 
    i++ 
    } 
0000 4D 5A 90 00 MZ-header 
0250 2A 02 17 8C 06 00 00 01 51 2a 00 
RVA: 1B 30 02 00 // IMAGE_COR_ILMETHOD_FAT 
    1D 00 00 00 CodeSize= 29 
    01 00 00 11 Locals = 11000001 
PC0: 00 16 0A    i=0 
PC3 00 72 01 00 00 70  try{ 
    28 04 00 00 0A  call Console.Write 
    00 00 DE 09 
PC12:26 00 06 17 58 0A 00 DE 00 00 2A (2A is ret command)  

    00 00 00 01 10 00 // IMAGE_COR_ILMETHOD_SECT_EH ??? 1=count 

    00 00  CorExceptionFlag Flags 
    03 00  TryOffset 
    0F   TryLength 
    12 00  HandlerOffset 
    09   HandlerLength 
    08 00 00 01 ClassToken 

위한

/*RVA:0*/ typedef union IMAGE_COR_ILMETHOD{ 
IMAGE_COR_ILMETHOD_TINY  Tiny; 
IMAGE_COR_ILMETHOD_FAT  Fat;} IMAGE_COR_ILMETHOD; 
/*PC = RVA + sizeof(IMAGE_COR_ILMETHOD) = 12 or 4 byte*/ ... Code 
/*EH = PC+CodeSize */typedef union IMAGE_COR_ILMETHOD_SECT_EH{ 
    IMAGE_COR_ILMETHOD_SECT_EH_SMALL Small; 
    IMAGE_COR_ILMETHOD_SECT_EH_FAT Fat; 
} IMAGE_COR_ILMETHOD_SECT_EH; 

https://github.com/dotnet/coreclr/blob/master/src/inc/corhdr.h

우리는 작은 EH 프레임을 갖는다. 우리가 작거나 뚱뚱한 틀을 어떻게 감지합니까?

struct IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_SMALL{ 
     CorExceptionFlag Flags   : 16; 
     unsigned   TryOffset  : 16; 
     unsigned   TryLength  : 8; // relative to start of try block 
     unsigned   HandlerOffset : 16; 
     unsigned   HandlerLength : 8; // relative to start of handler 
     union { 
     DWORD  ClassToken; 
     DWORD  FilterOffset; 
     }; 
    } IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_SMALL; 

typedef struct IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_FAT 
{ 
    CorExceptionFlag Flags; 
    DWORD    TryOffset; 
    DWORD    TryLength;  // relative to start of try block 
    DWORD    HandlerOffset; 
    DWORD    HandlerLength; // relative to start of handler 
    union { 
    DWORD   ClassToken;  // use for type-based exception handlers 
    DWORD   FilterOffset; // use for filter-based exception handlers (COR_ILEXCEPTION_FILTER is set) 
}; 
} IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_FAT; 

답변

1

이 내용은 파티션 2의 섹션 25.4.5 ECMA-335에 해당됩니다.

CorILMethod_Sect_FatFormat 비트 (0x40)가 Kind 필드 (구조의 첫 번째 바이트)에 설정되어 있으면 뚱뚱한, 그렇지 않으면 작게 사용해야합니다. Kind 필드는 Small.SectSmall.Kind 또는 Fat.SectFat.Kind을 통해 액세스 할 수 있으며 작동해야합니다.