안드로이드 게임 해킹 - 무슨 함수를 후킹할 것인가

유니티 기반의 안드로이드 게임 속도를 조작하려면 무슨 함수를 후킹하여야 할까? 2장의 첫 부분에서 언급했듯이 스피드핵은 게임에서 사용되는 '델타 타임'이라는 개념을 이용하여 구현된다. 유니티에서는 이 '델타 타임' 값을 쉽게 구할 수 있도록 Time 클래스 내에 deltaTime 이라는 프로퍼티를 제공하는데(C# 기준), 해당 프로퍼티의 값이 무슨 함수를 통해 구해지고 있는지 알아내야 했다. 이를 위해 유니티 구동 파일(UnityEngine.dll, libunity.so)을 분석하였으나 정확한 하나의 함수를 찾는 데에는 실패하였다. 하지만 프로퍼티의 값을 구하기 위해 사용되고 있을 법한 몇몇 함수들을 찝어내는데에는 성공하였다. 그 목록은 아래와 같다.


int clock_gettime(clockid_t clk_id, struct timespec *tp);

int gettimeofday(struct timeval *tv, struct timezone *tz);

clock_t clock(void);


위 함수들을 하나씩 후킹해보면서 게임에서의 변화를 관찰해보면 한 개는 걸려들지 않을까 하는 마음으로 연구를 진행하였고, 그 결과 clock_gettime 함수와 gettimeofday 함수가 deltaTime 프로퍼티를 구하는 데 사용되고 있다는 것을 알아낼 수 있었다. 후킹 함수는 아래와 같은 방식으로 구현하면 된다.


// 2배속

#define SPEED 2


fake_gettimeofday

{

if(isfirst)

basetime = real_gettimeofday();


return basetime + (real_gettimeofday() - basetime) * SPEED;

}