DX라이브러리2014. 12. 30. 17:02

3.13 개조불가능한 세이브데이터 만드는법 - 2


구체적인 이야기에 들어가기 앞서 간단하게 정리를 해본다.


세이브데이터

경험치 = 1000


위와 같은 데이터가 있다고 할 때 수정은 매우 간단하다. 


세이브데이터

경험치 = 2000


이처럼 단순히 수정해주기만 해도 된다. 하지만 다음과 같은 데이터라면 이야기가 틀려진다.


세이브데이터

경험치 = 1000

해시값 = 25


해시값은 경험치의 값에따라 변경되는 값이다. 경험치를 변경하기 위해선 해시값역시 수정해주어야 한다. 수정을 시도하는 입장에선 이 해시값이 어떻게 도출됐는지 알 수 없다. 시험삼아 경험치항목만 2000으로 변경해본다.


세이브데이터

경험치 = 2000

해시값 = 25


유저와는 다르게 프로그래머 입장에서는 이게 잘못된 데이터라는것을 알 수 있다. 해시값의 공식이 "경험치를 39로 나눈 나머지"라는 규칙을 직접 적용했기 때문이다. 1000을 39로 나눈 나머지는 25이지만 2000을 39로 나눈 나머지는 11이다. 계산이 맞지 않기 때문에 임의 수정된 값이란것을 알 수 있다.


이처럼 세이브데이터에 의존하여 변경하는 값을 함께 기록하면 세이브데이터의 임의 수정을 발견 가능하다. 위의 예에서는 39로 나눈 나머지라는 규칙을 사용했기 때문에 39번 시험해보면 해시값을 발견 가능하지만 지금부터 이야기할 해시 알고리즘인 MD5를 사용하게 되면 340282366920938463463374607431768211456개의 패턴이 있기 때문에 현실적으로 해독하기가 불가능하다.


MD5는 일종의 난수라고 생각 할 수 있다. 최초에 시드가 되는 키를 입력하는 것으로 규칙을 알 수 없는 일억개의 초기값이 결정된다. 여기에 데이터를 하나씩 부여하는 것으로 해시값은 하나하나 알 수 없는 값으로 변화한다. 하지만 언뜻 보기에 난수처럼 보이는 이 값들도 같은 순서를 통해 계산하면 반드시 같은 값을 반환한다. 초기값을 39라고 가정하자. 그리고 경험치인 "1000"의 문자열을 한문자씩 MD5 계산함수를 사용하여 반환해보면 


"1"을 적용하면 해시값이 변한다.

"0"을 적용하면 해시값이 변한다.

"0"을 적용하면 해시값이 변한다.

"0"을 적용하면 해시값이 변한다.


최종적으로 반환된 값은 언뜻보기에 알 수 없는 엄청난 길이의 함수값이 된다. 임의수정을 확인하기 위해서는 위에서의 방법과 마찬가지로 39를 초기값으로 "1,0,0,0"순서대로 데이터를 적용해보면 방금 얻은 해시값과 동일한 값을 얻을 수 있다. 이것이 "2000"같이 경험치가 임의수정됐다고 한다면 계산되는 해시값 역시 달라지며 임의수정을 검출해 낼 수 있다.


여기서 MD5 알고리즘을 이해하고 또 실제로 사용하는것은 어려울 수 있지만 windows.h에는 해시값에 대한 계산 라이브러리가 포함되어있다. 여기를 확인해보자. 이렇게 계산된 해시값을 세이브데이터에 추가하여 임의수정체크를 해주면 되겠다.

Posted by 캡슐리어