본문 바로가기

Reversing

(45)
GameHacking 3. ESP 핵의 동작원리에 대해 2편에서는 그래픽 모듈을 후킹 하여 사용하는 월핵에 대해서 알아보았는데 월핵은 무조건 그래픽 모듈을 후킹하는 방법의 월핵만 존재하는가? 꼭 그렇다고 할 순 없다. 그래픽 모듈을 건드리는 방법을 제외하고 상대방의 위치를 알 수 있는 월핵의 종류도 몇 가지 존재한다. 전 편에서 다룬 DirectX 함수를 후킹 하여 ZBuffer를 비활성화하는 그래픽 모듈을 변조하는 월핵이 있고 플레이어 정보가 담긴 게임 구조체의 메모리를 읽어와 플레이어 정보를 화면에 그려주는 ESP (ExtraSensory Perception)라는 월핵이 있다. 또한 물리엔진을 이용한 월핵도 존재한다. 게임 클라이언트 폴더의 Resource 파일에 접근하여 물체를 담당하는 models 파일들을 변조하여 사용하는 월핵도 있다. 이처럼 상대방..
GameHacking 2. WallHack의 동작원리 와 사례 FPS 게임을 하다 보면 종종 불법 프로그램 사용자를 만날 수 있는데 그 중 제일 많이 보이는 핵을 손에 꼽아 말한다면 "월핵"이라 할 수 있다. FPS 게임을 망치는 주범이며 월핵은 무엇이길래 불법 프로그램 사용자들이 주로 사용할까? 요번에는 FPS 게임이면 자주 발견 할 수 있는 "월핵" 에 대해서 이야기를 다뤄보자 한다. '월핵 ?' 월핵은 영어 단어로 벽을 뜻하는 "Wall"에서 따왔다. 벽을 뚫고 상대방을 본다. 라는 개념인데 Wallhack(월핵)은 벽을 통과해 상대방 Character(캐릭터) 모델을 투시할 수 있는 핵이다. FPS 게임에서 상대방 (적군)의 위치를 알고 있다면 플레이가 매우 쉬워질 것이다. 즉슨 게임의 승패를 좌우할 만큼 FPS 게임에서의 상대방의 위치는 매우 중요한 요소로..
GameHacking 1. 게임 핵의 동작 원리 와 사례 소프트웨어 산업 시장이 규모가 커지면서 여러 소프트웨어들이 주목받고 있는 가운데 최근 한국 게임 산업 시장이 20조 원을 돌파하여 세계 시장 점유율 4위를 차지하고 있다. 한국 게임 시장 증가율이 세계 시장 성장률을 상회한 것이다. 이 처럼 게임 프로그램은 전 세계 시장의 주를 이룰 정도로 여러 사람에게 주목받는 시스템이며 사랑받고 있다. 하지만 게임 산업의 걸림돌이 되는 불법 핵 프로그램 사용 유저에 의해 여러 게임 회사들이 손해를 겪고 있으며 게임물 관리 위원회에 따르면 불법 프로그램 탓에 발생하는 총 피해액은 연간 2조 4323억 원에 달할 것으로 추정했다. https://it.chosun.com/site/data/html_dir/2019/11/20/2019112003604.html "연간 2.4조..
[static 안티디버깅] BlockInput() ' BlockInput() ' 설명 키보드 및 마우스 입력 이벤트가 애플리케이션에 도달하지 못하도록 차단합니다. 함수 원형 BOOL BlockInput( [in] BOOL fBlockIt ); fBlockIt : 이 매개 변수가 TRUE이면 키보드 및 마우스 입력 이벤트가 차단됩니다. 이 매개 변수가 FALSE이면 키보드 및 마우스 이벤트가 차단 해제됩니다. 디버깅 중 BlockInput(True); 함수가 호출되면 키보드와 마우스 이벤트 동작이 먹통이 되므로 다른 안티디버깅 루틴 처럼 디버깅 여부를 탐지 해내기 보다는 분석을 하는 행위에 직접적으로 방해를 주는 안티디버깅 기술 이다. 내부적으로 NtUserBlockInput() 를 호출 하여 키보드 , 마우스 이벤트 동작을 차단한다. CODE #incl..
[static 안티디버깅] NtSetInformationThread() ' NtSetInformationThread() ' 설명 스레드의 우선 순위를 설정합니다. 함수 원형 NtSetInformationThread는 ZwSetInformationThread 의 wrapper function이며, ring3 에서는 두 함수의 기능이 동일 하다. NtSetInformationThread 2번째 파라미터에 ThreadHideFromDebugger를 전달 할 경우 첫번쨰 인자로 전달되는 ThreadHandle 과 디버거의 연결을 해제 (Dettach) 한다. ThreadInformationClass는 enum (열거형)으로써 다음과 같다. typedef enum _THREAD_INFORMATION_CLASS { ThreadBasicInformation, ThreadTimes, Th..
[static 안티디버깅] NtQueryInformationProcess() ' NtQueryInformationProcess() ' 설명 지정된 프로세스에 대한 정보를 검색합니다. 함수 원형 NtQueryInformationProcess는 ZwQueryInformationProcess 의 wrapper function이며, ring3 에서는 두 함수의 기능이 동일 하다. ntdll 라이브러리는 중요한 함수이므로 직접 호출을 하지않고 간접 호출을 한다. 2번쨰 파라미터인 ProcessInformationClass 에서 ProcessDebugPort (0x07), ProcessDebugObjectHandle (0x1E),ProcessDebugFlags (0x1F) 정보 유형을 가져와서 디버깅 중인지 여부를 체크 할 수 있다. ProcessInformationClass는 enum (..
[static 안티디버깅] CheckRemoteDebuggerPresent() ' CheckRemoteDebuggerPresent() ' 설명 지정된 프로세스가 디버그되고 있는지 여부를 확인합니다. 반환값 함수가 성공하면 반환 값이 0이 아닙니다. 함수가 실패하면 반환 값은 0입니다. 함수 원형 BOOL CheckRemoteDebuggerPresent( [in] HANDLE hProcess, [in, out] PBOOL pbDebuggerPresent ); hProcess : 디버깅 중 인지 체크할 프로세스 핸들 pbDebuggerPresent : 함수 리턴 값이 저장될 변수 bool 형 현재 자신 프로세스를 디버깅 여부를 체크하기 위해선 다음과 같은 코드를 작성해 볼 수 있다. CODE #include #include void anti() { BOOL DebugCheck; Che..
[static 안티디버깅] IsDebuggerPresent ' IsDebuggerPresent ' 설명 호출 프로세스가 사용자 모드 디버거에 의해 디버깅되는지 여부를 확인합니다. 반환값 현재 프로세스가 디버거의 컨텍스트에서 실행 중인 경우 반환 값은 0이 아닌 값입니다. 현재 프로세스가 디버거의 컨텍스트에서 실행되고 있지 않으면 반환 값은 0입니다. CODE #include #include void anti() { if (IsDebuggerPresent()) { MessageBox(NULL, "Detect", "", MB_OK); } } int main() { anti(); return 0; } Disassemble IsDebuggerPresent() 함수의 반환 값으로 현재 프로세스가 디버깅 중인지 eax 구분을 하여 분기를 일으킨다. IsDebuggerPre..