전체 : 4,150,784 명
어제 : 0 명
오늘 : 0 명

게임가드에 대한 분석

eLee2228 | 2012.06.23 00:45 | 조회 12029

안녕하세요.

순수 취미와 보안의 관점에서 게임가드가 보호하는 프로세스공간의 기억기페이지를 변조하기 위한 한가지 접근법을 테스트하여 본 결과를 공개합니다.

게임가드가 Ring3과 Ring0준위에서 목적하는 프로세스를 보호한다는것은 잘 알려진 사실입니다.

제가 DLL 인젝션기법으로 대상프로세스에의 Attache는 일단 성공하였습니다. (Ring0준위의 접근법)

분석결과를 종합하면 다음과 같습니다.

1. 게임가드는 Ring3준위에서 인라인패치한 주소의 내용이 변경되지 않도록 리얼타임으로 감시하여 복원합니다.

게임가드는 대체로 보안과 직접적으로 관계되거나 크리티컬한 대부분의 API(LoadLibraryA, LoadLibraryW, ReadProcessMemory, WriteProcessMemory ...) 들을 인라인패치합니다. Olly나 다른 디버거로 패치된 API들의 선두주소에 가보면

JMP ==> (게임가드의 인젝션된 모듈내의 주소 )

와 같이 변조된것을 확인할수 있습니다.

만일 Attache시킨 모듈에서 이 패치된 내용을 변경시키면( WriteProcessMemory()를 호출하지 않고 직접 메모리에 접근...) 게임가드는 즉시에 변경된 페이지를 복원시킵니다.

만일 원격프로세스에서 WriteProcessMemory()함수를 사용하여 해당 주소에 접근하려고 하면 당연히 가드에 의해 실패하게 됩니다.

2. 게임가드는 인라인패치한 주소외에도 페지보호속성이 PAGE_READEXCUTE인 령역의 변경여부를 실시간으로 감시하여 복원합니다.

테스트의 목적으로 인라인패치되지 않은 WS2_32.dll의 WSASend()함수의 머리부를 직접 접근하여 변경시켜보았습니다. 변경후 다시 해당 주소의 메모리를 읽어보면 원래와 같음을 확인할수 있습니다.

3. 게임가드의 구성요소인 별도의 프로세스는 API들이 패치되어있지 않습니다.

이게 무슨 소리냐?~ 앞에서 WriteProcessMemory()함수를 호출하여 보호되는 프로세스의 메모리에 접근하려고 하면 API가 실패를 귀환한다고 하엿죠? 하지만 게임가드의 프로세스상황에서 WriteMemory()나 OpenProcess() 함수들을 사용하여 보호되는 프로세스에 접근하면 성공한다는 뜻입니다. 즉 게임가드의 프로세스에 인젝션하여 보호되는 프로세스에 접근할수 있는 가능성이 있다는것입니다.

하지만... API의 호출은 일단 성공하였지만 프로세스내에 로딩된 게임가드모듈에 의해 다시 원래대로 복원되여버립니다.

앞으로 Ring0 준위에서 보호되는 프로세스의 페이지를 변조하려고 시도하는 경우 게임가드가 어떻게 대처하는가에 대한 테스트결과를 추가로 올리려고 합니다. 아마 역시 실패하리라는 예감이 지배적이지만...

결론을 적어본다면 게임가드의 페이지 보호기능을 무력화하지 안고서는 성공할수 없다고 봅니다.



twitter facebook me2day 요즘
가드는 생각보다 수많은 기법을 내포하고 있습니다.x86 기준으로, 커널 ..
가드는 생각보다 수많은 기법을 내포하고 있습니다.
x86 기준으로, 커널 후킹은 기본이고, 상용 솔루션에서 쉽게 보기힘든 , SSDT, SSDT Shadow Relocation 기법까지 사용합니다.
IA32_SYSENTER_EIP를 변조하는지는 본적이 없어서 잘 모르겠군요.
06.23 20:56 | Sone님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
sone님,가드가 IDT후킹을 하는지에 관해서 알려주실수 없으세요?또 가..
sone님,
가드가 IDT후킹을 하는지에 관해서 알려주실수 없으세요?
또 가드가 64bit 플랫홈에서도 커널 후킹을 하는가에 대한 자료가 있으세요?
06.24 13:29 | eLee2228님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
IDT후킹은 아마 안할겁니다...IDT를 후킹해서 뭘 차단할게 없을거 같..

IDT후킹은 아마 안할겁니다...IDT를 후킹해서 뭘 차단할게 없을거 같은데요.
그리고 64비트OS는 패치가드 때문에 대부분의 보안업체들은 패치가드를 무력화하면서까지 도박적으로 후킹을 시도하지는 않을겁니다. 패치가드를 뚫기가 쉬운게 아닙니다. OS마다 패치가드 기법이 조금씩 다른것으로 알고있습니다.

제가 직접 보진 않았습니다만, 아마 64비트OS에서 게임가드는 커널후킹은 하지않고, 커널 자료구조를 수정하는 방식으로 뭔가 보호장치를 해놨을겁니다.

패치가드는 GDT, IDT , SSDT, SSDT Shadow, IA32_LSTAR MSR Register Hook 등을 모두 차단합니다.
사실상 커널후킹을 원천 차단하는것이라 볼수 있습니다.

06.25 02:00 | Sone님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
64bit OS에서 게임가드가 커널자료구조를 수정하는 방식으로 보호장치를..
64bit OS에서 게임가드가 커널자료구조를 수정하는 방식으로 보호장치를 해놨을거라는 추정은 DKOM방식을 사용했을거라 이 말씀이세요?
다른 한가지는 x32 플랫홈에서 가드가 후킹한 SSDT를 복원할 가능성이 있을가요?
06.25 10:40 | eLee2228님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
DKOM이라 생각하고 있지만, 이것도 그냥 저만의 추측일 뿐이니, 너무..
DKOM이라 생각하고 있지만, 이것도 그냥 저만의 추측일 뿐이니, 너무 신뢰하지 않는것이 좋을듯합니다.
x86에서는 GameGuard.des가 ZwOpenSection으로 PhysicalMemory 핸들을 얻어온뒤, 커널영역의 SSDT(KeServiceDescriptorTable) 에 접근하여 SSDT복원을 시도하는것으로 알고있지만, 이 역시 오래전의 정보라서 현재도 이 작업을 수행할지는 미지수입니다.

제가 최근에 게임가드가 탑재된 게임을 한적이 없어서, 안본지 꽤 됐습니다.
06.25 14:53 | Sone님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
슬립문을 이용해서 해보세요.
슬립문을 이용해서 해보세요.
07.12 22:51 | soni님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
좋은글 감사합니다.
좋은글 감사합니다.
08.02 16:52 | 얌시님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
뭐.. 테스트 해보니 게임가드는 dll injection 에 그냥 뚫리더..
뭐.. 테스트 해보니 게임가드는 dll injection 에 그냥 뚫리더군요 ㄱ-;;
더이상은 위험발언이므로 안하겠습니다..;;
10.01 14:09 | Lr라님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
dll injection으로 메모리 접근에 성공했다고 하더라도 in-li..
dll injection으로 메모리 접근에 성공했다고 하더라도 in-line patch 때문에 복구된다고 본문에는 적혀있습니다만.. 아마도 부가적인 bypassing을 하신 것이 아닌지...
10.01 15:05 | 곰탱이_님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
음.. 부가적인 bypassing 이라... 그런건아니고... 음... ..
음.. 부가적인 bypassing 이라... 그런건아니고... 음... 뭐랄...까..
표현하기가 직설적이여서.. ..;; 어덯게 설명을;;ㄷㄷ
여튼 힌트를 드리자면 기존 cre......쓰레드 함수에서 다른걸로..바꿔도 가능하다라는거..?;;
10.03 13:16 | Lr라님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
가드는 너무 많은 방어책이 있어서...
가드는 너무 많은 방어책이 있어서...
11.09 13:37 | Dong-Uk Kim님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
그거 injection 하신거구여 게임가드를 무력화랑은 조금 틀..

그거 injection 하신거구여 게임가드를 무력화랑은 조금 틀려보이는데요.

injectin 보편적으로 많이 사용하는 방법이 안될지 모르겟지만.
Lr라 힌트를 주신 부분은 많이 공개되어진 방법입니다.

12.02 00:16 | 희동님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
그 이외에도 잔머리만 굴리면 모든게 가능합니다. P:)예를 들자면 Pro..
그 이외에도 잔머리만 굴리면 모든게 가능합니다. P:)
예를 들자면 Process Ha.....나 이런프로그램을 이용해서 쓰레드 부분을 공략한다던지...
아님 직접 패턴을 찾아서 패치를 한 뒤에...
Memory Write로 구현해서 계속 쓰게해도 먹힙니다. P:)
물론 조건은 언패X 이겠죠?
12.28 18:19 | Lr라님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
댓글쓰기 - 로그인한 후 댓글작성권한이 있을 경우 이용하실 수 있습니다.

비밀번호 확인

댓글 등록시에 입력했던 비밀번호를 입력해 주세요.
164개(1/9페이지)
rss
리버싱
번호 제목 작성자 작성일 조회
164 [기타]프로그램 리버싱/크랙/언패킹 의뢰 작업합니다 [Revers Engineering] rrr123 2018.01.24 51
163 [중급]게임프로그램 소스찾기 qkrwnstj38 2017.10.16 179
162 [중급]리버싱 의뢰합니다. morort 2017.10.14 171
161 [중급]Xtrap에 대해 자문 구합니다. 구름따라 2017.03.10 453
160 [기타]언패킹된 프로그램 인증서버 우회해주실 분 구합니다. 가을 2017.01.19 621
159 [기타]각종 매크로, 오토, 자동화, 앱 제작 / 리버싱, 크랙 의뢰받습니다. 프리랜서 2017.01.17 1007
158 [중급]프로그램의뢰합니다 고구려 2017.01.13 562
157 [중급]프로그램의뢰합니다 고구려 2017.01.13 530
156 [중급]리버스 도와주실분구합니다 BMW 2017.01.12 615
155 [기타]더미다 언패킹해주실 분구합니다. 알수가없넹 2017.01.01 653
154 [고급]Xtrap에 대한 질문입니다. 구름따라 2016.11.09 708
153 [기타]리버싱 의뢰 검은늑대 2015.07.15 1917
152 [기타]리버싱,크랙 의뢰합니다 인엑스 2014.11.26 2997
151 [고급]리버싱의뢰[2] 메이징 2014.02.13 3461
150 [기타]LenA-01. Olly + assembler + patching a basic reverseme 악비 2013.11.08 2141
149 [초급]x86 레지스터 정리[6] 곰탱이_ 2012.09.17 5871
>> [초급]게임가드에 대한 분석[13] eLee2228 2012.06.23 12030
147 [초급]리버싱 초급입니다~첨부파일[18] Jongmin-Park 2012.06.20 9493
146 [중급]자작 크랙미 2번첨부파일[13] gunny 2012.04.20 8342
145 [초급]Themida로 패킹된프로그램 언패킹할때 올리 디버그 툴 옵션설명[12] 봄나비 2012.02.01 14031