2014. 9. 25. 13:12
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

PE -> 실행 파일 구조 -> MZ, PE 확인 



PEview 

PEBrowse



PEview.exe


HxDSetupKOR.zip

putty.exe





--------------------


IMAGE_DOS_HEADER



Dos헤더  ->  #include <winnt.h>


WORD e_magic;   // magic number  -> MZ  -> 소문자는 안됨 

WORD e_cbip;     // 

...

...


LONG e_lfnew;   // File address of new exe header  ->  NT헤더의 시작 주소를 가짐 

                                                                                -> PE 라는 글자가 시작 되는 곳





DOS헤더


MS-DOS Stub program -> 윈도우 일때, 도스 전용 프로그램은 실행 할 수 없음 

                                 -> 변경해도 파일 실행에 지장이 없음 


NT헤더 -> 멤버 3개

-> DWORD Signature   -> PE\0\0

-> Image_File_Header -> typedef된 구조체 ->  

-> WORD  Machine;  cpu의 고유한 식별값을 담고 있음                     32     /    64 bit    /  AMD

0x014c /  0x0200    / 0x8664


-> WORD NumberOfSection;    섹션의 개수를 담고 있음 

   -> 4

-> WORD TimeDateStamp; PE파일 생성된 시간, 빌드된 시간 

        -> 변경이 쉬워서 그냥 참고만 하기 


-> WORD  SizeOfOptionalHeader;  

 다음 나오는 optional헤더의 크기를 알고 있음 

->보통 E0이라는 값을 가짐


 -> WORD Characteristics;

-> exe (0x0002), dll(0x2000)파일 인지 구분 

    010F  -> bit화 시켜서 OR 

                  -> 하나의 값으로 여러개를 표현 




--------



IMAGE_OPTIONAL_HEADER


멤버들


WORD Magic;    0x10B -> 32  bit

      0x20B -> 64  bit

...

...


**

DWORD AddressOfEntryPoint;

 -> entry point, EP 라고도 부름 

 -> 프로그램이 처음으로 시작될 코드의 주소를 담고 있는 멤버 (RVA)

-> VA  (virtual address)

       -> 절대 주소, 실제 주소  

-> RVA, r for relative -> 상대 주소 

    -> 기준을 잘 확인 



---------



IMAGE_OPTIONAL_HEADER(NT addtional fields)


멤버들


DWORD ImageBase;     PE가 메모리 상에 로딩(매핑) 되었을때 시작 주소 -> RVA의 기준값

             image -> 메모리상에 로드된 상태 

             imageBase + entrypoint    ->  address of entry point (프로그램이 처음 시작되는 주소)



DWORD SectionAlignment;   섹션의 배치 간격을 나타내는 멤버 

                                        메모리상의 섹션의 배치 간격

    ex) alignment의 배수가 되어야 함 

          75 -> null padding영역 -> 100 

    150 ->  -> 300


DWORD FileAlignment;       파일상의 섹션의 배치 간격




**

PE가 메모리상에 있는 모습과 파일상의 모습이 같을수도 있고, 다를 수도 있음 

     -> 75 -> null padding 영역 -> 200

         150 -> null padding  -> 400



-> PE 조작할 때 잘 고려 해야 함 





DWORD SizeOfImage;

  -> 메모리 상에서 PE가 차지하고 있는 크기 


WORD Subsystem;

          1: drive계열 파일

          2; GUI   g for graphic 

          3: CUI   c for console




DWORD NumberOfRvaAndSizes;

   -> imageDataDirectory 원소 개수 -> 0x10  -> 고정은 아님, 값이 바뀔 수 있음




---------


IMAGE_DATA_DIRECTORY


구조체 배열  -> 0~15  

마지막 15번은 null로 채워져 있음




주요 배열 정보 


0번 방 : export 함수 정보가 있음 

1번 방 : import 함수 정보 

9번 방 : TLS 정보 -> 안티 디버깅시 주로 사용 



DWORD VirtualAddress;

DWORD Size;





----------------


IMAGE_SECTION_HEADER


섹션의 개수 만큼 존재

정보만 알고 있음 



...

...


DWORD VirtualSize;

-> 메모리 상에서 섹션이 차지하고 있는 크기


DWORD VirtualAddress;

-> 메모리상에서 섹션이 시작하는 주소 





DWORD SizeOfRawData;

-> 파일상에서 섹션이 차지하고 있는 크기 


DWORD PointerToRawData;

-> 파일상에서 섹션이 시작하는 위치 

...

...

..



DWORD Characteristics;

-> 섹션에 대한 속성, 특징 

 IMAGE_SCN_CNT_CODE    -> 코드 인지

 IMAGE_SCN_CNT_INITIALIZED_DATA   -> 초기화 되어 있는지 

 IMAGE_SCN_CNT_UNINITIALIZED_DATA    -> 초기화 되어 있지 않은지 

 IMAGE_SCN_MEM_EXECUTE   -> 실행이 가능한지

 IMAGE_SCN_MEM_READ   -> 읽기가 가능한지

 IMAGE_SCN_MEM_WRITE   -> 쓰기가 가능한지 


-> bit 화 하여 OR 연산 -> 여러개의 속성들을 하나의 값으로 표현 가능



-------------




다시 PE 구조 정리 


PE

-> 메모리와 파일 상에 존재 



<FILE상에 존재하는 PE>


DOS_H

NT_H

SECTION_H

...

section들
...

...





<메모리 상에서 존재하는 PE>

DOS_H

Magic -> MZ

e_lf..  -> NT헤더 값


NT_H

멤버1: PE signature -> PE\0\0

      멤버2: IMAGE file header -> 구조체 맴버 

       -> machine -> cpu의 고유한 값을 가짐  32 bit (0x014c)/64 bit (0x0200)


-> numberofsections -> 섹션의 개수  -> ex) 4 

-> timedatestamp  -> 생성, 빌드된 시간 

-> sizeofoptionalheader -> optional header의 크기 -> 0xE0  -> 다른 값 올 수 있음

-> characteristics -> 속성,특징 -> exe(0x0002) / dll(0x2000)


멤버3 : OPTIONAL_H  -> 구조체 중 가장 큼

magic -> 32 bit 0x10B

         -> 64 bit 0x20B


addressofentrypoint -> 프로그램이 처름 시작되는 주소 (RVA)

->상대 주소 ->  기준이 필요  -> imagebase가 기준이 됨 

-> 메모리상

-> ep + imagebase -> 코드 시작점 



alignment -> 섹션의 배치 간격을 나타냄 

-> filealignment -> 파일상의 배치 간격 

-> sectionalignment -> 메모리상의 배치간격



sizeofimage -> 메모리상에서 PE가 차지하는 크기 


subsystem -> 1. 드라이브 계열

   2. GUI

   3. CUI




IMAGE_DATA_DIRECTORY


구조체 계열

numberofrvasize -> 0x10 (16개)

0~15 -> 마지막 방을 null로 채워져 있음 


0:export

1:import

9: TLS






SECTION_H

정보 


2개씩 묶어 확인 


virtual   -> 메모리 

size 메모리상에서 섹션이 차지하는 크기 

address 메모리 상에서 섹션이 시작하는 주소 



Raw  -> file

size 파일상에서 섹션이 차지하는 크기

pointer 파일상에서 섹션이 시작하는 위치 


characteristics  -> 속성 -> 읽기, 쓰기, 실행, 초기화, 코드인지 



...

...



파일에서는 offset 이라는 용어를 사용 









'Reversing' 카테고리의 다른 글

Packing & MUP  (0) 2014.10.02
report  (0) 2014.10.02
summing-up questions  (0) 2014.09.24
analyzing files using ollydbg  (0) 2014.09.24
analyzing assembly sentences  (0) 2014.09.23
Posted by af334