주의: 여기서 설명한 방법을 사용하여 자신의 윈도우즈XP를 고치면 마이크로소프트로부터 더이상 고객지원을 받을 수 없다. 고객지원이 필요하거나 장차 필요할 것으로 예상되는 사람들은 이 방법을 사용하지 말아야 한다.

주의: 여기서 설명한 방법을 현재 사용중인 시스템에 적용하면 시스템이 불안정해지거나 최악의 경우 자료를 잃고 시스템을 다시 설치해야 하는 수도 있다. 이러한 위험성을 원하지 않는다면 이 방법을 사용하지 말아야 한다.

윈도우즈2000부터 마이크로소프트가 도입한 윈도우즈 시스템 파일 점검/보호 도구는 상당히 유용한 도구이다. 다만, 한가지 불만스러운 점은 보호대상이 되는 파일들의 경로명이 이진파일에 포함되어 있어, 어떤 파일들이 보호되는지 보기도 어렵고, 그 파일 목록을 바꾸기도 어렵다. 예컨대, 지금 당장 c:\Program Files(혹은 설치시 정해준 해당 드라이브/디렉토리) 안을 들여다 보면 뭐에 쓰이는지도 모르는 xerox라는 디렉토리가 보인다. 텅빈 디렉토리가 왜 시스템 보호에 중요한지는 마이크로스프트만 알 일이다. 이 디렉토리는 지워도 지워도 자꾸 생긴다.

알려진 해결법들

이를 해결하는 방법으로 현재까지 알려진 방법은 (1)에서 받아올 수 있는 sfcfiles.dll대체품을 써서 WFP를 실질적으로 무력화시키는 방법과 (2)에서 설명된 대로 sfcfiles.dll을 일일이 이진코드수준에서 편집하는 방법이 있다.

(1)의 방법은 엉뚱한 파일/디렉토리 지우자고 시스템을 무방비로 만들겠다는 것이니 매우 위험하다. (2)의 방법은 엉뚱한 파일/디렉토리들만 무력화시키는 것이니 훨씬 좋은 방법이나 이것을 이진수준에서 편집한다는 것이 매우 번거롭다. 어떤 파일/디렉토리가 엉뚱한 것들인지를 미리 다 알고 있지 않는한, 그것을 알아낼때마다 이진편집을 하는 것은 꽤나 고생스러운 일이다.

새로운 방법

이제 설명하는 방법은, (2)의 방법을 소스코드 수준에서 편리하게 하도록 하는 방법이다. 각자가 소스코드를 약간 고침으로써, 자기에게 불필요한 파일들은 언제든지 지우되, 중요한 파일들은 계속 보호하도록 하는 것이다. 원리는 매우 간단하다. sfcfiles.dll은 단 두개의 함수만 외부로 노출시키는데, 그 두 함수 모두 단순히 보호대상 파일의 리스트를 전달하는 역할만 한다. 이것을 자체적으로 구현하면 문제가 해결되는 것이다. 이것을 C코드로 쓰면 다음과 같다.

/* 구현 */
#include <windows.h>
/* 파일 리스트 구조체 */
struct _SFCFILES {
WORD *cdname; /* 설치 CD상의 파일이름. 어쩌다 나온다. */
WORD *fullpath; /* 경로명. 항상 있다. */
WORD *infname; /* .inf 파일 이름. 어쩌다 나온다. */
};
struct _SFCFILES list[] = {
/* 여기에 보호할 파일 목록이 온다. 3000여개이므로 생략. */
};
DWORD nitems = sizeof(list)/sizeof(struct _SFCFILES);

/* 엄밀하게 하자면, NTSTATUS형을 반환한다. */
int WINAPI SfcGetFiles(struct _SFCFILES **pList, DWORD *pN)
{
*pList = list;
*pN = nitems;
return 0;
}
/* ordinal 1, 함수이름은 노출되지 않았다. */
int WINAPI SfcOrd1(int i, struct _SFCFILES **pList, DWORD *pN)
{
*pList = list;
*pN = nitems;
return 0;
}

맞춤 제작

이렇게 간단한 원리를 이용해서 sfcfiles.dll 대체품을 만들려면 마이크로소프트의 C컴파일러가 필요하다. 혹시라도 C컴파일러가 없는 사람은, 그것을 마이크로소프트 웹사이트에서 무료로 구할 수 있다. 비주얼 C++ 익스프레스윈도우즈 DDK 를 받아서 설치하면 된다. (테스트는 윈도우즈 DDK를 이용해서 했다.)

도구가 준비되었으면 다음 링크에서 소스코드를 받는다.

소스코드 중에서 default서브디렉토리에 들어있는 파일들은 윈도우즈XP의 각각의 에디션에 따라 보호하는 파일목록을 망라해 놓은 것이다. 이들중에서 자신이 사용하는 에디션에 맞는 파일을 골라 filelist.c로 복사하고 편집한다. 예컨대, 윈도우즈XP프로페셔널의 파일목록을 편집하려면 default\pro.c를 편집하고 파일 이름을 바꾸어 filelist.c로 저장하면 된다.

마지막으로, sfcfiles.dll을 만드는 예는 make.cmd에 있다. 아주 단순한 명령어 나열이니 쉽게 자신의 상황에 맞추어 바꿀 수 있다.

설치

주의: 새로 만든 파일을 설치하는 순간 마이크로스프트의 고객지원을 받을 권리를 상실한다. 마이크로소프트의 고객지원이 필요하거나 장차 필요할 것으로 예상되면, 새로 만든 DLL을 설치하지 말아야 한다.

다음의 두 디렉토리에 새로 만든 sfcfiles.dll을 복사해 넣는다.

c:\windows\system32\dllcache
c:\windows\system32

복사후에 윈도우즈의 경고화면이 나타나는 경우도 있다. 그때 마음이 바뀌면 경고화면에서 제시하는대로 설치 CD를 넣고 원래대로 복구하는 수도 있다.

마지막으로

여기서 제시된 새로운 방법은 따지고 보면 콜럼버스의 달걀과 같다. C를 배운지 얼마 안되는 초보라도 위의 코드를 짜는 것은 쉽게 할 수 있다. 다만 필요한 정보가 마이크로소프트 안에 깊이 숨겨져 있는 상황에서 어떻게 시작해야할지를 알기 어려울 뿐이다.

참고/참조

(1) http://www.vorck.com/data/sfcfiles.zip

(2) http://www.bitsum.com/aboutwfp.asp

다운로드

Posted by movsd
,