|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=7899 [복사]
GetProcAddress 의 정의
FARPROC WINAPI GetProcAddress(
_In_ HMODULE hModule,
_In_ LPCSTR lpProcName
);
FARPROC
정의: typedef int (FAR WINAPI *FARPROC)();
정의 부분은 함수 포인터를 공부 했다면 알 수 있을 만한 내용이라고 생각된다.
int 형을 return 하고 함수 호출 규약은 __stdcall 의 형태인 함수에 대한 포인터 FARROC 이라는 함수 포인터 타입을 선언 한 것이다.
GetProcAddress 라는 API 함수는 hModule 이 가리키는 모듈의 Base Address에 해당하는 lpProcName 이 가리키는 함수의 포인터를 가지고 온다. 이 때 주소를 알아오는 함수의 인자 형태가 일정하기 않기 때문에 FARPROC을 사용하여 인자의 유연성을 두는 것이다. FAR에 대한 내용은 뒤에서 설명 하도록 하겠다.
**모듈이란**
프로그램의 일부로써 쉽게 표현하면 함수들의 집합을 의미한다. 우리가 흔히 볼 수 있는 형태는 DLL을 볼 수 있다. 하나의 DLL은 관련된 함수들의 집합으로 이루어져 있고, 현재의 많은 프로그램은 필요할 때 이러한 DLL 모듈을 여러 개 메모리로 로딩하여 동작하게 된다.
http://www.terms.co.kr/module.htm
**HMODULE 과 HINSTANCE**
이 둘은 16bit 운영체제에서 사용되다가 남아있는 것으로 32bit 인 현재는 모듈의 Base Address라는 의미로 통일되어 사용된다.
16bit에서의 개념
16bit 체계 에서는 모든 프로세스가 단일 메모리공간을 공유했으므로 동일한 프로세스가 반복해서 쓰일 경우(notepad.exe 창을 여러 개 띄우는 등) 사용되는 코드 자체는 동일 하므로 효율성을 위해 특별한 조치가 필요했다.
이때 사용된 것이 두 형태의 변수이다.
HMODULE 은 프로세스들이 공유하는 코드영역을 가리키는 용도
HINSTANCE 는 프로세스들 각각에 대한 데이터 영역을 가리키는 용도로 사용되었다.
http://blog.naver.com/PostView.nhn?blogId=chioo79&logNo=120096218243
WINAPI란?
정의: #define WINAPI __stdcall
함수호출 규약 중 하나로 callee 에서 스택을 정리하는 형태를 보이며 Win32 API에서는 이 방식을 사용해서 함수를 호출한다. 자세한 사항은 [P06] 메모리의 이해 -> Calling Convention 에서 확인하기 바란다.
http://msdn.microsoft.com/en-us
FAR란?
현재 실행중인 가상메모리 공간(페이지) 에서 바로 접근하지 못 하고 다른 공간 (주로 dll이 로딩된 공간이 되겠다.) 에 해당 함수에 대한 코드가 존재 할 경우 사용한다. 위에서 예로든 GetProcAddress 함수로 다시 설명을 해보자.
보통 함수에 대한 참조를 하려면 해당 DLL 을 메모리로 로딩 하거나 맵핑 후 가지고 온다. LoadLibrary를 사용하여 DLL을 로딩 하게 되면 처음 로딩 때는 DLL을 위한 새로운 공간이 메모리에 마련되어 DLL이 로딩되고 해당 프로세스의 가상 메모리(가상 메모리의 페이지)로 맵핑 된다. 그 후 두 번째 참조부터는 참조 카운트만 1 증가하고 호출한 프로세스의 페이지에는 이미 올라와있는 DLL공간이 맵핑 되도록 하는 방식이 적용된다. Kernel32.dll 이나 User32.dll 처럼 대부분의 프로세스가 사용하는 DLL은 이미 메모리 공간 어딘가에 로딩 되었을 가능성이 크기 때문에 현재 프로세스의 가상메모리 공간에서 바로 참조를 할 수가 없는 것이다. 그러한 경우 적용하기 위해 FAR 이라는 키워드가 사용된다.
http://stackoverflow.com/questions/2774171/what-is-far-pascal
|
Hit : 14996 Date : 2013/08/13 05:54
|