1. Home
  2. 보안 강좌/CheatEngine
  3. 치트엔진으로 블루스택 메모리 검색하기(수정하기)

치트엔진으로 블루스택 메모리 검색하기(수정하기)

이미지 출처 : https://ko.wizcase.com/download/cheat-engine/, https://iconscout.com/icon/bluestacks

안녕하세요 파일입니다. 오늘은 치트엔진으로 블루스택 메모리 검색해서 수정하는 방법에 대해 알아봅시다.

 

우선 기본적으로 치트엔진으로 프로세스 메모리(RAM) 값을 검색해서 마음대로 수정할 수 있다는 건 대부분 아실겁니다. 그런데 치트엔진으로 일반적인 윈도우 위에서 돌아가는 프로세스를 잡아서 메모리 서치는 쉬워도, 블루스택 처럼 가상환경으로 돌아가는 안드로이드 앱들의 메모리는 바로 접근할 수 없습니다.

 

저도 정확히 가상환경이나 샌드박스 시스템의 원리를 자세히 공부하지 않아서 자세히는 말씀드리기 어렵습니다만, 기본적으로 블루스택과 같은 가상환경에서 사용하는 사용하는 가상의 메모리 주소를 치트엔진으로 바로 접근할 수 없는 개념으로 이해하면 될 거 같습니다.

 

하지만 역시 다 방법이 있습니다. 오늘은 이에 대해 간단히 소개해봅니다.

 

How to?

방법에 대해 간단히 설명드리자면 치트엔진에서 가상메모리 값이 아니라 피지컬 메모리에 직접 접근할 수 있는 기능을 통해 접근을 하게 됩니다. 가상메모리가 아니라 물리 메모리? 이건 뭘까요??

우선 관련 정보가 너무 없어서 제가 이해한 바로는 운영체제(OS)의 가상메모리를 의미하는 듯 합니다.

 

 

이미지 출처 : https://devowen.com/252

여기부터 관심없으신 분들은 그냥 치트엔진이 물리 메모리 검색, 즉 컴퓨터의 모든 메모리 값을 검색할 수 있는 기능으로 검색한다~ 정도만 이해하고 바로 쭉내려서 방법만 보세요

 

기본적으로 OS는 가상메모리 개념을 이용해서 실제로 우리가 DRAM의 값을 직접 쓰거나 읽을 수 있게 하는것을 방지합니다. 우리가 실제로 프로세스에서 사용하는 메모리 주소 역시 전부 OS에서 제공하는 가상메모리 주소입니다. 우리는 일반적인 방법으로는 절대로 DRAM의 물리적 값에 접근할 수 없습니다. (프로세스로 접근한다던가)

 

* 우리가 C언어에서 포인터로 다루던 그 주소들도 사실은 가상 메모리의 주소들입니다. 실제 DRAM의 주소가 아님.

 

이렇게 한 이유는 기본적으로 윈도우 같은 OS도 C언어로 작성한 프로그램이기 때문에 램위에서 노는데, 프로세스에게 물리적 메모리 값 (DRAM 값) 에 그대로 쓰기/읽기 권한을 주게 되면 프로세스가 윈도우 OS 실행코드 등을 오염시켜서 윈도우가 그대로 죽어버린다던가, 어떤 프로세스가 다른 프로세스의 메모리를 함부로 읽을 수 있게 되서 보안문제도 발생하게 됩니다. 

 

그래서 OS는 프로세스마다 4GB씩 메모리를 가상적으로 할당해주고, 실제로 Page나 Segement 라는 개념을 활용해 그 가상메모리 주소를 실제 피지컬 메모리, 즉 물리 메모리(DRAM) 주소에 매핑(대응) 시켜줍니다.

 

물론 OS가 가상메모리로 DRAM 값에 직접 접근하는걸 보호하고 있다지만, 윈도우 OS 운영체제 코드던 모든 프로세스던 중간에 매핑 작업을 통해 모두 Physical Memory에 대응되어서 실행되고 있기 때문에 Physical Memory 값을 해킹 기법등을 이용해 접근하면 램 위의 모든값을 읽어낼 수 있습니다. 치트엔진은 고맙게도, 컴퓨터 자체를 가상화해서 피지컬 메모리에 직접 접근할 수 있다고 합니다 ㄷㄷ

 

뭐 어떻게 하는진 잘 모르고.. 치트엔진 제작자 다크 바이트씨가 굉장히 똑똑한 사람이라 할 수 있는거겠죠 그래서 치트엔진을 사용하면 유저 레벨이 아니라 커널 레벨의 디버깅까지 가능합니다. 사실 사설이 길었는데 어쨌던 블루스택 역시 가상환경이라고 해도 램 위에서 돌아가니깐, 피지컬 메모리에 접근하면 그 안에서 돌아가는 안드로이드 앱에 값을 쓸 수 있는거겠죠.

 

 

 

Setting

우선 본 글은 블루스택 5 Nougat 32비트, 치트엔진 7.3(64비트 버전) 을 기준으로 합니다. (+윈도우 10 버전 21H2) 입니다. 확인해보니 치트엔진은 64비트던, 32비트던 별 상관없는거 같고 운영체제도 크게 중요하진 않아보입니다.

 

그런데 일단 블루스택5 는 꼭 32비트로 구동해주세요. Hyper-V 지원 버전으로 하면 안됩니다.

 

 

Hyper-V 가상화 기능 끄기

아까 본문에서도 말씀드렸지만 치트엔진이 가상화 기능을 통해서 컴퓨터의 피지컬 메모리에 직접 접근할 수 있게 해줍니다. 그런데 윈도우10 에서 기본 지원하는 Hyper-V 라는 가상화 기능과 충돌하기 때문에, 만약에 Hyper-V를 키고 치트엔진 피지컬 메모리 검색을 하면 얄짤없이 블루스크린을 만납니다. (IRQL GT ZERO AT SYSTEM SERVICE 라는 메세지였던 거 같네요.)

 

그리고 Hyper-V는 어짜피 꺼야 하는게, 블루스택 32비트 버전을 실행시키려면 어짜피 꺼야 합니다. Hyper-V를 키고선 블루스택 32비트 버전이 실행이 안되거든요...

 

여기서 끄는 방법은 블루스택 5 공식 사이트를 출처로 합니다.

만약에 Hyper-V가 이미 꺼져있고 블루스택 32비트 버전이 정상적으로 실행되신다면 이 부분은 건너뛰어도 됩니다.

 

 

HD-DisableHyperV_native_v2_2.exe
0.43MB

 

1-1 우선 위 프로그램을 실행시키면 Hyper-V를 비활성화 할 수 있습니다.

 

 

bcdedit /set hypervisorlaunchtype off

1-2 또는 프로그램을 실행시키는게 싫으시다면 cmd창을 관리자 권한으로 여시고 위 명령어를 입력하면 비활성화 됩니다.

둘 중에 편한 방법을 선택하시면 됩니다.

 

물론 이게 끝이 아닙니다. 확실하게 Hyper-V를 끄기 위해 더 해줄 작업들이 있습니다.

 

윈도우 작업표시줄 왼쪽에 검색창에 windows 기능을 검색한 다음 맨 위 뜨는 Windows 기능 켜기/끄기를 엽니다.

 

위에 제가 빨간색으로 표시한 부분을 끕니다. 만약에 WSL2 를 사용중이시면 가상 머신 플랫폼하고 Linux용 Windows 하위 시스템 이 2가지만 체크해서 사용할 수 있는데, 커널 모드 디버거를 사용하려면 가상 머신 플랫폼도 체크 해제해야 하기 때문에 WSL2를 사용할 수 없습니다. 참고해주세요.

 

Hyper V 설정이 끝났으면 치트엔진을 켭니다. 그리고 치트엔진의 Settings 부분을 눌러서 설정창을 엽니다.

(만약에 Hyper-V가 애초에 꺼져있었던 분들은 여기서부터 따라하면 됩니다.)

 

이제부터 사진대로 그대로 따라해주세요.

아마 여기선 다른점이라곤 MEM_MAPPED 부분에 체크 하는 정도밖에 없을겁니다.

 

커널모드 디버거를 활성화 해주셔야 하는데 아마 중간에 뭐 이걸 켤려면 드라이버 활성화 하고 재부팅 하라고 나올건데 지시대로 꼭 따라주세요. 대충 드라이버까지 설치한다음에 치트엔진을 켜면 왼쪽 위에 DBK64 LOADED 라고 깜빡거리면서 화면이 나올겁니다. 그때 저 커널 모드 디버거를 활성화 할 수 있게 됩니다.

 

 

만약에 Hyper-V 를 끄지 않았다면 저곳에 체크가 비활성화 되어서 체크 자체를 할 수 없습니다.

Hyper-V를 켜면 피지컬 메모리 검색도, 커널 모드 디버거도 활성화가 안되니 반드시 해제해주세요.

또 64비트 치트엔진으로 저부분 활성화가 잘 안되면 32비트 버전으로 켜서 시도해보십시오.

 

 

 

이 부분 역시 전부 체크해줍니다.

이러면 치트엔진 세팅은 끝났습니다.

 

블루스택을 구동하신 후 치트엔진 검색시 따로 프로세스를 잡지 말고, 맨 위에 새로 추가된 Physical Memory 를 선택해 검색을 해서 값을 찾아주시면 됩니다.

모든 물리 메모리를 검색하기 때문에 CPU가 좋아도 상당히 느립니다.

 

위 방법이 제대로 통하지 않으면 (다른 방법)

저는 데이터를 서버에 저장하지 않고 클라이언트에 저장할 것이라고 추정되는 싱글 게임인 "Hill Climb Racing" 이라는 게임으로 테스트를 해봤는데요. 유투브에서 보던것과 다르게 저는 피지컬 메모리로 검색이 안되더라구요..? 

 

그래서 유투브에서 방법 영상을 조금더 찾아봤는데 보니깐 위 세팅대로 설정을 잘해주면 치트엔진으로 블루스택 프로세스를 잡아서 바로 검색하는게 가능하더라구요.

 

만약 위 Physical Memory 로 값을 못찾으시겠으면 이 방법도 따라해보세요. 우선 제가 위에서 설명한 방법대로 치트엔진을 다 설정했다는 기준하에 진행합니다.

 

치트엔진에서 값 검색할 프로세스를 HD-Player.exe (블루스택 실행 파일) 로 잡습니다.

 

왼쪽 위의 돈 값을 치트엔진으로 검색합니다.

 

저건 실제로 제가 이미 바꿔둔 값이라 값이 몇가지 안뜨네요. 이제 게임에 들어가서 돈을 먹어본다음에 그 돈값대로 바뀌는 값이 아마 이 게임에서 저장하는 돈 값일겁니다.

 

돈을 먹고 값을 보니깐 돈에 맞춰서 오르는 값 딱 하나가 보이네요 이 값이 돈을 저장하는 값인거 같군요.

 

더블클릭해서 값을 수정해봅니다...

 

돈 값을 바꾸고 돈을 먹어보니 바로 값이 반영이 되네요. 실제로 값도 잘 찾아지고 메모리에 값쓰기도 잘 되는거 같습니다.

사실 위 Physical Memory 로 검색하는거 보다 이 방법대로 되시는 분들은 이렇게 찾는게 더 좋습니다. 왜냐하면 블루스택 프로세스 안에서만 메모리 검색이 이루어지기에 물리 메모리 검색보다 훨씬 빠릅니다.

 

치트엔진에서 찾아놓은 메모리 값에 오른쪽 클릭 - Find out what writes to this address 를 누르면 자동으로 디버거가 활성화 되면서 어떤 기계어(어셈블리어) 가 찾아놓은 값에 접근하는지 확인할 수 있는 아주 강력한 기능이 있습니다.

 

그러나 치트엔진으로 블루스택을 접근하는 환경에서는 이렇게 메모리 값을 읽거나 쓰는건 가능하지만, 디버깅은 제대로 되지 않습니다. 해보니깐 DBVM 가상엔진으로 디버깅 한다는데 크래쉬가 뜰 확률이 매우 높다고 치트엔진에서 경고 문구가 나오고 디버거를 켠 순간 블루스크린을 만나게 됩니다. (ㅠㅠ)

 

만약에 값 수정 + 디버깅까지 다 하고 싶으시다면 안드로이드에 치트엔진에서 제공하는 ceserver란걸 깔아서 서버 프로그램을 블루스택 쪽에서 돌려서 치트엔진이 클라이언트로 안드로이드 시스템에 메모리 작성 및 디버깅을 지원할 수 있도록 해야 합니다. 

 

이 부분에 대해선 나중에 포스팅으로 올리도록 하겠습니다.

어쨌던 메모리값을 찾아서 수정하는데 있어선 문제 없이 진행할 수 있다는 점을 확인할 수 있겠습니다.

 

이 방식은 기본적으로 블루스택 환경(SandBox) 외부에서 메모리에 개입하여 수정하는 방식이기 때문에 게임가디언 처럼 탐지당할 일이 없는 생각보다 강력한 방식의 해킹 방식 입니다.

물론 요새 나오는 게임들은 기본적으로 값을 암호화 하고 있고, 이 방식으론 디버깅도 안되기 때문에 감으로 진짜 값들을 찾아야 하겠지만요..

SNS 공유하기
네이버밴드
카카오톡
페이스북
X(트위터)

최근글
인기글
이모티콘창 닫기
울음
안녕
감사
당황
피폐