시스템 메모리 변동을 읽어서 게임의 변수를 찾아내고 변조시킴
예를들어 내 돈이 9000 에서 9050 으로 올랐다면, 게임 메모리 영역에서 9000 에서 9050 으로 변한 좌표를 찾아내서 99999 으로 만듬.
그러면 돈이 99999 가 됨.
해결법:
게임에서 계속 변수값을 변형시킨다.
수식을 만들어야 함. 대표적인 예는 비트연산자중 ^(xor) 인데,
Xor 연산자가 뭔지는 여기서는 다루기 복잡하고 다음 특징들만 알면 됨.
변수 = 변수값 ^ 값 식으로 적용하면 변수값이 크게 변한다.
변수 = 변한변수값 ^ 값 식으로 다시 적용하면 원래 값으로 돌아간다.
자연수 외의 숫자를 사용하면 값을 보장 못하므로 자연수만 쓰자.
이 특징을 이용해서 매 프레임마다 다른 값으로 xor 하면 됨.
예시:
게임메이커 방식으로 예시를 들어봄.
1. 게임 시작할때 글로벌 변수 선언 (global.key = irandom(1000000))
2.점수나 체력 등 유저가 조작할법한 변수는 해당 글로벌 변수로 xor 해서 사용(hp = 100 ^ global.key, hp = (hp - damage) ^ global.key, if hp ^ global.key <= 0 {})
3.치트엔진이 바뀐 변수도 찾아내지 못하도록 xor 패턴도 매 프레임 끝 마다 변경(hp = hp ^ global.key, global.key = irandom(1000000), hp = hp ^ global.key (순서대로))
너무 많은 변수에 적용하면 성능에도 지장이 있고 개발도 복잡해지니 적절히 판단해서 사용하도록 합시다. 값이 0,1,-1 정도에서만 노는 애들은 치트엔진에서 찾아내기 매우 힘드니 무시해도 됩니다.
http://wininternal.tistory.com/m/entry/게임-등의-어플리케이션-개발-시-메모리-해킹-방지-기법-1
호옹이 추천
더 저세한 내용을 원하는 분들을 위한 외부 링크
변수에 램덤 숫자를 제곱해서 값을 불려서 치트엔진이 못알아보게 하는거임 ?
ㄴㄴ xor은 제곱이 아님 수학에선 저걸 제곱이라 표현하는데, 비트연산에서는 xor 가 둘의 값이 같으면 0, 다르면 1 로 표현하는 수식임
예를들어 5 랑 6 이면 2진수로는 각각 101 과 110 인데 이 둘을 xor 하면 셋째자리는 둘다 1로 같으니까 0, 첫, 둘째자리는 다르니까 1이 되서 011, 즉 3 이됨
근데 3에서 또 5로 xor 하면 11 ^ 101 = 110 으로 다시 6 이됨. 이런 특징 때문에 유사 암호화처럼 쓰임. 진짜 암호화는 프레임마다 작동하긴 성능을 많이 잡아먹으니까...
겜메에서도 xor 연산자가 ^ 니까 저대로 쓰면됨
오 신기하네... 근데 치트엔진은 메모리값이 상승하는지, 하강하는지도 비교해서 값 찾기도 하던데 그것도 방지됨?
결론만 말하자면 겜메에서 한 프레임 끝나고 다음 프레임 될때까지 사이에만 변수값을 변조하면 일반적인 치트엔진에선 못뚫음
변조한것까지도 찾아내는 놈들도 변조하는 식이 매번 바뀌면 못찾아낸다고 보면 됨.
그래서 global.key 도 자꾸 변형해주는것
범용 치트엔진이 아니라 해커가 작정하고 덤벼도 못뚫는지는 모르겠음.
그럼 표시만 달라지고 실제 값은 같은거구나 - dc App
ㅇㅇ 맞음 치트엔진은 겜메에서 작업하는 도중을 잡는게 아니라 작업 끝나고 다음 프레임 기다리는걸 잡는거라 그때만 변조되어 있으면 됨
다른 방식도 많은데 성능대비 효율은 xor 이용하는게 젤나음
우회방법 알려줘서 감사
좋은글이다