PE 포맷의 각종 잘(?!) 사용되지 않는 Size 필드들을 가지고 장난쳐서 파일을 오버레이 시키곤 하는 변태 패커 중에 Upack이 있다. 자세한 설명은 이 글을 참고하도록 하고,… 언젠가 나도 한 번 당했었는데 웬만한 필드는 다 계산해서 사용하기에 문제가 없다고 생각했는데 섹션 헤더를 구하는 부분에 문제가 있었다. 흔히 별 생각 없이 아래와 같은 코드를 사용하고 있었는데 이게 Upack으로 패킹된 파일에는 문제가 된다.
PIMAGE_NT_HEADERS nt = 적절한 NT 헤더 포인터;
PIMAGE_SECTION_HEADER sec;
sec = (PIMAGE_SECTION_HEADER) GetPtr(nt, sizeof(*nt));
OptionalHeader에 SizeOfOptionalHeader 필드가 있는데 그 값이 일반적인 값이라면 위 코드는 큰 문제 없이 동작한다. 그런데 Upack은 다르다. SizeOfOptionalHeader를 가지고 장난질을 치기 때문에다. 그래서 아래와 같이 해당 필드 값을 토대로 계산을 해 주어야 정확한 섹션 헤더 위치를 얻을 수 있다.
#define \
GetSectionHeaderFromNt(nt) \
((PIMAGE_SECTION_HEADER) \
GetPtr(&(nt)->OptionalHeader, (nt)->FileHeader.SizeOfOptionalHeader))
덧) 자매품 UPX의 함정도 있다 ㅋㅋ~