How to make game hack(tweak) on the iOS

11/22/2015 0 Comments

Game Hack은 게임의 Logic을 조작해서,  비정상적인 플레이가 가능하게 합니다.
카드게임을 예를 들면 상대방의 패를 훔쳐보거나 자신의 패를 상대방보다 더 좋게 만들 수 있습니다.
많은 종류의 Game Hack은 Binary Patch 또는 Hooking을 통해서 Game의 Logic을 수정합니다.

Demo를 위해서 Blackjack이라는 게임을 만들었습니다.
Blackjack은  카드의 합이 21에 가까운 사람이 승리하는 게임입니다.

게임이 시작되면 52장의 카드가 생성되고, 랜덤하게 섞이게 됩니다. 
그런 다음 플레이어와 딜러에게 나누어주죠.
플레이어는 카드의 합이 21에 가깝도록 만들고 Stand 합니다. (Hit는 카드를 한장 더 받게됩니다)
플레이어가 Stand 하면, Dealer도 카드의 합이 21에 가깝게 만듭니다.

이후, 플레이어와 딜러의 카드의 합을 비교해서 합이 21에 가까운 사람이 승리하게됩니다.


게임을 시작하는 순간, 메모리에는 플레이어의 카드와 딜러의 카드정보는 이미 저장되어 있습니다.
UI상으로 플레이어는 딜러의 마지막 카드1장을 볼 수 없지만, 메모리 내 카드정보가 저장된 주소만 알 수 있다면 딜러의 마지막 카드를 훔쳐 보거나 조작할 수 있습니다.


게임이 시작될 때마다 카드정보가 저장된 메모리 주소를 알 수 없으므로 관련된 함수를 후킹해서 딜러의 카드를 볼 수 있습니다.

iOS의 경우 'Substrate', 'Theos', 'CaptainHook', 'Frida' 와 같은 프레임워크를 사용해서 간단하게 Hooking을 할 수 있습니다.

Substrate 프레임워크는 클래스 함수, 변수, 네이티브함수 등을 조작할 수 있는 API를 제공합니다.
(http://www.cydiasubstrate.com/id/264d6581-a762-4343-9605-729ef12ff0af/ 에서 API에 대한 자세한 정보를 확인할 수 있습니다)



위의 API는 Objective-C 로 구현된 클래스를 후킹하는 메소드입니다. Substrate에서 제공하는 다양한 API를 사용해서 private Type의 클래스 변수까지도 접근/ 조작 할 수 있습니다.

딜러의 카드를 훔쳐보기 위해서는 게임의 구조, 동작방식에 대해서 먼저 분석해야합니다.
어떤 함수로 부터 카드가 생성되는지 분석하고, 해당 함수를 공격합니다.

Application의 클래스정보는 class-dump를 이용해서 확인할 수 있습니다.


class-dump로부터 생성된 파일(BJDGameModel.h)을 보면 private 타입의 클래스 변수와 클래스 메소드들을 확인할 수 있습니다.



-(id)dealerCardAtIndex:(int)index  을 후킹해서 딜러의 카드 정보가 들어있는 변수(NSMutableArray* _dealerCards)에 접근할 수 있고, 딜러의 카드를 훔쳐볼 수 있습니다.


  • using Substrate
  • using iOSOpenDev
  • using Theos
위 코드를 빌드하고 생성된 Tweak을 디바이스에 설치합니다.
그리고 블랙잭을 실행하면, 로그상으로 딜러의 카드를 볼 수 있습니다.

If you need my help, tell me anytime. Facebook