나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2024-11-14 01:13:41

치트 엔진

Cheat Engine에서 넘어옴
파일:치트엔진.png

Cheat Engine
[clearfix]
1. 개요2. 사용 방법
2.1. 검색 및 조작이 안 되는 경우
3. 기능
3.1. 포인터 스캐너3.2. 디버깅
3.2.1. DBVM(Dark Byte's Virtual Machine, 가상머신)
3.3. 스크립트
4. 게임핵5. 창과 방패 문제6. 여담7. 같이보기

1. 개요

공식 홈페이지

가장 유명한 메모리/헥스 에디터 프로그램 및 디버거이다. 주로 게임 관련 해킹이나 핵을 만드는데에 사용되기에 게임 해킹의 필수품으로 여겨진다. 오픈소스이며 대부분의 들이 치트 엔진을 통해 얻은 정보로 제작된다고 해도 될 정도다.[1] 강력한 헥스에디팅/메모리에디팅 툴로, 다른 프로그램에 비해 스캔 속도가 매우 빠른 편이다. 'cheat engine assembler'를 지원하는데, 이를 통해 코드 인젝션을 손쉽게 할 수 있다. 또한 여러 디버거(windows, VEH, dbvm)을 지원하여 메모리 흐름을 쉽게 볼 수 있다.

레지스터까지 변경할 수 있고 특정 주소에 무슨 opcode가 접근하거나 쓰고 있는지도 찾을 수 있는 등 디버깅 기능도 많이 포함하고 있다. 1~8 바이트, Float, Double, String, Binary 등 다양한 형식을 스캔할 수 있어 매우 유용하다. 또한 Lua 스크립트도 지원하고 5.8 버전부터는 DBVM(가상머신)까지 자체적으로 지원한다. 현재 최신 버전은 v7.4이고 여기에서 다운로드 받을 수 있다. 개발자는 Dark Byte이며 치트 엔진 포럼에 해당 프로그램 사용에 유용한 정보가 많이 올라와 있다. 주소는 여기.[2]

7.3 버전부터는 오프라인 인스톨러가 없어지고, 광고가 포함된 설치 파일을 내려받는 웹 인스톨러 형태로 바뀌었다. 따라서 설치할 때는 반드시 인터넷 연결이 필요하다. 또한 광고로서 포함된 부가 프로그램이 꼭 필요하지 않다면 설치 체크박스를 비워주자.[3]
오프라인 인스톨러 최종 버전인 7.2는 제작자가 전부 내려서 공식 사이트나 미러 사이트 등에서는 구하기가 어려우나, 인터넷이 안되는 PC등에서 사용하려면 필요한데 검색 등을 이용해 따로 올려놓은 곳을 찾을 수 있다. 예시[4]

한국어 번역파일도 공식 홈페이지에 있지만(downloads 항목의 Translations 밑에 있다) 구형이라서 한국어 패치를 하면 버전 표시가 6.6으로 뜬다.[5] 하지만 그걸 제외하면 기능은 정상적으로 작동한다.(사실 텍스트 에디터로 한국어 번역 파일을 뜯어고치면 간단하게 버전 표시를 업그레이드 가능하다)

이전에 유명했었던 치트오매틱과 비슷한 프로그램이다. 물론 이에 비해 제공되는 기능이 매우 많고 강력하여 치트오매틱을 제치고 핵 프로그램의 대명사로 떠올랐다. 이외에 비슷한 프로그램으로 tsearch가 있다.

2. 사용 방법

치트오매틱과 비슷하다. 튜토리얼이 존재하며, 영어를 몰라도 대충 감이 온다.[6] 다음은 실제 상황에서의 사용법.
  1. 왼쪽 위의 컴퓨터 아이콘을 눌러 목록에서 변경할 프로그램을 선택한다.[7]
  2. 게임에서 변경할 수치를 확인한 후, 해당 수치를 오른쪽 빈 칸에 입력하고 First Scan을 누른다.
  3. 게임으로 돌아가 수치를 변경한 후, 변경된 수치를 입력하고 Next Scan을 눌러 원하는 항목이 나올 때까지 걸러낸다.
  4. 걸러낸 값을 더블클릭하여 아래의 목록으로 옮긴 후, 값을 더블클릭해 원하는 수치를 입력하고 확인을 누른다.
  5. 게임에서 변경되었는지 확인한다. 덧붙여 목록으로 빼낸 값의 왼쪽에 있는 체크박스에 체크하면 해당 값을 고정한다.

어지간한 고전게임들은 적은 변수 사용으로 간단하게 값이 바로 딱 한 개만 나오지만, 최신 게임들에서는 수 많은 변수들을 사용하기 때문에 수치값 하나에 두 개 이상의 값들이 많이 검색되는 경우가 있다. 게다가 자릿수가 적을수록 아주 많이 찾아내기 때문에 이 때에는 2222, 3333처럼 좀더 값을 독특하거나 큰 수로 줘서 검색시 고유값처럼 구별이 되게끔 바꿔두는 방법으로 검색할 수밖에 없다. 더 나아가 수치가 일반 숫자값이 아닌 Hex라거나 다른 형태로서 저장되는 경우, 위의 방법으로는 아무리 찾아도 나오지 않기 때문에 이 부분은 세밀한 조정이 필요하다. 게임 개발에서 꼼수로 비정상적인 방법으로 수치를 저장해두는 경우도 이에 해당된다. 예를 들어, 알만툴에서는 변수를 따로 두지 않고 캐릭터 개수로 변수를 놓거나 체인형식으로 수치들을 나눠놨다가 필요시 한꺼번에 사용하는 경우이다. 이외에도 창의적인 방법들이 많다. 다만, 이러한 방법들은 메모리를 쓸데없이 더 쓰거나 오버헤드가 있는 등의 비용문제가 있기에 많이 사용되는 것도 아니고 복잡한 게임일수록 사용되지 않는다.

가끔 아무리 값을 변경하며 검색하더라도 2~5개 정도에서 더 이상 좁혀지지 않는 경우가 있는데, 이는 UI상의 수치와 다른 곳에 값을 사용하기 위해 따로 할당해놓은 수치인 경우가 대부분이다.[8] 이럴 때에는 게임을 저장해두고 일일이 하나씩 바꿔서 값이 변한 게 효과있는지 확인해가며 찾을 수밖에 없다. 가끔 잘못 건드리면 게임코드나 다른 변수를 건드린 거라 에러로 꺼질 수 있는데, 어쩔 수 없다. 심화과정을 할 수 있거나 코딩에 대해 어느 정도 지식이 있다면, 해당 메모리의 호출자를 확인해서 어느게 진짜 값인지 알아낼 수 있다.

한편 모든 수치에는 한계가 존재하기에, 너무 높은 값을 지정하면 수치가 마이너스로 바뀌거나 오류가 발생해 게임이 터지는 현상이 발생할 수 있으므로 여유를 두고 최대값을 잡자. 대부분 정수형 자료형을 사용하기 때문에 최대값을 2147483647 이하로 잡으면 된다. short의 경우 32767, Byte면 255까지가 최대값이다. 대부분 검색할 때마다 자료형이 치트엔진에서 잡아주기에 그에 맞춰 최대값을 맞추면 된다. 매우 드물지만 unsigned 자료형을 사용하는 경우에는 앞서 언급된 최대값의 2배를 허용하나 음수를 가지지 않는다는 것을 명심하고 최대값을 맞추면 된다.[9]

이외에 심화과정으로 이렇게 검색한 값의 메모리 위치를 스크립트로 고정하여 치트테이블로 만드는 과정이 있다. 더 나아가 코드분석, 데이터 마이닝도 손쉽게 가능하다.

뿐만 아니라 굉장히 손쉽게 스피드핵을 사용할 수 있다. 변경할 프로그램을 선택한 뒤 오른쪽 중간쯤에 스피드핵 활성화 버튼을 누르면 끝. 다만 당연하게도 모든 온라인 게임은 이런 핵을 금지하고 있으며 뒷감당은 본인의 몫이다. 가급적이면 싱글 게임에서만 사용하도록 하자. 배속설정은 최대 50배까지 가능하나 형식상 50배일뿐 보통 5배정도 더빠르다고 보면된다

2.1. 검색 및 조작이 안 되는 경우

앞서 언급된 사용 방법 항목 이후로 겨우 검색해서 찾은 유일한 수치값을 변경하더라도 바로 다시 원래대로 돌아가는 경우가 있는데, 이는 크게 3가지의 경우가 있다. 첫 번째는 찾으려는 값이 암호화되어 다른 값을 가져 검색에서 걸리지 않았거나, 두 번째는 서버에서 매번 값을 받아오기에 서버값으로 덮어씌워지는 것이고, 마지막으로 다른 곳에 쓰이려고 코드상으로 있는 임시 변수를 찾은 경우이다. 이를 더미데이터로 보는 시각이 있으나, 이는 프로그램의 무지에 의한 관점일 뿐이고 더미데이터 문서를 참고하면 알 수 있듯이 기존 개념과 정의에서 완전히 벗어난 잘못된 시각이다.

3. 기능

3.1. 포인터 스캐너

자동적으로 정적 주소[13]를 기반으로 스태틱 값이 아닌 주소를 찾아주는 기능.[14] 일반적인 게임에서는 다양한 값을 메모리에 동적 할당 형태로 저장하는데, 동적 메모리를 참조하는 주소 자체는 큰 쓸모가 없다. 하지만 일부 정적 주소는 항상 다른 주소를 가리키며, 연달아 이 주소가 또 다른 주소를 가리키기도 한다. 이런 연결 고리 끝에 흥미롭고 다양한 정보를 가진 동적인 주소가 연결된 경우도 있는데 이러한 연결을 포인터 체인이라고 하며, 정적인 주소를 통해 동적인 주소를 찾는 행위를 포인터 스캐닝이라고 하는 것이다. 포인터 스캐너는 자동으로 정적 주소를 찾아주는 편리한 기능이지만 고성능의 CPU와 많은 시간, 게임의 종류에 따라서 결과값 산출을 위한 대용량의 저장매체를 필요로 하므로 어셈블리어를 잘 아는 사용자에겐 별로 좋은 선택지는 아니다. 게다가 요즘 게임은 포인터 주소값을 바로 저장하지 않고 적어도 XOR연산 정도는 해준 다음에 저장하거나 해킹이 어렵게 8레벨은 넘는 포인터를 사용하기 때문에 오래된 게임에서나 잘 작동한다

3.2. 디버깅

웬만한 디버깅 기능은 갖추고 있다. 윈도우 디버거 또는 VEH 디버거 그리고 후술할 커널을 이용한 디버거 중에서 고를 수 있다.

3.2.1. DBVM(Dark Byte's Virtual Machine, 가상머신)

대부분의 게임에서는 윈도우 디버거를 막아 놓는데, 이놈은 컴퓨터 자체를 가상화해서 피지컬 메모리에 직접 접근 할 수 있게 한다. 배틀아이 또는 싸인 코드가 프로그램의 메모리를 읽지 못하게 하는 것은 유저 모드에서나 하는 것이지만 이것을 이용하면 그것을 가볍게 무시하고 피지컬 메모리에 직접 엑세스하고 메모리에 접근 할 수 있다. 또 디버거 기능까지 탑재 되었는데, 윈도우 커널을 통해서 프로세스 간에 일어나는 상호작용까지 잡아낼 수 있다. 이로 인해 사실상 게임들은 치트 엔진을 막는 것밖에 방법이 없기 때문에 안티 치트 솔루션에서도 가장 골치 아프게 본다.

2017년경 오버워치 핵이 판쳤을 때 오버워치는 보안이 약하다는 인식이 씌워졌는데, 사실 오버워치는 절대로 보안이 약한 게임이 아니다. 외부에서 메모리에 접근하는 부분은 아무런 보안이 없지만 그만큼 포인터 암호화가 철저하게 되어 있고, 다른 게임이라면 VirtualProtectEx를 이용해서 실행 코드 부분을 덮어 씌워서 해킹할 수 있지만 오버워치는 .text 섹션을 리매핑하여, SEC_NO_CHANGE를 통해 메모리 수정을 불가능하게 했다. 오버워치의 보안이 무용지물이 된 이유는 바로 내부에서 DBVM 가상머신을 이용해 캐릭터의 가시여부를 따지는 함수와 에임앵글에 접근하는 함수를 디버거를 통해 RIP 레지스터를 핵 코드 실행주소로 후킹해서 가능했던 것이다. 물론, 2018년경 부터는 해커들이 .text섹션을 직접 리매핑하여 DBVM을 사용하지 않고도 메모리에 직접 접근하기 시작했다. 즉, 오버워치의 보안 문제는 오버워치 팀의 대처가 거의 없었던 점에서 기인했다.

3.3. 스크립트

어셈블리를 오토 어셈블 해주거나 LUA 스크립트를 사용할 수 있다. 메모리 할당, 쓰레드 생성, 심볼 설정 등 다양한 편리 기능까지 있다. 사실상 치트 엔진 스크립트를 이용해서 핵 프로그램을 만들 수 있다. 스크립트를 이용한 트레이너를 제작하는 툴도 치트 엔진 내부에서 제공하고 있다. 과거 오버워치서든어택 핵이 인터넷에 퍼졌을 때도 대부분 이 치트 엔진 스크립트와 위에서 말한 DBVM을 이용한 핵들이다.

4. 게임핵

결론부터 말하자면 조금이라도 게임을 건드리면 해킹이 맞다. 특히 온라인 게임에서는 계정 정지가 일어날 수 있으므로 사용하지 말자. 싱글플레이 게임에서 나 혼자 해킹하는 거야 누가 알 바 아니겠지만, 온라인 경쟁과 어떤 식으로든 연관될 경우(게임은 싱글플레이지만 업적이나 점수가 온라인에 게시되고 특히 랭킹 경쟁이 있을 경우[15], 아니면 싱글 게임 + 치트 엔진을 켠 상태에서 까먹고 온라인 게임을 동시에 실행하는 경우) 문제가 될 수 있다. 특히 후자의 경우 실수로 영정을 먹는 경우가 은근히 많으니 조심하자.

흔히 게임핵으로 알려진 대부분의 트레이너들은 이 치트엔진을 토대로 만들어진다. 치트엔진 자체가 메모리의 수치값을 그대로 읽고 커스텀 GUI까지 지원하는 강력한 오픈소스 프로그램이기 때문이다. 굳이 따로 헥스툴 관련 기초부터 프로그래밍할 필요 없이 단순한 메모리 찾는 스크립팅만으로 만들 수 있기 때문에 이를 이용한다.[16] 트레이너마다 버전별로 달라지는 원인도 버전마다 메모리 위치가 달라지기 때문에 수치만 보정한 차이일 뿐이다. 그럼에도 프로그래밍도 아닌 아주 기초적인 컴퓨터 사용 관련 지식 조차 없으면 치트엔진을 사용하려 해봤자 아무 초보적인 사용법조차 못 따라가서 무용지물이 된다. 그래서 이를 미리 검색과정을 해놓아서 돈으로 파는 것이 바로 트레이너이다.

공식 사이트에서 내려받은 정품 치트 엔진 자체는 절대로 게임 내 보안 시스템을 우회하지 않는다. 즉, 온라인 게임 보안 프로그램이 마음만 먹으면 감지할 수 있다는 뜻이다. 보통 게임사들도 이러한 경우에는 위험 프로그램 감지로 특정해서 바로 게임을 강제종료시키고 경고문 정도만 띄우는 정도로 마무리하고 실제 영구 정지까지는 가지 않는 경우가 대부분이다. 문제는 공식 사이트가 아닌 곳에서 이러한 탐지 시도를 우회하는 변조된 치트 엔진을 받았을 경우이다. 이 경우에는 정상적인 탐지를 우회하는 기능이 더해져있다보니 사용자가 치트 엔진에 손을 대서 데이터 값을 변조하고 그것을 온라인 서버가 감지하는 순간 영구 정지를 당하는 것은 시간 문제다.

5. 창과 방패 문제

치트 엔진은 그 훌륭한 기능도 기능이지만, 아무래도 가장 큰 심각성은 소스가 오픈되어 있다는 것에 있다. 오픈소스로 인해 수백 종 이상의 게임 보안 솔루션 바이패스 버전이 등장했으며 게임 보안 솔루션의 패치 속도보다 더 빠른 업그레이드 속도를 보여주고 있다. 이 때문에 게임 보안 솔루션 개발업체에서는 이 치트엔진 때문에 골머리를 앓고 있을 정도이다. 보안솔루션 개발자 몇 명이서 막고 있는데, 전세계 게임해커들은 이를 우회하는 방법을 찾고 있기 때문이다. 특히 치트엔진은 주로 로컬 메모리에 대한 의존도가 높은 게임에 많이 악용되고 있다.

그러나 당연하지만 치트 엔진이라고 해서 만능은 아니며, 결과적으로 조작을 막는 방법이 있기에 사용에 대해 조심할 필요가 있다. 주로 멀티플레이온라인 게임에서 볼 수 있는데, 만약에 이 게임들에서 사용하면 지금까지 키워놓은 계정이 하늘 위로 날아가는 모습을 보거나 갑자기 게임이 꺼지는 상황을 볼 수 있다.호기심으로 사용해 본다면 갑자기 꺼질때가 있을것이다[17]

개발측면에서 보자면 대부분의 게임들은 게임자체의 보안에는 투자를 잘 안 하는 편이다. 특히 보안에 신경쓰는 온라인 게임의 경우, 차라리 보안에 신경을 쓴다면 클라이언트나 엔진과는 상관없이 서버에 보안을 강화시키는 것이 일반적이다. 예를 들어 리니지 같은 게임은 철저히 서버 사이드 단에서 개발되었기 때문에 웬만한 데이터는 다 서버가 가지고 있고 클라이언트는 거의 UI만 존재하는 편이다. 즉 몸뚱아리만 덩그러니 있는 상태로 본다 해도 아주 틀린 얘기는 아니다. 따라서 리니지에는 치트 엔진 같은 메모리 해킹 툴이 거의 사용되지 않는 편이다. 이외에도 최신 PC 온라인 게임인 몬스터 헌터까지 간단한 수치변동 검색만으로 뚫리기에 게임이나 엔진이 치트엔진에 수치들이 쉽게 검색되지 않는 것을 바라기에는 무리가 있다.

6. 여담

7. 같이보기



[1] 다만 요즘은 IDA와 같은 전문툴도 사용한다고 한다.[2] 꼭 https로 접속해야지 http로 접속했다간 검열의 무서움을 보게 된다. 여담으로 차단 사유는 "불법 게임물".[3] 만약 이를 원치 않고 깨끗한 파일을 받고싶다면 patreon으로 등록하면 된다.(유료) 다만 이 경우에도 오프라인 설치는 불가능하다고 한다.[4] 어느 곳에서 구하든 v7.2.0.9 버전이라면 md5: 28f146f830f6b7b506f683d96ab94362 / sha1: 17716a4e02c120f20bdb7ef1e15cdc04935f119c 의 체크섬이 일치해야 한다.[5] 치트 엔진 한글화 방법 및 패치 다운로드.[6] 공식 홈페이지에 한글패치가 있으며 한글패치 압축파일을 풀고 languages 폴더에 붙여넣기 하고 설정에서 설정하는 것으로 간단히 한글패치를 할 수 있다.[7] 치트오매틱이나 GameWiz32와 달리 아이콘까지 불러오기 때문에 폴더와 프로그램의 이름이 같더라도 구별할 수 있다.[8] 즉, 하나의 메모리 빼고 모두 이 하나의 메모리에서 값을 받아 쓰기 때문이다.[9] 가령 상점이 존재하는 RPG류 게임이라면 상점의 물가를 보고 돈의 최대값을 가늠할 수 있다.[10] 게임에서는 암호라고 말하기 어려운게 1세대 암호인 전치 및 환치 암호도 아닌 그저 사칙연산으로 다른 수치으로 바꾼 것에 불과하다. 대부분의 게임에서는 게임의 성능과 속도를 위한 것이다. 옛날 플래시 게임 해킹을 많이 해봤다면 (찾는 값)*8+6에 익숙해져 있을 것이다. 요즘은 플래시 게임에서도 잘 안 쓴다.[11] 사실, 엄밀히 따지면 바로 앞에서 설명한 온라인 게임도 이에 속한다. 서버에서 받아서 임시로 저장해놓는 변수 메모리를 검색한 것이기 때문이다.[12] 만약 돈더미마다 최대값이 정해져 있다면, 막대한 액수의 돈을 원할 경우 슬롯마다 초소단위 돈더미들을 나눠놓은 후에 모든 슬롯의 돈더미마다 최대값으로 일일이 바꿔줘야 한다. 물론 Lua스크립트나 치트테이블로 일괄 처리할 수는 있지만 각 슬롯의 메모리상의 구조를 알아야 쓸 수 있기에 상단히 고난이도가 될 수 있다.[13] 프로그램 실행파일이나 구성된 dll 등 심볼이 부여되는 주소.[14] 참고로 스태틱 값은 스캔 후 초록색으로 표시된다.[15] 실제로 스타크래프트 2에서 모든 업적을 그냥 따주게 하는 핵으로 실제로 업적 점수가 경쟁 대상이 되는지는 미지수지만 대량 영정 사태가 일어난 적이 있으며 공허의 유산 업데이트 후 치트 엔진을 켜기만 해도 자동으로 감지하고 게임이 종료되게끔 추후 패치가 이루어졌다. 치트엔진 자체는 잘 찾아보면 지금도 우회 버전이 돌아다니고 있다![16] 이는 유료 트레이너로 유명한 치트헤픈에서도 밝히는 바로서, 사람들이 생각하는 어렵고 복잡한 프로그래밍 과정이 꼭 필요한 것은 아니다. # 자세한 내용은 '게임 해킹 프로그램'문서의 '제작에 대한 오해' 항목 참고.[17] 치트는 가능하다면 남에게 민폐를 끼치지 않는 싱글플레이에서만 사용하는 것이 좋다. 싱글플레이 게임 핵사용은 욕먹을 대상도 아니고 게임운영을 방해하는 것도 아니기에 법에 저촉되지도 않는다. 애초에 게임 제작사에서 공식 지정한 치트키나 콘솔 명령어도 결국은 싱글 플레이 전용이거나 모든 플레이어가 사용할 수 있게끔 조금 비틀어 놓은것에 불과하다.[18] 사실 이건 암호화라기보단 고정소수점 사용일 가능성이 더 높다.[19] 초기 수치없이 검색하거나 함수나 메모리주소 자체를 찾는 방법 등 여러가지 방법들이 많다. 또한 이는 튜토리얼로서 초보자도 쉽게 할 수 있다.[20] 게임이 꺼지는 경우에는 대부분 이러한 방법으로 막힌 것이다.[21] 업데이트된 핵인 경우와 마찬가지이다. 치트엔진도 오픈소스로 코드 받아서 살짝 수정해서 사용하면 다른 프로세스로 잡히기에 감지가 안 된다.[22] 이는, 리그오브레전드의 안티치트(보안프로그램)가 사용자의 모든 프로세스를 감지한다는 것이다.