ABOUT ME

Contact.
Email:yj.anthonyjo@gmail.com
Introduce : CS Student.

Today
-
Yesterday
-
Total
-
  • PE 구조
    카테고리 없음 2018. 5. 12. 21:36
    반응형

    오늘은 재미삼아 PE구조를 공부하고 있다. 공부과정에서 정말 정리가 잘되있는 블로그(http://haerakai.tistory.com/18)에서 다루지 않은 일부 내용을 구글링후 정리해 본다. 그리고 다룬내용도 있다. ㅎㅎㅎ

    1. IMAGE_FILE_HEADER's Time Date Stamp

    이에 관련된 한글 문서가 없었지만, PEView를 설명하는 외국 문서에 있었다.

    What is Time Date Stamp? It is a 32-bit value, giving the time and date the PE file was compiled. ...  즉 컴파일한 시점을 기록해 둔 것이다. 

    2. IMAGE_FILE_HEADER's SizeOfOptionalHeader

    IMAGE_NT_HEADER의 IMAGE_FILE_HEADER 다음에 나오는 IMAGE_OPTIONAL_HEADER의 크기를 담은 것이다. 내 분석파일( svr.exe(자작 원격조종해킹툴))은 E0,224바이트이다. 그리고 이 구조체의 크기를 담는 부분이 있다는 의미는 IMAGE_OPTIONAL_HEADER의 크기가 가변적이라는 뜻이다.(왜??)


    3. IMAGE_FILE_HEADER's Characteristics

    여기에 담겨있는 값은 실행파일의 특성을 나타낸다.

    0x0001

    - 파일에 대한 재배치 정보가 없으므로, 기본 주소에 로드 되어야한다는 의미입니다.

    0x0002

    - 확인되지 않은 외부참조가 없고, 파일이 실행가능하다는 의미입니다.

    0x0004

    - COFF 라인 번호가 파일에서 삭제되었다는 의미입니다.

    0x0008

    - COFF 심볼 테이블 항목이 파일에서 삭제되었다는 의미입니다.

    0x0010

    - 적극적으로 워킹 셋을 정리해야한다는 의미입니다.

    0x0020

    - 응용 프로그램이 2GB보다 큰 주소를 처리할 수 있다는 의미입니다.

    0x0080

    - 단어의 바이트가 반대로 되어있다는 의미입니다.

    0x0100

    - 32비트 단어를 지원한다는 의미입니다.

    0x0200

    - 디버깅 정보가 해당 파일에 없고 다른 파일에 저장되어있다는 의미입니다.

    0x0400

    - 파일이 이동식 미디어에 있는경우, 그것을 복사하여 스왑파일에서 실행한다는 의미입니다.

    0x0800

    - 파일이 네트워크상에 있는 경우, 그것을 복사하여 스왑파일에서 실행한다는 의미입니다.

    0x1000

    - 파일이 시스템 파일임을 의미합니다.

    0x2000

    - 파일이 DLL 파일이며, 이것이 실행파일이지만 직접 실행할 수는 없다는 의미입니다.

    0x4000

    - 파일이 단일 프로세서 컴퓨터에서만 실행되어야 한다는 의미입니다.

    0x8000

    - 0x0080과 같은 의미 입니다.

    출처: http://haerakai.tistory.com/18 [Haerakai's Lab]

    너무 많아 복붙했다.ㅎㅎ 그리고 이 값들을 다 더한값으로 저장된다고 한다.

    일반적으로는 0x101F가 저장되있다고한다. 

    내 프로그램은 0x102가 저장되었다. 즉 외부참조가 없으며 32비트를 지원한다 이게 끝이다.


    4, 이제 아까 SizeOfOfficialHeader가 가리켰던 IMAGE_OFFICIAL_HEADER를 분석해보자.

    블로그 저자는 이부분이 PE의 헤더에서 가장 중요하다고 한다.

    필드가 많지만 특정부분만 살펴보자.


    4.1. MAGIC

    헤더의 맨 위 첫 부분에 e_magic이 있었다. 그리고 이것은 그 구조체의 시작을 의미했다. 이와 마찬가지로 이 구조체의 시작을 알리는 것이고 만약 32bit환경이면 0x10B가 저장되고 64bit이면 0x20B가 저장된다.


    4.2. AddressOFEntryPoint

    즉 요약하면 처음으로 실행 될 소스코드의 RVA(가상메모리(프로그램실행위해 생긴 메모리,32bit환경-> 4byte할당, 64->8byte할당)의 PE파일이 로딩된 주소로부터의 거리)이다. 너무 설명이 길기에 이것도 복붙한다. 해라카이님 감사합니다. ;)


    4.3. IMAGEBASE

    이 필드는 위에서 말했던 pe파일이 가상메모리에 로드된 첫 주소를 가지고 있다. 

    즉VA값을 가지며, RVA의 첫 주소를 가지고 있다.

    보통 EXE파일은 0x00400000을, DLL은 0x00100000을 가지고 있다. 


    4.4.SectionAllignment

    이건 다시 더 공부하기, 이해안됨 블로그기준 3.3.4이다.


    반응형

    댓글

Designed by Tistory.