엑스키퍼는 현존하는 최강 음란물 차단 프로그램이다.

어떻게 아냐고? 내가 작년에 엑스키퍼를 모델로 비슷한 프로그램을 개발한 적이 있는데, 그때 엑스키퍼를 분석해 봤기 때문에 안다.

국내에 음란물 차단 프로그램이 십수개에 달하지만, 대부분 dll 파일을 이용한 후킹을 사용하기 때문에 프로그램에 제한이 많은 경우가 많은데 (예를 들어서 커맨드 라인창을 열면 강제로 닫아버리거나 하는 프로그램들이 꽤 된다. 왜냐면 커맨드 라인창을 통한 프로그램 파괴를
막지 못하기 때문이다.)

하지만 엑스키퍼는 드라이버 레벨에서 음란물을 차단하기 때문에 거의 완벽하게 프로그램의
자기 방어와 음란물 차단을 효과적으로 수행을 하게 된다. 이 차이는 기술력의 차이라고 볼 수 있다.

어찌되었건 이번에 지란지교소프트에서 엑스키퍼를 가지고 이벤트를 한다하여서 간만에
프로그램에 대한 소개 및 분석을 수행해 보도록 하자. ( http://www.xkeeper.com/news/event_view.php?Board=6

이 문서는 

- 2010년 8월 12일 오전 12시 20분 부터 작성을 시작

- 2010년 8월 24일 오후 8시 1차 작성 완료

- 2011년 1월 28일 코멘트 추가

================================

프로그램 설치과정 살펴보기

일단 엑스키퍼 홈페이지 www.xkeeper.com 에서 "무료체험" 버튼을 누르고 프로그램을
다운로드 받자. 다운로드 받은 프로그램을 실행하면 다음과 같은 창이 뜬다. 요즘
쓸데 없이 ActiveX 를통해서 프로그램을 설치하는 경우가 많은데(엑스키퍼 구버전도
그랬다.) 이렇게 간단하게 런처 프로그램을 실행시켜서 설치하는게 맘에 든다.


개인정보를 입력하고 설치하기버튼을 누른다. 어라 그런데 설치할 수 없다고 나온다.
예전에 테스트 한다고 이미 설치해봐서 안되나 보다.



어쩔 수 없이 VirtualBox 에 설치를 하면서 어떻게 동일 PC를 체크하나 확인을 해봤다.
(왜냐면 그사이에 이미 OS 를 재설치 했었거든.) 역시나 MAC 어드레스를 가지고 동일
PC 여부를 체크하도록 되어 있다. 얼마전 네이트온에서 맥어드레스 수집한다고
난리치고 그랬었는데, 그러지 말자. 프로그래머 입장에서는 동일 PC 체크하기 제일
쉬운 방법이고, 이거 수집한다고 사용자 개인정보가 유출되거나 하는 문제도 없다.


그다음 패킷은 서버에서 "진짜" 설치파일을 다운로드 받는 과정이다. 그림에서 보듯이
설치파일 다운로드 주소는

http://update.jiran.xkeeper.com/xk3download/installfiles_premium/10072700/jiran_xk3setup.exe

이다.


이 설치 파일을 웹브라우저로 다운로드 받아서 실행해 보았다. 그랬더니 설치할 수 없다고 나온다.


런처에서 입력한 정보를 전달하기 위해서 그런것이니 당연한 결과이다. 그래서 다시
VirtualBox 로 돌아와서 설치를 진행하니까 리부팅이 되고 설치가 완료되었다.
다음은 설치 완료후 부모모드 관리창으로 들어간 화면이다.


솔직히 구버전의 xkeeper 가 훨씬 좋았다고 생각한다. 구버전은 좀더 UI 가 크고
직관적이었던 반면, 최근에 나온 엑스키퍼3는 화면이 너무 작고 UI 가 복잡하다.

나름 개발자,기획자는 사용을 더 편리하게 하려고 노력을 했겠지만 지금 UI 는 좀
아닌듯 하다.

 

기본적인 프로그램 기능 살펴보기

* 시간 관리 기능


시간 관리를 클릭하면 나오는 화면이다. 평일과 주말을 나눠서 시간관리가 가능
하다. 내가 비슷한 프로그램을 만들때 쓸데없이 [월화수목금토일x24시간]을 다 나눠서 관리를 원해서 UI 만드느라 졸라 고생했었는데.. 그냥 이렇게 주중/주말 정도만 설정을 할 수 있는게 적당한 듯하다. 너무 상세하게 설정해 봤자 ... 어차피 겜방가서 사용하면 그만이고
아이에게 교육을 통해서 컴퓨터 사용 시간을 제어할 수 있도록 해야지 너무 시스템에만 의존하는것은 좋지 않다.

* 프로그램 차단 기능


특정 프로그램을 아이가 사용하지 못하게 하는 기능이다. 아예 프로그램을 안깔면 될텐데 깔아놓고 아이가 못쓰게 등록하는 경우는 어떤 경우인지는 잘 모르겠지만.... 뭐 부모만 쓰고 싶은 프로그램이 있을수 있으니까 이런 기능도 들어있다.

등록된 프로그램을 실행시키면 다음 그림처럼 차단된 프로그램이라고 표시가 된다.


하지만 프로그램의 파일명을 바꾸거나 경로명을 바꾸면 차단하지 못하는 경우가
확인되었다. 프로그램 종류에 따라서 결과가 다른듯한데 그 이유는 잘 모르겠다

아마도 [실행파일의 경로 + 실행파일의 등록정보(리소스의 버전 정보)] 조합으로 실행파일을 차단하는 듯 한데, 실행파일의 등록정보가 없는 파일은 경로를 바꾸면 차단하지 못하는
듯 하다.

메모장과 같이 실행파일의 등록정보가 제대로 들어가 있는 실행파일은 경로를 바꾸어도 잘 차단하였다.
프로그램의 등록정보로 차단하는 이유는 실행파일이 바이러스에 걸렸거나, 버전이 업데이트 되었을 때에도 효과적으로 차단하기 위한 이유 때문이기는 한데... 그래도 이런 문제를 해결하기 위해서는 실행파일의 등록정보 뿐만 아니라 체크섬 (CRC, MD5) 을 같이 저장하는것도 좋은 방법이 아닐까 생각한다.


* 유해사이트 차단 기능


유해사이트 차단은 별다른 설정이 없이 단순히 on/off 만 가능하다.

자 그럼 유해사이트는 어떤 원리로 차단되는지 살펴보자.
별로 야하지는 않지만 야할것 같은 www.sex.com 에 접속을 해보면서 패킷을 캡처해 보자.


패킷을 캡처해 보면 그림과 같이 브라우저는 www.sex.com 에 접속후 GET / 명령을
보내고, 서버는 301 Moved Permanently 를 보낸다.

이 상태 대로라면 브라우저는 포워딩된 서버에 접속해서 사이트 내용을
보여주어야 하지만, 실제로는 아래 그림과 같이 차단된 사이트가 표시된다.


어떻게 이런게 가능한 것일까? ProcessXP 로 프로세스를 살펴보면 아래
그림과 같이 dll 후킹이 되어 있음을 확인할 수 있다. 이 DLL은 윈속의
send() recv() 를 후킹하는것으로 보인다. 실제 확인은 해보지 않았지만
이런 방식으로 사이트를 차단하는게 가능하다는것을 나도 직접 구현해
봐서 알고 있다. 패킷 캡처 프로그램에서는 패킷 변조를 확인할 수 없지만
프로그램 내부에서는 30X 로 포워딩된 주소를 보내서 사이트 차단을
구현을 할 수가 있는것이다.


실제로 이 방법을 통해서 사이트를 차단하면 꽤 효과적으로 유해사이트
차단이 가능함을 알 수 있다. 그렇다면... 이 방법에 결점은 없는것일까?

브라우저로 다음 주소를 접속해 보자

http://twitter.com/soranet


트위터에 접속하는것임에도 불구하고 대부분의 국내 사용자는 그림과 같은
차단사이트가 뜰것이다. (물론 다른 트위터는 정상적으로 접근할 수 있다 )
이렇게 차단이 가능한 이유는 컴퓨터 내부가 아닌 외부에 위치한 ISP 서버에서 http 프로토콜을 분석해서 사이트를 차단하기 때문이다.

이번에는 다음 주소로 접속을 해보자.

https://twitter.com/soranet



이제 원래 사이트 내용이 정상적으로 뜬다. 이 둘에는 어떤 차이가 있는
것일까? http 는 암호화 되지 않은 문자열을 주고 받기 때문에
중간에서 가로채서 차단을 하는것이 용이하다. 반면 https 는 암호화가
되기 때문에 중간에 가로채서 그 내용을 열어보고 차단을 하는것이
불가능 하다...... 따라서 ISP 도 못막고, 후킹을 통한 http 패킷 필터링도
불가능하다.

즉 xkeeper 와 같은 소켓 send() recv() 후킹 방식으로는 https 를 통한 사이트 접근을 차단할 수 없다는 것이다.


또 한가지를 추가하자면 엑스키퍼는 사이트 단위로만 차단이 가능하다. 위에 트위터를 언급했었는데, 사실 엑스키퍼는 http://twitter.com/soranet 를 차단할 수 없다. 즉, 메인 주소는 성인 사이트가 아닌데, 서브 주소가 성인 사이트일 경우 사이트를 통채로 차단하던가 아니면 차단하지 못하던가 둘중 하나이다.

디씨인사이드는 수많은 게시판이 있고, 일부 게시판은 성인용으로 구분되어 있는데 엑스키퍼는 이러한 이유로 http://gall.dcinside.com/list.php?id=nude 와 같은 사이트를 차단하지 못한다.

뭐 그렇다고는 해도.. 역시나 엑스키퍼가 국내에서 제일 사이트를 잘 차단하는 서비스임은 분명하다.


* 자기 보호 기능

유해 차단 프로그램은 자기 보호 기능이 필수조건이다. 자녀가 프로그램을 간단히 죽여버릴 수 있다면 프로그램의 존재 의미가 없어지기 때문이다.

- 프로세스 보호기능

일단 작업관리자로 프로세스를 종료시켜 보도록 하자.


역시 종료를 시킬수가 없다. 어떻게 이런일이 가능할까? 이 기능은 두가지 방법으로 구현이 가능하다. DLL 후킹과, 커널레벨 후킹.

여러가지 테스트 결과 엑스키퍼는 ZwOpenProcess 나 ZwTerminateProcess 를 후킹하는듯 하다.


- 폴더/파일 접근 보호 기능

어찌되었건 이번에는 ProcessXP로 실행파일 존재하는 위치를 찾아보도록
하자.

엑스키퍼는 Program Files 가 아닌 C:\WINDOWS\Downloaded Program Files\ 에
파일을 설치한다. 그 이유는 이 폴더는 특수폴더라서 윈도우 탐색기로
접근할 경우 해당 폴더를 제대로 탐색하는것이 불가능하기 때문이다.



어쨌거나 이런저런 방법을 써서 해당 폴더에 들어가 보자. 다음은 해당 폴더의 파일 목록이다.


물론 이 파일들을 삭제하려고 하면 삭제가 안된다. 파일 삭제를
막는것도 기본적인 자기 보호 기능이기 때문이다.

- 레지스트리 보호 기능

시스템 부팅시 프로그램을 자동으로 실행시키고, 드라이버를 로드하는 행동은 전부 레지스트리에 등록된 정보를 통해서 수행이 된다. 따라서 사용자가 레지스트리를 삭제할 수 없도록 레지스트리 보호기능을 갖추고 있다. 아래 그림은 삭제시도가 실패하는 장면


- 안전모드
안전모드로 부팅을 하게 되면 system32\drivers 폴더에 있는 드라이버 이외의 다른 드라이버는 아무리 레지스트리에 등록을 해도 로딩이 안된다. 따라서 엑스키퍼는 system32\drivers 에 드라이버 파일을 위치시키고 안전모드로 부팅을 해도 자기보호 기능을 정상적으로 작동시킨다. 


엑스키퍼 파일 살펴보기

엑스키퍼 설치폴더에 있는 파일을 하나씩 살펴보도록 하자. 아래 파일 목록의 파일 크기는 파일을 분석하는 시점에서의 파일 크기이기 때문에 시간이 지나면 더 커졌을 꺼다.

- jsspdf.lst (12799958 바이트)

이 파일은 유해사이트 목록으로 보인다. 그림을 보면 각 데이타가 17바이트
크기를 가지고 있고, 항상 각 데이타의 끝은 0x0c 혹은 0x0d 로 끝남을
확인할 수 있다. 16바이트는 차단할 사이트 주소의 md5 해시로 보이고, 0x0d
혹은 0x0c 는 사이트의 접근 가능 나이로 보인다. (구버전은 나이별로 사이트를 차단하는것이 가능했다.)

어찌 되었것 파일 크기를 17로 나누면 12799958/17=752939 대략 75만개의
유해사이트를 차단할 수 있는것으로 보인다.

(유해 사이트 목록은 방통위에서 판매를 하는것으로 알고 있다. 아마도 방통위 유해 사이트 목록 + 엑스키퍼 자체 제작 목록을 합친듯 하다.)

- jsxpdf.lst  (12842212 bytes)


이 파일은 유해 동영상 목록으로 보인다. 유해사이트 목록과 다르게 데이타가
정렬이 되어 있지 않다. 아마도, 유해데이타 목록을 경쟁사가 빼가는것을
방지하기 위해서 내부적으로 암호화가 된것으로 보인다. 어찌되었건
이 파일도 MD5 Hash 라고 가정을 하고 파일 크기를 16으로 나누면

12842212/16=802638

대략 80만개의 동영상을 차단할 수 있다. 이는 엄청난 숫자이며 국내 최대의 유해 동영상 db 라고 할 수 있다. 이 숫자는 수년간의 db 축적의 결과이며 지란지교의 큰 자산일 것이다. 경쟁사가 하루이틀에 쫓아갈 수 없는 db 인 것이다...


- svcxkcore.exe

서비스 실행파일이다. 컴퓨터를 켜자마자 로그인 하지 않아도 엑스키퍼가 자동으로 실행될 수 있는것은 서비스 형태로 실행되기 때문이다. ProcessXP 로 보면 이 프로세스가 다른 프로세스를 실행시키는것을 확인할 수 있다. 


- hookxkpro.dll

유저레벨에서 후킹하기 위한 dll 파일이다. 커널레벨 후킹만으로는 모든 처리를 하기 쉽지 않기 때문에 유저레벨에서도 후킹을 해야만 한다.  이 dll 파일로 소켓후킹등을 처리하고 있을것이다.



엑스키퍼의 문제점 - 64비트 OS 미지원


현재 엑스키퍼는 64비트 OS를 지원하지 않는다. 아직까지 일반 가정용 PC는 대부분 32비트이기 때문에 시장 점유율에서는 별반 문제가 없는듯 하지만, 64비트 OS의 점유율은 점점 높아지고 있다. 더군다나, 조리PC 가 아닌 대기업 PC에서 가정용 PC 의 OS 로 64비트 OS를 사용하기 시작하면 고객센터의 대응은 무지 힘들어질 것이다. 물론 지란지교 소프트는 이 문제를 잘 알고 있겠지만 꽤 오래된 이슈임에도 불구하고 아직까지 해결을 못하고 있는걸 보면 확실히 힘든 문제인 모양이다.

사실 64비트 OS지원이 힘든 이유는 꽤나 복잡하다. 일단 디바이스 드라이버를 64비트 용으로 개발을 해야 한다. 64비트 OS용 드라이버 개발은 여러가지 이유로 32비트 보다 개발이 어렵다. 하지만 이뿐만이 문제가 아니다. 

엑스키퍼는 디바이스 드라이버 뿐만 아니라 유저레벨에서 애플리케이션 후킹을 하고 있다. (소켓후킹등) 문제는 대부분의 브라우저는 32비트용만 사용되기 때문에 애플리케이션 후킹을 64비트 뿐만 아니라 32비트도 동시에 처리해야 한다는 것이다.

즉, 32비트용 프로그램과 달리 64비트용 OS 에서 프로그램의 작동은 

 [64비트 드라이버] [64비트 후킹 DLL] [64비트 EXE - 메인 프로그램]

에 더해서 

 [32비트 DLL을 제어하면서 64비트 EXE 와 통신하는 32비트 EXE] [32비트 DLL] 

를 추가로 개발해야 한다.

개발 난이도가 장난이 아니다 ㅠ.ㅠ 

어찌되었건 지란지교소프트는 열심히 64비트용도 만들고 있을꺼다. (난 포기했었다 ㅋㅋ)



엑스키퍼 약점

자 이제부터 재미있는 내용이 시작된다. 엑스키퍼의 약점을 뒤집어 자식의 입장에서 엑스키퍼의 파해법을 살펴보자. 


* 부모가 엑스키퍼를 못깔게 64비트 os 를 설치해 버린다.

위에서 언급한 것처럼 엑스키퍼는 64비트 os 를 지원하지 않는다. 부모가 엑스키퍼를 깔기 전에 자신의 시스템을 64비트 os 로 바꿔버리자. 엑스키퍼를 깔려고 해도 에러메시지만 만나게 될것이다.


* 파티션을 여러개 만들어서 os를 여러개 설치하자.

엑스키퍼는 당연히 자신이 설치된 os 에서만 작동된다. 엑스키퍼는 아직 하드디크스에 여러 os 가 설치된것을 인식하지 못하는듯 하니 미리 os 를 여러개 깔아놓고 부모가 엑스키퍼를 설치하면 다른 os 로 부팅해서 사용하자.


* 파티션이 하나라면 wubi 를 설치하자.

우비는 별도의 파티션을 나누지 않고도 리눅스를 사용할 수 있도록 해주는 우분투스톨러다. --> http://wubi-installer.org/

우비를 설치하고 우분투로 부팅을 하면 비록 게임은 할 수 없지만, 웹은 자유롭게 쓸 수 있다. 이번 기회에 리눅스도 공부하자.


* 프로그래밍을 공부해서 엑스키퍼를 폭파시킨다.

엑스키퍼는 드라이버 레벨에서 프로세스를 죽이는것을 막지 못한다. 아래 그림을 보자. 이 그림은 내가 직접 만든 프로그램이다. ProcessXP 로 프로세스 아이디를 확인후 프로세스 ID 를 목록에 넣고 KillProcess 버튼을 누르면 엑스키퍼를 깔끔하게 죽일 수 있다.



내부적으로 작동은 드라이버 레벨에서 ZwOpenProcess() , ZwTerminateProcess() 를 호출하는게 전부이다. 이번기회에 프로그래밍 고수도 되고 엑스키퍼도 파해해 보자.


* 동영상 차단 회피하기 

이거는 사실 큰 의미가 없는 방법이기도 하고 해서 공개하지 않는다.

* 시간 제한 차단 회피하기

이것도 제대로 테스트 안해봤는데 잘 될꺼다. 이 방법도 공개하지 않는다.



엑스키퍼의 버그

- XKeeperFreeInstall.exe 를 실행시켰다가 취소해 보면 그림과 같이 나온다. 이는 manifest 에서 Windows7 호완성 관련 부분 처리를 안해줘서 발생하는 문제이다.



- 절전모드에서 시간 처리 문제

엑스키퍼는 사용자가 시간을 함부로 바꾸지 못하도록 막는 기능을 가지고 있다. 따라서 사용자가 컴퓨터 시간을 바꾸면 다시 원래대로 시간을 바꾸어 버린다. 문제는 엑스키퍼가 맞추는 시간이 외부의 시간이 아니라, 컴퓨터가 켜진후 흘러간 시간을 기준으로 계산을 한다는 거다.

즉, 

. 오후 1시에 컴퓨터가 켜진 상태 

. 컴퓨터를 절전 모드로 바꿈

. 1시간 경과

. 오후 2시에 컴퓨터를 절전모드에서 깨움

. 컴퓨터 시간이 오후 1시로 표시됨.

이 된다. 이거 예전에 테스트할때 상당히 짜증났던 부분인데 아직도 안고쳐졌다. 



=====================


* 2011/1/28 추가 코멘트

간만에 엑스키퍼를 살펴보니 이제 더이상 서비스에서 실행시키는 방식은 사용하지 않는다. 이제는 프로세스를 winlogon.exe 에 후킹 인지 플러그인인지 어찌되었건 winlogon.exe 에 들러붙은 dll 파일에서 실행을 시키고, 프로세스가 죽을경우 이 dll 이 모니터링을 하다가 다시 실행을 시키는 방식으로 실행시키기 때문에 위의 방법으로는 죽여도 다시 살아난다.

현재로서 엑스키퍼 프로세스를 무력화 시키기 위해서 생각해 볼수 있는 방법은 몇가지가 있기는 하지만 결코 쉬운 방법은 아닐듯하다. 이제 엑스키퍼 죽이려고  여기까지 찾아온 초딩들은 그만 포기하고 본인이 성인이 될때까지 기다리자.


Posted by 키플러
,