sábado, 18 de octubre de 2008

Anti Game Hacking의 원리 그리고 Codes

Anti Game Hacking의 원리 그리고 Codes





Sammuel Dual [Dual5651@hotmail.com]

Homepage : http://dualpage.muz.ro



This article assumes you're familiar with WinNT
Level of Difficulty 1 2 3
Download the code for this article:DualzAGH.zip


이번 글에서는 Anti Game Hacking에 대하여 다루어 봅니다.




1990년대 후반부터 부응하기 시작한 Online Game에

힘입어 Game Hacking도 부응하기 시작했습니다.

기존의 Single Game에서도 Game Hacking은 존재했지만,

그것은 단지 욕구 충족을 위한 수단이었던데 반해,

Online Game에서의 Game Hacking은 금전적으로

연관될 수 도 있게 되었습니다.

Online Game의 개발자 들은 자신의 게임이 Hacking 되는것을

원치 않았습니다. 그래서 그들은 Game Hacking을 방지 하기 위한

Code 제작에도 힘을 기울이기 시작 합니다.

그러나 Game의 개발자들은 Security,System류의 Programmer가 아닌,

DirectX,Open GL같은 그래픽 프로그래머들 이었기에

그들이 직접 작성한 Code로 Game Hacking을 막기에는 역부족 이었습니다.

(여기에는 기술적인 요소,금전적인 요소,시간적인 요소가 포함됩니다.)

이러한 이유로 Anti Game Hacking만을 전담하는 솔루션을

제작하는 업체들이 등장하였는데, 우리나라에는 다음과 같이 존재 한다.


INCA Internet - nProtect Gameguard Pro(국내 시장의 약 50% ~ 60%)

안철수바이러스 연구소 - Hack Shild Pro (국내 시장의 약 39% ~ 29%)

기타 프로그램 (국내 시장의 약 10%)



월등한 점유율을 가지고 있는 두 제품의 특징을 개발사의 홈페이지에서 찾았다.


---nProtect Gamueguard Pro---

(1)해킹툴, 시스템 바이러스 진단 및 차단 (실시간)


(2)실시간 게임핵 차단


(3)메모리 디버깅 방지


(4)실시간 스피드핵 차단


(5)실시간 오토마우스 차단


(6)실시간 각종 원격제어 및 매크로 차단


---Hack Shild Pro---

(1)해킹 툴 탐지 및 차단


(2)자동 업데이트


(3)메모리 해킹 방지


(4)스피드핵 방지


(5)디버깅 방지


(6)Message Hook 방지


(7)오토마우스 방지



두 제품의 기능이 아주 흡사함을 알수 있다.

기능들 중 이 글에서 다루고자 하는건

nProtect의 (2),(3)기능에 대한 것이며,

HackShild의 (3),(5)기능에 관한 것이다.


이 글에서 앞으로 다룰 내용은 다음과 같은

환경에서 테스트 되고 제작 되었다.

System : Microsoft Windows XP Home Edition Version 2002 SP2

CPU : Intel(R) Pentium4(R) processor 1.60Ghz

IDE : Microsoft Visual C++ 6.0 SP6

DDK : Microsoft Windows XP DDK 2600



앞으로 구현할 기능은 Native API를

Kernel Level에서 Hooking 함으로써 구현 된다.

Hooking할 Native API들과 이유는 아래와 같다.


(1)ZwOpenProcess()

Process의 Memory리에 접근 및 제어 하기 위해서는

ZwOpenProcess()를 이용하여 얻은 Access Handle이 필요하다.

우리는 이 Native API를 Hooking함으로써 Access Handle이

자신이 보호 하고자 하는 Process의 것이라면,

이 Handle을 Close 시켜 버림으로써 보호하고자 하는

Process의 Handle Open을 막을 수 있다.


(2)ZwWriteVirtualMemory()

Process의 가상 메모리 영역을 Write 하기 위해서는

이 Native API가 쓰인다. 우리는 이 Native API를

Hooking 함으로써 Write하고자 하는 대상이 우리가

보호 하고자 하는 Process일때는 Write를 수행하지

못하게 함으로써 보호 하고자 하는 Process의

메모리를 보호 할 수 있다.


(3)ZwReadVirtualMemory()

Process의 가상 메모리 영역을 Read 하기 위해서는

이 Native API가 쓰인다. 우리는 이 Native API를

Hooking 함으로써 Read하고자 하는 대상이 우리가

보호 하고자 하는 Process일때는 Read를 수행하지

못하게 함으로써 보호 하고자 하는 Process의

메모미를 보호 할 수 있다.


(4)ZwQuerySystemInformation()

Process의 목록을 구하고자 할때 이 Native API가

쓰일수 있는데, 우리는 이 Native API를 Hooking 함으로써

Process Scan시에 우리의 Process를 Process목록에서

없앰으로써 우리의 Process를 숨길 수 있다.


먼저 (1)의 Code는 다음과 같다.



이 글을 읽고 있는 분에게 생소할만한 Native API로써,

ObReferenceObjectByHandle()가 있다.

이 Native API는 다음과 같은 Prototype을 가진다.



이 Native API는 Handle로 부터 Object를 참조 하는 함수로써,

첫번쨰 인자는 참조 하고자 하는 Handle이며,

두번쨰 인자는 Access Mask이며,

세번쨰 인자는 ObjectType인데,

네번쨰 인자가 KERNEL MODE일때는 NULL을 줄 수 있다.

다섯번쨰 인자는 Access Mode로써,

User,Kernel,Maximum의 세가지 Mode를 가진다.

여섯번째 인자는 Object의 주소가 Out 된다.

일곱번째 인자는 HANDLE_INFORMATION이 Out 된다.

이 Native API외에는 주석만으로도 충분히 이해가 될 것이다.


(2)의 Code는 다음과 같다.



(1)에서의 Code와 거의 유사하고

(2)중요한 다른점은 return 값으로 STATUS_SUCCESS를 넘기는데,

실제론 Memory를 Write하지 않았지만 Write한 것처럼 하는 것이다.


(3)의 Code는 다음과 같다.



대상이 우리 Process일떄도 다시 조건을 주었는데,

Process Scan 함수에서 ZwReadVirtualMemory()를

사용하는듯 할떄 그때 저 처리를 해주지 않으면

에러가 발생하는지라 본인이 조건을 준것이다.

(1),(2),(3)의 Code는 거의 흡사하지만

(4)의 Code는 많이 다르다.


(4)의 Code는 다음과 같다.



이 Code는 Process의 목록에서 자신을

건너 뛰게 하는 기능을 하고 있다.


그럼 지금까지 작성한 Code가 정상적으로 작동하는지

몇가지를 Test하여 보았다.

먼저 NewProtect.exe를 킨 상태에서

Load버튼을 누르지 않은 상태로 두고

Tsearch의 Process 목록에 NewProject.exe가 있는지 살펴본다.

NewProject.exe가 있는것을 볼 수 있다.

이제 Load버튼을 누른 후 다시 Process 목록을 보면..?

Process 목록에 NewProject.exe가 없는것을 볼 수 있다.



두번쨰로 메모리 보호를 Test하여 보기 위해,

Driver Source에서 ZwOpenProcess(),ZwQuerySystemInformation()은

OFF시킨 상태로 테스트 하여 보면,

아래 그림과 같이 잘 읽히던 Memory를 프로그램 작동 후

읽지 못하게 된다.



우리의 프로그램이 잘 작동 하는지 확인 하려면,

DebugView라는 프로그램을 이용하면 다음과 같이 살펴 볼 수 있다.




지금까지 다루었던 내용외에

ZwCreateProcessEx()와 ZwQueryInformationProcess()를

Hooking하여 Attach를 막는 Code도

Source에 포함되어 있으니 관심 있는 분들은

읽어 보아도 좋을 것이다.



For related articles see:

Sysinternals Freeware - Inside the Native API

Windows NT System Calls

Undocumented Windows NT

Programming the Microsoft Windows Driver Model

Win2K/XP SDT Restore 0.2 (Proof-Of-Concept

No hay comentarios: