GameHacking 1. 게임 핵의 동작 원리 와 사례
소프트웨어 산업 시장이 규모가 커지면서 여러 소프트웨어들이 주목받고 있는 가운데
최근 한국 게임 산업 시장이 20조 원을 돌파하여 세계 시장 점유율 4위를 차지하고 있다.
한국 게임 시장 증가율이 세계 시장 성장률을 상회한 것이다.
이 처럼 게임 프로그램은 전 세계 시장의 주를 이룰 정도로 여러 사람에게 주목받는
시스템이며 사랑받고 있다.
하지만 게임 산업의 걸림돌이 되는 불법 핵 프로그램 사용 유저에 의해 여러 게임 회사들이 손해를 겪고 있으며
게임물 관리 위원회에 따르면 불법 프로그램 탓에 발생하는 총 피해액은 연간 2조 4323억 원에 달할 것으로 추정했다.
https://it.chosun.com/site/data/html_dir/2019/11/20/2019112003604.html
"연간 2.4조원 손실" 핵과의 전쟁, 게임계 대처법은?
상위 10개 게임 ‘핵’ 적발 계정 수 하루 평균 4만5881개라이엇게임즈 ‘데마시아’ 운용…단호한 법적 대응에픽게임즈, ‘머신 밴’과 ‘원 스..
it.chosun.com
국내 게임 업계 매출이 12조 원 규모인 것을 감안하면 상당히 큰 타격을 입는다고 할 수 있는 수준이다.
상황이 이렇다보니 여러 국내외 게임 기업은 불법 프로그램 사용 행위를 막기 위해
다양한 방법을 사용한 Anti-Cheat(안티 치트) 보안 솔루션을 도입하게 되면서
게임 회사와 해커 간의 창 과 방패의 싸움이 시작 되었다.
라*엇 게임즈 에선 불법 프로그램 유포자에 대해 단호하게 대처하겠다 발표하였고
데*시아라는 안티치트 보안 솔루션을 도입하였다.
에* 게임즈 사의 포* 나이트 같은 경우 '머신 밴'이라는 독특한 방식으로
불법 프로그램 이용자를 제제하는 시스템을 구축하였으며
https://m.gamevu.co.kr/news/articleView.html?idxno=11652
'포트나이트' 국내 정식 론칭 임박...한국시장 '공습' 성공할까
지난 해 7월 출시되어 전 세계를 휩쓸고 있는 '포트나이트' 열풍의 공식 한국 상륙이 임박했다. 오는 8일부터 PC방을 비롯한 국내 정식 서비스가 실시되는 것.'포트나이트'는 슈팅 전투에 방어 건
m.gamevu.co.kr
넥*사 의 카*라이더 같은 경우, 불법 프로그램의 이용자의 로그 데이터를 자동 분석하여 어뷰징,
불법 프로그램 사용자 유저를 적발할 수 있는 봇을 도입하고 있다.
https://it.chosun.com/site/data/html_dir/2019/11/03/2019110300804.html
악뮤가 테마곡 부른 카트라이더 '어비스'…새 카트와 신고제 개선도
2019 카트라이더 쇼케이스 ‘겟 셋 레디 고(GET SET READY GO!)’카트라이더 새 테마는 ‘어비스’, 테마곡은 ‘AKMU(악동뮤지션..
it.chosun.com
'그럼 도대체 핵의 동작 원리가 무엇일까?'
불법 프로그램 사용자 유저가 늘어나고 선량한 게임 플레이 유저가 피해를 입게 되면서
궁금해하는 경우가 다수 생기기 시작한다.
도대체 핵의 동작 원리는 무엇이며 어쨰서 게임 회사들은 핵을 못 막는 것일까?
그중 가장 큰 이유는 개발사가 허락하지 않는 게임 시스템에 접근하면서
취할 수 있는 이득. 해당 행위를 되사고 팔 수 있게 되면서 즉 돈이 되기 때문에
불법 프로그램 소비자는 핵을 사용하여 악의적으로 게임 내에서 이득을 취하고
이를 개발하여 유통하는 개발자들이 돈을 받고 판매하는 암시장이 열려 있기 때문에
불법프로그램을 완전히 근절하긴 힘들다.
이 처럼 게임 시스템을 망가뜨리는 게임 해킹은 무엇이고 어떤 원리로 사용되는지에 대해 알아보려 한다.
기본적인 개념
우선 게임 프로그램을 해킹하기 위해선 리버스 엔지니어링이라는 역공학 기술이 요구된다.
리버스 엔지니어링이란?
https://ko.wikipedia.org/wiki/%EC%97%AD%EA%B3%B5%ED%95%99
역공학 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. -->
ko.wikipedia.org
리버스 엔지니어링이라는 기술을 이용하여
개발되어 있는 소프트웨어를 Disassemble(디스어셈블) 어셈블리언어로 변환하는 작업을 하고 명령어를 해석하여
해당 게임의 구조, 시스템을 분석하고 악용할 수 있도록 메모리 조작을 하거나
게임 서버와 클라이언트의 통신 메커니즘을 분석하여 패킷 조작, Non-Client Bot(논-클라이언트 봇) 개발
등 이 이루어진다.
게임 해킹의 종류
우선 제일 근본적인 Memory Hacking이 있다.
Memory Hacking으로 할 수 있는 게임 핵의 종류는 무수히 많다.
가장 큰 예로 FPS 게임 같은 경우 화면에서 총을 쏠 시 카메라 좌표가 변동되는 반동 메커니즘을 분석하여
무반동 핵을 구현할 수 있고
게임 그래픽스를 담당하는 DirectX , OpenGL 모듈을 Hooking(후킹) 하여 벽을 통과해서 상대방의 위치를
볼 수 있는 월핵이 있겠다.
물론 게임 Money(머니) 같은 "돈 복사" 등 게임 머니를 조작하는 매우 취약한 요소들은
대부분 SS(Server-Side)에서 이루어지기 때문에 온라인 게임에 흔히 존재하진 않는다.
게임 해킹의 동작 원리
게임 프로그램에 접근하여 메모리 조작을 하기 위해선 해당 프로그램에 접근하기 위한 "권한"이 필요하다.
이때 접근 할 수 있는 경로가 Internal(내부)와 Externel(외부) 방식이 있다.
내부(Internal)
Internal 방식은 게임 프로세스에 직접 DLL (Dynamic-Link Libraries)을 Injection(인젝션) 하는
DLL Injection(딜 인젝션) 방법과 상대방 프로세스에 독립적인 Code를 삽입하여 실행하는 기법인
Code Injection(코드 인젝션) 방법을 통해 게임 프로세스 내부에서 코드를 실행하여 접근한다.
Internal 방식의 장점은 게임 프로세스에 직접 삽입하는 것이기 때문에 게임 메모리에 접근하기 쉬우며
포인터(*) 접근도 쉽고 속도면에서도 Externel 방식보다 빠르다.
Internal 방식의 단점은 DLL을 인젝션 할 경우
. exe(응용 프로그램 실행 파일 형식)이 아니므로 더블 클릭으로 쉽게 실행할 수 있는 External과 달리
DLL을 프로세스에 주입할 수 있는 Injector(인젝터)가 필요하며
보안 솔루션에서 DLL Injection 탐지 기능이 포함돼 있을 경우에 탐지당하여 게임이 종료되게 된다.
Internal 방식에서 메모리에 접근하는 코드는 다음과 같이 작성할 수 있다.
DWORD Mem = *(DWORD*)(0xFFFFFF);
int Bullet = *(int*)(Mem + 0xC);
if (*(BYTE*)IngameAdr == 1) {
Bullet = 999;
}
외부(External)
External 방식은 외부 프로세스에서 게임프로세스 메모리에 접근하는 방법이다.
주로 Win32 Api를 사용하여 OpenProcess() - PROCESS_ALL_ACCESS를 호출하여 액세스 권한을 얻고
Handle(핸들)을 얻은 뒤 ReadProcessMemory() , WriteProcessMemory() 함수를 이용하여
메모리를 읽고 쓰기 작업을 한다.
External 방식의 단점은 메모리에 접근할 때마다 Win32 Api 함수를 호출해야 하므로
Internal 방식보다 메모리 접근 속도가 비교적 느리고
외부에서 접근하므로 보안 솔루션에서 Process Scanner(프로세스 스캐너) 같은
여러 안티치트 기능이 포함돼 있을 경우에는 탐지당하여 게임이 종료되게 된다.
VOID GetProcess(LPCWSTR windowTitle)
{
windowHandle = FindWindow(NULL, windowTitle);
if (windowHandle == NULL)
{
printf("[0xe] 게임을 찾을수 없습니다!\n");
return;
}
GetWindowThreadProcessId(windowHandle, &processId);
processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
}
GetProcess(L"Game");
uintptr_t Mem = 0xFFFFFF;
int MemRead;
ReadProcessMemory(processHandle, (LPCVOID)Mem, &MemRead, sizeof(MemRead), NULL);
uintptr_t BulletAdr = MemRead + 0xC;
int Bullet;
ReadProcessMemory(processHandle, (LPCVOID)BulletAdr, &Bullet, sizeof(Bullet), NULL);
int newBullet = 999;
WriteProcessMemory(processHandle, (BYTE*)BulletAdr, &newBullet, sizeof(newBullet), NULL);
실습
우선 무료 슈팅 게임인 "Assult Cube" 라는 게임을 타겟으로 실습을 해보게 됐다.
AssultCube는 무료 1인칭 슈팅 게임으로 게임 리버서라면 CheatEngine으로
한번쯤은 깔짝(?) 해봤을 법한 게임인데 상당한 저사양에 무료 게임치 곤 매우 잘 뽑아낸 수준이다.
CheatEngine을 사용하여 AssultCube 게임의 메모리에 접근하여 실제 게임 핵을 만들어 보도록 하겠다.
우선 게임 프로세스의 메모리 액세스 권한을 얻기 위해 핸들을 잡아주고 총알 갯수를 담당하는 Function를 찾는다.
우선 총알 갯수를 담당하는 Address(메모리 주소)에 접근하기 위해 Byte 크기형으로
총알을 소비하면서 변화된 값을 스캔해 주었다.
행동을 반복하며 스캔하였을 때 유동 메모리 주소 2개가 떴고
CheatEngine의 frozen 기능을 이용하여 해당 메모리 주소의 Value(값)이 고정되도록 하였다.
결과 0x0076D690 주소의 값을 frozen 했을 경우 실제 게임 내에서 총알을 소비해도
총알 카운트가 감소하지 않는 것을 확인했다.
Find ou What writes to this Address 기능을 이용하여
해당 메모리 주소가 어디 영역에서 쓰는지 추적할 수 있다.
해당 ac_client.exe+C73EF 주소 영역이 총알 감소를 담당하는 Function인 것을 알아냈고
명령어를 따라가며 총알이 감소되는 메커니즘을 분석한다.
dec 는 피연산자에 1을 뺴는 명령어로 총을 쏠떄 총알이 감소되는 부분이라 파악할 수 있다.
총알을 소비했을 때 무조건 총알이 999발이 될 수 있도록 Hooking Code를 작성하였다.
내가 게임 개발자라면 핵을 막을 수 있는 방어 코드를 작성하지 않겠는가(?)
총알 갯수를 변조하는 핵을 막기 위한 간단한 Anti-Code도 작성해 보 자
현재 총알을 검사 후 총알이 100발 이상이라면(?)
즉 비정상 적인 총알 일 경우 경고 메시지박스를 띄우는 Crime Message 스크립트를 작성하였다.
마치며
이처럼 Sample code를 비교해 봤을 때
방법마다 복잡함의 차이와 메모리에 접근하는 방식이 다르다는 것을 알 수 있었고
어떤 식으로 게임 해킹이 동작하는지에 대해 자세히 알 수 있었다.
서비스 중인 온라인 게임을 공격하는 프로그램을 개발하여 유포, 유통하는 행위는 불법 이므로
공부하더라도 유의하고 공부할 수 있길 바라며
이상 게임 핵의 동작 원리와 사례에 대해서 알아보았다.
다음에는 ESP(ExtraSensory Perception) 핵과 DirectX9 후킹을 통한 월핵
Aimbot(에임봇) 등에 대한 글을 다룰 예정이다.