Reversing-패커 제작
올해 목표가 간단한 패커를 만들어 보는 것이였습니다.
꾸준히 지식 몇개씩 검색을 통해서 얻는중 좋은 블로그를 발견해서 포스팅을 하게 되었습니다.
http://gogil.kr
Reversing.kr 사이트를 만드신 분이라고 들었습니다. 블로그 글들을 봤는데 나이가 어리시던데 정말 지식이 많으시더라구요.
이 분이 패커 제작에 대한 글을 올려서 그것을 퍼왔습니다. (물론 다는 아니고 PE 정보를 간단히 정리한 글이 있어서 퍼왔습니다.)
IMAGE_DOS_HEADER
꾸준히 지식 몇개씩 검색을 통해서 얻는중 좋은 블로그를 발견해서 포스팅을 하게 되었습니다.
http://gogil.kr
Reversing.kr 사이트를 만드신 분이라고 들었습니다. 블로그 글들을 봤는데 나이가 어리시던데 정말 지식이 많으시더라구요.
이 분이 패커 제작에 대한 글을 올려서 그것을 퍼왔습니다. (물론 다는 아니고 PE 정보를 간단히 정리한 글이 있어서 퍼왔습니다.)
PE구조
IMAGE_DOS_HEADER
e_magic : IMAGE_DOS_SIGNATURE = 'MZ'
e_lfanew : IMAGE_NT_HEADERS를 가리키는 주소
IMAGE_NT_HEADERS
Signature : IMAGE_NT_SIGNATURE = 'PE\0\0'
IMAGE_FILE_HEADER
NumberOfSections : 섹션의 개수
SizeOfOptionalHeader : IMAGE_OPTIONAL_HEADER32의 크기. 보통 0xE0
Characteristics : 파일의 속성 ex) exe = IMAGE_FILE_EXECUTABLE_IMAGE, dll = IMAGE_FILE_DLL
IMAGE_OPTIONAL_HEADER32
Magic : IMAGE_OPTIONAL_HEADER32 = 0x10B, IMAGE_OPTIONAL_HEADER64 = 0x20B
SizeOfCode : 코드의 전체 크기
SizeOfInitializedData : 초기화 되어있는 섹션들의 총 합
SizeOfUninitializedData : 초기화 되지 않은 섹션들의 총 합
AddressOfEntryPoint : 프로그램 코드 시작점 (RVA)
BaseOfCode : 코드 영역의 시작 위치 (RVA)
BaseOfData : 데이터 영역의 시작 위치 (RVA)
ImageBase : 메모리에 매핑될 주소
SectionAlignment : 메모리에서 섹션의 최소 단위
FileAlignment : 파일에서 섹션의 최소 단위
SizeOfImage : 메모리에 차지할 크기 ←날 삽질하게 만든 녀석. 아래에서 자세히 다루겠다SizeOfHeader : DOS_HEADER + DOS_STUB + NT_HEADERS + SECTION_HEADER의 합
CheckSum : 무결성 검사. imagehlp.dll - MapFileAndCheckSum() API로 체크함
Subsystem : GUI=IMAGE_SUBSYSTEM_WINDOWS_GUI, CUI=IMAGE_SUBSYSTEM_WINDOWS_CUI
SizeOfStackReserve : 사용할 스택의 크기 지정
SizeOfStackCommit : 예약할 스택
SizeOfHeapReserve : 사용할 힙 크기 지정
SizeOfHeapCommit : 예약할 힙
NumberOfRvaAndSizes : DataDirectory의 개수
DataDirectory[0] = EXPORT Directory
DataDirectory[1] = IMPORT Directory
DataDirectory[2] = RESOURCE Directory
...
DataDirectory[C] = IAT Directory
...
DataDirectory[F]
IMAGE_SECTION_HEADER
Name : 섹션의 이름
VirtualSize : 메모리에서 섹션의 크기
VirtualAddress : 메모리에서 섹션의 시작 위치 (RVA) (SectionAlignment의 배수)
SizeOfRawData : 파일에서 섹션의 크기
PointerToRawData : 파일에서 섹션의 시작 위치 (FileAlgnment의 배수. 일치하지 않으면 버림(내림)함)
Characteristics : 섹션의 속성
IMAGE_OPTIONAL_HEADER32->DataDirectory[1]->VirtualAddress가 가리키는 RVA에는 IMAGE_IMPORT_DESCRIPTOR가 존재한다.
IMAGE_IMPORT_DESCRIPTOR
OriginalFirstThunk : Import Name Table의 주소 (RVA)
Name : DLL 이름 버퍼의 주소 (RVA)
0 개의 댓글