본문 바로가기

My Study/Programming&Theory

WFP 무력화 - Close File Object

이번 글에선 WFP 무력화에 대해서 알아보겠습니다. XP 까지밖에 사용할 수 없는 기술이지만 그냥 정리만 하는 마음으로 쓰겠습니다. 이걸 무력화 하는 이유는 사용하는 사람마다 다르겠지만 악성코드 제작자 입장에서는 시스템 파일을 수정하기 위해 해당 보호 기술 무력화를 위해 사용하겠지요.  그리고 백신 입장에서도 시스템 파일에 대한 패치를 해야하는 경우? 도 있을 것 같은데 이런 경우 백신에서도 이 보호막을 무력화 시킬 필요가 있을 것 같네요.


아무튼.... 사용하기 나름이니 


WFP 무력화는 다른 블로그에 엄청나게 많이 올라와 있습니다.

자세한 정보는 구글링을 통해 찾아보세요 ㅠㅠ

http://sinun.tistory.com/144

http://blog.naver.com/koheung?Redirect=Log&logNo=120040493038


인터넷에는 크게 5가지의 WFP 무력화 방법이 나와있더군요.

그 중에 몇몇 다른 방법들은 Code Injection을 사용해서 구현을 해야하기 때문에 별로 구현하기가 싫었습니다.

개인적으로 Code Injection을 별로 좋아하지 않습니다. ㅎㅎ 그래서 전 Handle을 종료해 WFP를 무력화 하는 부분만 알아보겠습니다. 이 부분은 코드도 안나와 있길래 구현까지 해보았습니다.


Handle 강제 종료

Winlogon 프로세스는 보호대상이 존재하는 폴더에 대해서 이벤트를 생성합니다. ( Directory Change Notification Event )

그러고 이 때 해당 폴더에 있는 파일이 변경 혹은 삭제 된 경우 이벤트가 signal 상태가 되도록 기다리고 있는 WatiForMultipleObjects 함수가 반환이 되면서 cache 폴더에 있는 파일이 복사가 이루어지겠네요.


그러면 공격 프로세스에서는 Winlogon의 Directory Change Notification Event 의 real 핸들을 가져온 후 종료 시켜주면.. 더이상 해당 이벤트를 기다리고 있는 WatiForMultipleObjects 함수는 반환을 못하게 되면서 WFP가 무력화 되겠군요.

그런데 코드 짜려고 봤더니.. ;;  Directory Change Notification Event 를..못찾겠네요. 아무튼 그러면 다른 방법을 사용하면

어짜피 system32 폴더를 모니터링 하고 있으므로 system32 폴더에 대한 핸들도 가지고 있을 것입니다.

Winlogon 프로세스가 가지고 있는 system32 폴더 핸들을 제거하는 방식으로 코드는 짜보겠습니다.



저 두 파일 핸들을 제거해주면 되는데..


어떻게 코드를 짜야할지 몰라 쫌 복잡하게 생각을 해봐서 짰습니다.

코드는 Windows 구조와 원리 책에 있는 Handle 관련 부분 코드를 참조해 짰습니다.

1. NtQuerySystemInformation 함수를 사용해 시스템 전체 핸들을 가져온다.

2. 핸들 처음부터 쭉 돌면서 해당 핸들을 가지고 있는 pid가 winlogon 프로세스 pid와 같은 경우만 처리

3. DuplicateHandle 함수를 사용해 해당 핸들의 real 핸들을 내 프로세스로 가져옴 ( DUPLICATE_SAME_ACCESS )

4. NtQueryObject 함수를 사용해 해당 오브젝트의 기본 정보를 얻음 ( ObjectBasicInformation )

5. 얻은 정보를 가지고 오브젝트 Type정보를 얻음 ( ObjectTypeInformation )

6. 해당 타입이 "File" 인 경우만 체크

7. 해당 오브젝트의 이름을 얻음 ( ObjectNameInformation )

8. 얻음 이름이 "\Device\HarddiskVolume1\WINDOWS\system32" 와 같은지 체크

9. 같으면 기존의 DuplicateHandle에 의해 얻은 Handle을 닫고 DUPLICATE_CLOSE_SOURCE 로 다시 열음

   ( winlogon 프로세스에서는 해당 핸들 사라짐 )

10. CloseHandle로 얻어온 핸들을 닫아줌


음........... 잘 돌아는갑니다. ㅎㅎ

아래는 영상입니다.


그 다음은 주요 함수입니다.


뭐 WFP가 Windows XP에서 밖에 안되므로.. 별 의미가 없다고 생각합니다.

WRP 무력화 코드로 다음 포스팅땐 짜보겠습니다.

'My Study > Programming&Theory' 카테고리의 다른 글

가변인자 OutputDebugString  (0) 2012.10.03
WRP 무력화  (5) 2012.07.31
Windows File Protection & Windows Resource Protection  (0) 2012.07.26
Bluepill Sample Code Test  (4) 2012.07.17
Intel VT-x 와 BSOD.. ㅠㅠ  (0) 2012.07.16