최근 수정 시각 : 2024-02-18 22:19:43

Windows 파일 보호



1. 개요2. 작동 원리3. 무력화 방법4. Windows Vista 이후

1. 개요

Windows File Protection

Microsoft Windows의 보안 기능 중 하나로 제3자 프로그램이 시스템 파일을 수정하지 못하도록 방지하는 기능이다. 약칭은 WFP이다. Windows NT에서 탑재되었다.

마이크로소프트 문서에 따르면 WFP는 아래와 같은 경우를 제외하고는 작동한다.
  • 서비스팩 설치
  • 핫픽스 설치
  • 운영체제 업그레이드
  • Windows Update

2. 작동 원리

관련 파일은 sfc.dll, sfc_os.dll, sfcfiles.dll이며 윈도우 시스템 프로세스 중 하나인 winlogon.exe가 실행될 때 이 파일들을 로드하여 WFP를 실행한다.

WFP는 Windows API의 ReadDirectoryChangesW를 이용하여 시스템 파일의 변경 여부를 감시한다. 만일 시스템 파일 변경이 감지된다면 따로 저장된 캐시 폴더에서 원본 파일을 가져와서 그걸로 복원시킨다.

캐시 폴더는 시스템 폴더에 있는 dllcache라는 폴더를 말하며 백업된 시스템 파일들이 들어 있다. 만약 복원하려는 시스템 파일의 원본이 dllcache에 존재하지 않으면 Windows 설치 CD-ROM이나 시스템 파일이 백업되어 있는 네트워크 드라이브에서 가져오고 네트워크 드라이브에서도 가져 올 수가 없거나 Windows 설치 CD가 없으면 설치 CD를 넣으라는 메시지를 띄운다.

3. 무력화 방법

WFP는 시스템 파일이 외부로부터 변조되는 것을 막기 위해 있는 생겨난 기능이지만 커널 모드가 아닌 사용자 모드에서 동작하는 것이다보니 크래커들은 악성코드를 작성하는 과정에서 WFP를 무력화시키는 방법을 사용하기 시작했다.

기본적인 무력화 방법은 winlogon.exe의 핸들 객체들을 확인하여 그 중 Directory change notification handle를 종료시키는 것으로 간단하게 무력화시킬 수 있고 시스템 파일을 복원할 때 dllcache 폴더에서 가져온다는 점을 이용해 dllcache 폴더에 있는 대상 시스템 파일을 변조된 것으로 덮어씌우거나 아예 dllcache 폴더 자체를 비워버려서 복원할 수 없도록 만든다. 물론 Windows 설치 CD를 넣으면 되겠지만 기본 설치된 PC를 구매한 사용자에게 그게 있을리가...[1]

그 외에는 sfc_os.dll API를 이용해 특정 시스템 파일의 보호를 1분 동안 무력화시키거나 sfcfiles.dll의 보호 대상 시스템 파일 목록을 수정하여 특정 또는 전체 시스템 파일의 보호를 영구적으로 무력화시키기도 한다.

레지스트리 수정 후 재기동하여 비활성화할 수도 있다.

4. Windows Vista 이후

Windows Vista부터 권한 개념이 확립화가 됨에 따라 WFP도 더이상 필요가 없어졌다. 특정 사용자만 수정할 수 있도록 권한을 변경하면 다른 사용자 권한으로 실행되는 프로세스가 절대로 건들 수 없기 때문이다. WFP 관련 파일은 남아있지만(다만 sfcfiles.dll는 없음) 더이상 사용되지 않으며 dllcache 폴더도 없다.

대부분의 시스템 파일들은 소유자가 TrustedInstaller 계정으로 설정되어 있고 그 계정에게만 모든 권한을 부여하기 때문에 마이크로소프트에서 만든 프로그램[2]이 아니면 어떠한 프로그램도 해당 파일을 수정할 수 없다. 물론 소유자를 변경하는 방법으로 수정이 가능하도록 해금할 수 있지만 한번 소유자를 바꾸면 다른 프로그램의 수정도 먹히기 때문에 웬만해서는 권장되지 않는다.

WFP는 없어졌지만 대신 System File Checker (SFC)라는 이름으로 시스템 파일 검사 명령어로 대체되었다. 명령어는 sfc. 시스템 파일들을 검사하여 그 중에서 문제가 있는 것이 확인되면 수정한다.[3] 물론 시스템 파일을 변경하는 것일 만큼 관리자 권한이 필요하고 시간이 오래걸린다.[4] 이 명령어는 Windows REWindows PE에도 있으므로 부팅 불능에 빠졌을 때 사용할 수 있다.[5] 시스템 파일을 검사하려면 관리자 권한으로 명령 프롬프트를 실행한 후 sfc /scannow 명령어를 실행하면 된다. 참고로 이 도구는 비스타 부터 추가된 건 아니고 윈도우 98부터 있어왔다. XP(2003/R2) 까지는 GUI가 있었지만 비스타(2008) 부터는 명령 프롬프트 창을 통해서만 실행된다.
[1] 일부 PC 제조업체들 중에서는 고객이 구매하는 과정에서 별다른 요청을 하지 않더라도 설치 CD를 기본적으로 제공해주기는 한다. 물론, 대기업 완제품 PC라면 동네 근처 서비스센터에 맡기는 방법도 있겠지만, 지원 종료된지 오래된 윈도우 같으면 센터안에 설치 미디어가 없을 확률이 높은지라 센터기사가 그자리에서 바로 돌려보지 못해서 고객이 윈도우 설치를 할줄 모른다고 하면 시일이 조금 걸릴 것이라고 알려 줄 것이고, 윈도우 설치 자체는 할줄 안다고 한다면 WFP를 돌려본다고 해서 문제가 완전히 해결 될 것이라는 보장이 없으니 그냥 원래 설치되어 있는 윈도우의 설치 미디어를 만들어서 재설치를 하는편이 가장 좋다고 알려준다.[2] 정확히는 마이크로소프트 디지털 서명이 되어 있는 프로그램[3] 다만 100% 성공하지 못할 수 있다.[4] 9x 계열의 98 부터 Me 까지는 9x 커널 특성상 일반사용자 계정이 곧 관리자 계정이나 다름없어서 상관없지만, NT 계열의 XP(2003/R2) 까지는 관리자 계정으로 로그온을 해야 제대로 실행된다.[5] 2000과 XP(2003/R2)는 예외적으로 안전모드나 복구콘솔에서는 이 명령어를 실행 할 수가 없다. 특히, 안전모드에서는 cmd 창을 열어서 sfc 명령어에 /scannow 스위치를 넣어서 실행하고자 하면 'Windows 파일 보호에서 보호되는 시스템 파일의 스캔을 시작하지 못했습니다. 특정 오류 코드는 0x000006ba (RPC 서버를 사용할 수 없습니다.) 입니다.' 라고 떠버린다. 그 대신, 복구콘솔을 실행하기에 앞서 문제를 일으킨 시스템 파일들을 미리 파악하고 있다면 그 파일들만 복구콘솔을 통해서 일일이 복사하는 방법으로 해결 할 수는 있겠지만, 그렇게 복사해도 해결이 안된다면 재설치 하는 것 말고는 답이 없다.