이 장은 SHLoadInProc 라는 강력한 함수로 인하여
우리가 얼마나 쉽게 윈도우즈 쉘의 메모리안에 접근이 가능한지를 보여준다.

여기에 논의되는 대부분읜 코드는 Dll로 설계된 COM 파일이며,
기본적인 내용을 제외하고는 아주 간단한 코드가 추가될 뿐이다.

여러분들의 최소한의 COM 오브젝트를 만들기 위하여
다음과 같은 함수를 생서하여 주어야 한다.

프로젝트의 생성은 MFC에서 Win32 Dynamic Link Library로
생성하였으며, Blank로 만들면 된다.

여기에 적당한 헤더들을 연결하고..

DllGetClassObject()
DllCanUnloadNow()
DllRegigterServer()
DllUnregisterServer()

각각의 소스 구현은 첨부파일에 있으며.. 여기서는 위의
4개의 함수의 필요성과 구현에 대한 개념을 설명한다.

이글을 쓰고 있는 필자는 COM에 컴자도 모르고, ATL도 모른다.
단지 Shell Programming를 공부해가며 위의 개념이 나오므로 그냥 하나의 프로그램 코드로 이해하며 넘어가고 있다.

1. DllGetClassObject() 함수

STDAPI DllGetClassObject(
REFCLSID rclsid,
REFIID riid,
LPVOID* ppv)

COM객체의 클라이언트는 어떤 것이든지 먼저 COM 객체를 포함하고 있는 라이브러리를 로드시켜야 한다. 그리고 나서, DllGetClassObject() 통해 그것이 필요로 하는 인터페이스 포인터를 얻는다. 자세한 것은 필요없고 중요한 것은 이 함수가 항상 호출된다는 것이다. 그리고 바로 그 클래스 객체가 로드된다. 풀어서 설명하면 이 COM 객체를 로딩하는 놈이 있으면 그 로딩하는 클라이언트에 의해서
DllGetClassObject() 함수가 호출되어진다는 것이다.
그리고 내가 만든 이 COM 객체는 나를 호출하는 클라이언트의 메모리 않에서 동작하게 된다.

대게 모듈들이 객체를 읽어 들일경우 DllGetClassObject를 호출하면서 IClassFactory 인터페이스란걸 요청한다.
하지만 우리는 (혹은 나만) COM이 먼지 모르므로 그러한 요청에 응답할 수 없다고 답변하면 된다.

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return CLASS_E_CLASSNOTAVAILABLE;
}


2. DllCanUnloadNow의 역활

DllGetClassObject를 이용하여 COM 객체를 읽어들인 모듈은DllCanUnloadNow()를 호출하여 확실하게 그 DLL이 안전하게 메모리에서 사라지도록 해야한다.
즉 위의 함수가 S_OK를 리턴하면 메모리상에서 제거할 수 있는 것이다.

STDAPI DllCanUnloadNow()
{
return S_OK;
}

3. 그리고 나머지
DllRegigterServer()
DllUnregisterServer() 는 regsvr32.exe를 이용하여 이
COM 객체를 등록하고 해지하는 역활을 담당한다.

뭐 구지 사용하기 귀찬으면 REG파일을 만들어도 된다.

지금 까지가 설명한 중요한 것은 다 넘아갔다.
우스을지 모르지만 나머지 코딩은 그냥 APP 프로그램과
동일하다.

즉, COM으로 프로젝트를 만든다는 것과 위에서 설명한 두 함수의 대강의 용법만 깨우치면 우리는 쉘에 침략할 수 있다.

참고로 위에서 설계한 COM 객체를 등록는 것은 걍하고..
구동하는 것은

임의의 어플리케이션이나 머 아무거나 만들어서..
const CLSID clsid = {0x????????, 0x????, 0x????,
{0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??}};

SHLoadInProc(clsid);

이렇게 구동하면 된다...

코드가 쫌 길어서 짜증나지만.. 정말 도전해볼만한 프로그램이다.

지금 다루고 있는 SHLoadInProc() 함수를 이용한 쉘에 대한 도전과 생략한 기법중에 하나가 Hook 이다..
Hoo에 대한 설명은 앞으로도 생략할 것이고..

이 장을 넘어가면 Browser Helper Object (BHO)라는 것을
이용하여 좀더 용이하고 좀더 확장된 기능으로 쉘에 대한 침략을 할것이다. 이를 위하여 위에서 설명한 최소한의 COM 객체를 구혈할 수 있어야 하며, 그로 인한 동작을 직접 코딩하여 동작 시켜보아야할 필요가 있다.

^^;

+ Recent posts