From YYpBD's MediaWiki
[옮김] 실행파일에 덧붙인 내용 쉽게 찾기 (...from UNDU.)
소개 : 개나소나 소프트팀. (민성기, 하영재)
원문위치 : http://www.undu.com/Articles/010119d.html
실행파일에 추가된 정보... 저희는 비슷한 상황에서 파일 맨 뒤에 덧붙여진 데이터의 크기를 따로 적어주는 방법을 썼었는데...
역시 정석과 편법의 골은 넓고도 깊군요~~ ^^;
The Unofficial Newsletter of Delphi Users - by Robert Vivrette
--------------------------------------------------------------------------------
Finding Stuff in your EXE's
Angus Johnson - ajohnson@rpi.net.au
실행파일 뒷부분에 이런 저런 정보를 덧붙이고 이것을 다시 꺼내 사용하는 방법에 대해서 한번쯤 고민해 본 적이 있는가?? 이런 방식의 전형적인 예로는 파일 뒷쪽에 압축된 정보를 덧붙인 "자동압축풀림 실행파일" 이 있을 것이다.
어플이 실행될 때 뒷부분의 정보를 찾으려면 무엇보다 실제 실행파일의 크기를 알아야 하는데, 대부분의 경우 일단 컴파일을 마친 후 탐색기로 파일의 크기를 조사해 이 값을 상수로 코드에 때려박는 방법을 쓰고 있다. 이후 실행된 파일은 자기 자신을 파일스트림에 불러들이고 주어진 상수만큼 포지션을 옵셋시켜 덧붙여진 정보에 접근하는 것이 일반적이다.
그러나 실행파일의 크기를 직접 코드에 때려박는 방법은, 소스 코드를 조금만 수정해도 실행파일의 크기가 변한다는 문제가 있다. 아래에 소개하는 함수는 PE포멧의 실행파일 헤더를 계산해 실행코드의 크기를 알아내는 방법으로 이 경우에 좋은 해법이 될 것이다. PE파일 구조의 방대한 내용에 대해 설명하자면 끝도 보이지 않고 지겨워질 뿐이므로 생락하도록 하고, "hInstance 핸들"이 메모리에 로드된 파일이미지에 대한 실제 포인터값이라는 사실만 피가되고 살이되는 정보니 챙겨두도록 하자.
이제 실행파일에 몇 바이트를 덧붙인 다음 아래 함수를 테스트 해 보자. 틀림없이 만족할 것이다...^^;
{$IFDEF VER100}
{델파이 3에는 TImageDosHeader가 없으므로 여기에 간단히 정의해 둔다...}
type
PImageDosHeader = ^TImageDosHeader;
TImageDosHeader = packed record
e_magic : WORD;
e_ignore : packed array [0..28] of WORD;
_lfanew : Longint;
end;
{$ENDIF}
function GetExeSize: cardinal;
var
p: pchar;
i, NumSections: integer;
const
IMAGE_PE_SIGNATURE = $00004550;
begin
result := 0; // if error then result = 0
p := pointer(hinstance);
if PImageDosHeader(p).e_magic <> IMAGE_DOS_SIGNATURE then exit;
inc(p, PImageDosHeader(p)._lfanew);
if pDWord(p)^ <> IMAGE_PE_SIGNATURE then exit; {Win32 PE files only}
inc(p,sizeof(dword));
NumSections := PImageFileHeader(p).NumberOfSections;
inc(p,sizeof(TImageFileHeader)+ sizeof(TImageOptionalHeader));
for i := 1 to NumSections do
begin
with PImageSectionHeader(p)^ do
if PointerToRawData+SizeOfRawData > result then
result := PointerToRawData+SizeOfRawData;
inc(p, sizeof(TImageSectionHeader));
end;
end;