본문 바로가기
Security

Xtrap 제거

by Hide­ 2007. 12. 26.
반응형

Xtrap는 온라인 게임에서 메모리 보호(디펜더)로 사용되는 보안 솔루션입니다. Xtrap는 게임 시작 부분에서 가장 먼저 로딩되는 보안 모듈이며, 치트엔진, 디버깅 툴, 및 기타 메모리 조작 프로그램이 로딩되는 것을 차단합니다. 특히, 디버깅툴이 실행되어 있으면 바로 블루스크린되면서 컴퓨터 리뷰팅 됩니다. 정말 무식한 방법입니다.


그러므로, 게임해킹 시 선행되어야 하는 것이 Xtrap과 같은 메모리 디펜더를 제거하는 것입니다. 제거 방식은 Xtrap를 사용하는 온라인 게임에서는 거의 비슷하나 약간이 다른 점이 있습니다. 대표적인 차이점은 Xtrap 로딩되었는지 주기적으로 체크하는 게임 루틴에 있습니다.


이만 각설하고, Xtrap를 사용하는 국내 온라인 게임 중에서 ABC(임의로 명칭을 지정함) 게임을 분석하여 Xtrap를 제거해 보도록 하겠습니다. 게임 실행 파일을 ABC.exe로 변경하여 분석하도록 하겠습니다.


1. 다음 그림은 ABC.exe 게임을 OllyDBG로  디버깅한 것입니다. ABC.exe 게임 실행 진입점 상태에서 F8(steop over)/F7(step into) 기능 키를 사용하여 프로그램을 실행해 갑니다.

사용자 삽입 이미지

 



 2. ABC.exe 게임은 Xtrap 보안 모듈이 로딩 되기 전에 적합하게 실행되었는지 확인하는 루틴이 있습니다. 사이트 홈페이지

 에 로그인한 후 실행하였는지 확인하는 것입니다.


다음 그림은 ABC.exe 게임이 정상적인 루틴대로 실행되었는지 체크하는 확인하는 코드를 보여주는 것으로, 디버깅을 위해 비정상적으로 실행된 것이기 때문에 해당 루틴을 우회할 수 있도록 처리합니다.


사용자 삽입 이미지

 



3. F8 기능키로 라인별 게임 프로그램을 실행시키다 보면 다음과 같은 코드를 만나게 됩니다. 다음 그림에 있는 코드는 Xtrap 보안 모듈을 로딩하는 함수앞에 브레이크포인트를 설정한 것입니다. 아래 단계까지 찾아 오기 위해서 수 없이 블루스크린을 만나게 될 것입니다.


여기까지가 전체 과정의 1/3에 해당됩니다. 이제 F7(step into)로 내부 함수로 진입해서 검토해 봅시다.


사용자 삽입 이미지

 




 4. Xtrap 보안 모듈인 XtrapVa.dll를 로딩하는 단계까지 왔습니다. 아래 어셈브리 코드는 패치가 된것으로 원래 코드는 박스안에 있는 어셈코드입니다. 코드 아래를 쭈~욱 보면 LoadLibraryA API가 XtrapVal.dll 라이브러리를 로딩할 것이라는 것을 알 수 있습니다.


일차적으로 XtrapVa.dll 라이브러리가 로딩되지 않도록 처리하면 됩니다. 즉, OPCODE 74 13를 9090으로 바꿔주는 것입니다. 그렇게 되면 보안 모듈을 로딩하지 않고 바로 리턴하게 됩니다.


사용자 삽입 이미지






























 

5. 이제 끝났을 까요. 아닙니다. 대부분의 온라인 게임은 Xtrap 보안 모듈이 정상적으로 로딩되었는지 체크합니다. 그 체크하는 루틴을 제거하게 되면 끝나게 되는 것이지요. 먼저 ABC.exe 게임은 Xtrap 로딩이 정상적으로 되었는지와 로딩된 것이 XtrapVa.dll이 변조된 파일이 아닌지 확인하는 루틴으로 체크를 합니다.


앞서 XtraVa.dll이 로딩되지 않도록 처리했기 때문에 위 체크 루틴에서 비정상 실행임을 확인하고 게임프로그램이 종료되도록 되어 있습니다. 그렇다면 이 부분도 조작하게 되겠네요. 게임프로그램 원래 코드인 74 73 옵코드를 EB 73으로 변경합니다. 아래 그림에서 확인할 수 있듯이 점프하여 프로그램이 계속실행되게 됩니다.


사용자 삽입 이미지

 




6. 여기까지 왔으면 2/3는 왔습니다. ABC.exe 실행 파일을 패치된 파일로 교체하고 웹 사이트 로그인 후 게임을 시작하면 정상적으로 실행되는 것을 확인할 수 있습니다. 또한 Xtrap이 제거된 것도 확인됩니다. 하지만 아직 덜 끝났습니다. ABC.exe 게임은 실행 중에 2분간격으로 Xtrap이 로딩되어 있는지 확인합니다. 이 부분 마저 제거를 해야 합니다.


아래 WaitForSingObject의 타임 인자 값을 120000ms(120초)에서 INFINITE로 변경하여 줍니다. WaitForSingleObject API는 다른 쓰레드 또는 콜백 함수에서 이벤트가 오기를 기다리는 것으로 인자 값으로 받은 시간 동안 대기하고 있다가 그 시간 안에 오거나 또는 그 시간이 만료되면 다음 루틴을 수행하는 것입니다. 현재 ABC.exe에서 WaitForSingleObject API 용도는 이벤트를 대기하는 용도보다는 sleep 또는 select  API  처럼 지정된 시간이 만료되면 다음 루틴을 처리하는 용도로 사용되는 것으로 보입니다.


이러한 점을 고려하여, 인자 값을 INFINITE로 하면 Xtrap 보안 모듈이 로딩되어 있는지 체크하는 루틴을 우회할 수 있게 됩니다.


사용자 삽입 이미지




















 

끝났네요.. 휴, 힘듭니다. 이제 각종 치트엔진 또는 메모리 조작 툴을 이용하여 데이터를 조작하면 됩니다.


대응 방안

- 게임 실행 파일에 대한 패킹이 우선시 되어야 합니다. 이미 언패킹 방법이 알려진 패킹 방식이 무의미 하겠죠.

- Xtrap 보안 모들이 로딩되었는지 게임 서버와 통신하여 체크하는 것입니다. 단, 게임 서버와 Xtrap 보안 모듈간의 데이터 통신으로 체크해야 합니다.

'Security' 카테고리의 다른 글

네이버XSS  (0) 2008.09.02
IPTIME 무선공유기 해킹  (0) 2008.02.12
yoda's cryptor 언팩  (0) 2007.12.07
바람의나라 템복사  (5) 2007.12.01
HDSI 사용법  (0) 2007.10.22