안녕하세요. 천리안 프로그래머포럼 C++Builder 담당자 임펠리테리입니다.
글슬?. 답변도 되지 못할 내용이라 감히 [답변]이라고 머릿글을 달지는 못하겠네요.
무슨 일로 exe 파일의 구조가 필요하신지 정말 궁금하군요. 제 돌머리로는 아무리
생각해도, exe 파일의 구조를 알아야 할 경우는.. 없을것 같은데.. ^^;;;;
도스시절에 공부했던 구조를 기초로, 정말 얼마 안되지만 아는데까지만 썰을 풀어
보죠.
실행파일은, 정확히 어디서부터였는지는 기억이 안나는데, 기본적인 헤더라고 할
수 있는 psp(program segment prefix)가 가장 앞에 위치하고 있습니다. 가물거리는
기억으로는 256바이트 크기였던가.. 그랬던거 같습니다.
exe 파일은, 메모리에 그대로 (as-is) 로딩되는 com 파일과는 달리, 각 영역의
세그먼트마다, 그리고 한 세그먼트내에서도 메모리에 로딩되면서 재배치됩니다.
여러개의 세그먼트를 가지는 exe자체의 특성으로 알고 있습니다.
여기에 기록된 정보를 기초로 exe 파일의 특정 옵셋으로부터 옵셋까지를 메모리 특정
위치에 로드합니다. 다 로딩이 되면 코드 세그먼트로 로딩된 첫번째 메모리 옵셋으로
점프해서 실행에 들어가지요.
윈도우즈의 경우, 다들 아시는 것처럼, 도스영역의 실행파일 부분과 윈도우즈 실행을
위한 실행파일부분이 나누어져 있습니다. 그리고 윈도우즈 부분이 시작되는 부분은,
거의 항상 일정한데, 지금 찾아보니 0000:0100h 이군요. 'PE' 라고 시작되는 부분이
윈도우즈 실행부분의 시작표시입니다.
내용은 보지 못했는데.. 2~3년정도 전의 마소였던가 프세에 한번 윈도우즈 실행파일
의 구조가 단발 기사로(연재가 아녔던거 같습니다) 나왔었습니다. 자세히 기억하지
못해 죄송하네요. 도서관같은 곳에서 뒤져보면 좋으실거 같네요.
글쎄.. 참고삼아 몇마디 더 말씀드리면...
웬만큼 복잡한 코드가 아니라면, 실행파일의 일정한 부분을 항상 데이터로 가지고
있고 나머지 부분만 갖다붙여서 실행파일을 만들어내는 것도 괜찮지 않을까 싶습니다.
실제로, 잘 알려진 zip 컴퍼넌트인 DelZip에서 self-extracting 압축파일을 만들어내
는 방법이 바로 이 방법입니다. (zipsfx.bin 이 바로 압축데이터를 제외한 실행파일
부분이고, self extracter를 만들때 이 파일을 갖다붙여서 만들어냅니다)
어떤 목적으로 실행파일을 분석하려고 하시는지.. 혹 컴파일러를 만들겠다는 생각이
아니시라면, 좀더 구체적으로 목적을 말씀해주시면 저도 자세히 알아보고 답변을
해드리도록 하겠습니다. 물론.. 제가 아는 한도에서요. ^^;;;;
그럼.. 참고하시길...
독립문에서 임펠리테리였습니다.
(cbuilder, cbuilder@thrunet.com)
|