본문으로 바로가기

핸들(Handle)은 프로세스 정보 중 하나로 커널이 관리하는 오브젝트들에 할당되는 유일한 '값'

프로세스 생성시 필요한 자원에 대한 사용 요청을 할 때 사용 하는 값. 파일, 디렉터리, 포트, 스레드, 세마포어 등이 포함

하나의 프로세스에 여러 개의 핸들을 가지고 있는 것이 일반적


PID(Process ID)는 프로세스를 구분하기 위해 커널에서 제공하는 유니크한 ID


커널 객체는 핸들보다 유니크하게 구분하는 ID가 더 중요

다른 객체들은 ID가 없고, 유저 객체를 컨트롤 하기 위해서는 핸들이 있어야 함


윈도우 핸들은 다른 프로세스로 넘길 수 있음, 핸들을 사용한다는 것은 전역적이라는 것

예를 들어 A,B 프로세스가 있고, A프로세스의 커널객체의 핸들값이 200일 때 ID를 B에게 알려주면 언제든 핸들을 찾을 수 있음

(B프로세스가 사용할 핸들을 만들어 줌, A,B프로세스가 핸들 값이 각각 달리 할당되지만, ID는 같아서 사용 가능)

출처 : http://sapzapee.tistory.com/469 


핸들 - 프로세스 내에서 해당 객체를 액세스할 때 사용하는 한정적인 값이며 이 핸들을 사용하여 객체를 마음대로 조작할 수 있다. (C++의 지역변수)
ID -  시스템 전역적인 값이며 다른 프로세스 ID와 절대 중복되지 않는다. 그래서 프로세스끼리 ID를 전달함으로써 목적이 되는 프로세스 핸들을 다시 오픈할 수 있다. 실행 중인 프로세스의 ID는 작업 관리자에서 쉽게 확인할 수 있다.
(C++에서 Get 함수)

정리 - 프로세스 ID는 프로세스간의 구분을 위한 중복되지 않는 식별값일 뿐이며 ID로부터 직접 프로세스를 제어할 수는 없다. ID로부터 핸들을 발급받아야만 비로소 이 객체를 제어할 수 있다.

출처 : http://yonghello.tistory.com/entry/%EC%8A%A4%EB%A0%88%EB%93%9C

hInstance : 프로그램의 인스턴스 핸들


GetProcAddress()

FARPROC GetProcAddress(

HMODULE hModule // DLL 인스턴스

LPCSTR lpProcName // 함수 이름

);

hModule은 로드한 DLL의 인스턴스 핸들

lpProcName은 hModule 안에 있는 함수 이름


**HMODULE 과 HINSTANCE**
이 둘은 16bit 운영체제에서 사용되다가 남아있는 것으로 32bit 인 현재는 모듈의 Base Address라는 의미로 통일되어 사용된다.
16bit에서의 개념
16bit 체계 에서는 모든 프로세스가 단일 메모리공간을 공유했으므로 동일한 프로세스가 반복해서 쓰일 경우(notepad.exe 창을 여러 개 띄우는 등) 사용되는 코드 자체는 동일 하므로 효율성을 위해 특별한 조치가 필요했다.
이때 사용된 것이 두 형태의 변수이다.
HMODULE 은 프로세스들이 공유하는 코드영역을 가리키는 용도
HINSTANCE 는 프로세스들 각각에 대한 데이터 영역을 가리키는 용도로 사용되었다.


FARPROC은 typedef int (FAR WINAPI *FARPROC)();으로 int형을 리턴하고 __stdcall의 형태인 함수에 대한 포인터 FARPROC이라는 함수 포인터 타입

주소를 알아오는 함수의 인자 형태가 일정하지 않아서 FARPROC을 사용하여 인자의 유연성을 둠


FAR란?
현재 실행중인 가상메모리 공간(페이지) 에서 바로 접근하지 못 하고 다른 공간 (주로 dll이 로딩된 공간이 되겠다.) 에 해당 함수에 대한 코드가 존재 할 경우 사용한다. 위에서 예로든 GetProcAddress 함수로 다시 설명을 해보자. 
보통 함수에 대한 참조를 하려면 해당 DLL 을 메모리로 로딩 하거나 맵핑 후 가지고 온다. LoadLibrary를 사용하여 DLL을 로딩 하게 되면 처음 로딩 때는 DLL을 위한 새로운 공간이 메모리에 마련되어 DLL이 로딩되고 해당 프로세스의 가상 메모리(가상 메모리의 페이지)로 맵핑 된다. 그 후 두 번째 참조부터는 참조 카운트만 1 증가하고 호출한 프로세스의 페이지에는 이미 올라와있는 DLL공간이 맵핑 되도록 하는 방식이 적용된다. Kernel32.dll 이나 User32.dll 처럼 대부분의 프로세스가 사용하는 DLL은 이미 메모리 공간 어딘가에 로딩 되었을 가능성이 크기 때문에 현재 프로세스의 가상메모리 공간에서 바로 참조를 할 수가 없는 것이다. 그러한 경우 적용하기 위해 FAR 이라는 키워드가 사용된다.


출처 : http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=7899



'[ IT ] > 리버싱' 카테고리의 다른 글

API 후킹 - API 코드 패치 동작 원리  (0) 2015.11.29
hInstance와 imagebase  (0) 2015.11.28
리버싱 4장 API 정리  (0) 2015.11.28
리버싱 3장 API 정리  (0) 2015.11.19