tak's data blog

푸리에 변환을 이용한 메이플스토리 매크로 탐지 본문

프로젝트/메이플스토리 매크로탐지(푸리에변환)

푸리에 변환을 이용한 메이플스토리 매크로 탐지

hyuntaek 2023. 3. 3. 02:21
반응형
SMALL

 

지난 시간에는 푸리에 변환에대해 공부하였습니다. 여기서 그치지 않고 직접 수집한 데이터에 푸리에 변환을 적용해보고자 하였습니다.

 

 

우선 아래 넥슨 인텔리전스랩스의 분석 블로그를 참고했다는 점을 말씀드리고 싶습니다.

https://www.intelligencelabs.tech/4ee8c73c-b05f-4c77-a5d3-a2145ee4d7b1?_gl=1*1032rne*_ga*MjAwOTc3Mzk3OS4xNjU4NzA5MDY4*_ga_099BZY6PMG*MTY1OTY3MTQ0OC42LjEuMTY1OTY3MTUxNi42MA 

 

신호 처리를 이용한 반복 매크로 탐지

Table of contents

www.intelligencelabs.tech

 

글을 읽어보면서 이렇게도 매크로 탐지가 가능하다는 점을 배울 수 있었습니다. 지난 ncsoft분석 블로그에 이어 따라서 해보는 프로젝트인데, 역시 배움은 끝이 없습니다...

 

 

0.  문제 인식

요즘에는 그래도 핵, 작업장, 매크로 등이 많이 줄어들었다고는 합니다. 하지만 여전히 공공연하게 불법행위가 이뤄지고 있고, 최근에는 오딘에서 다양한 핵으로 인해 큰 이슈가 있었습니다.

 

그래서 저는 이러한 부분을 탐지할 수 있는 방법을 배워 적용해보고 싶었습니다. 그래서 메이플스토리의 과거 유저 데이터를 기반으로 매크로의 반복 행동에 따른 분석을 진행하게 되었습니다.

출처: 유튜브 매크로 의심 영상

유튜브에서 많은 매크로 의심 영상들을 접할 수 있었고, 그 중 한가지 영상을 기반으로 데이터를 수집하였습니다.

 

 

1. 데이터 구조

유튜브의 영상을 1초 단위로 끊어 그 시간안에 사용되는 모든 스킬들을 칼럼으로 수기 작성하였습니다.

유저 1명이 사냥하는 시간 약 720초(12분)가량의 분량으로 여러 스킬 데이터의 사용 횟수가 결합된 데이터의 형태로 정의하였습니다. 실제 로그 단위로 수집되는 데이터와는 차이가 있다는 점을 말씀드리고 싶습니다.

 

 

2. 데이터 분석

1) 스킬 사용 형태

스킬의 사용 형태는 다음과 같은 그래프로 표현할 수 있었습니다.

블로그의 내용처럼 커널밀도추정으로 평활화하기위해 1)의 데이터를 아래와 같이 최대한 변환시켰습니다. 

 

2) 조금 평활화된 스킬 사용 형태

 

제가 하고자하는 최종 목표는 매크로로 의심되는 유저가 반복적인 행동을 하는지 탐지하는 것이었습니다. 지난 포스팅에 작성했었던 푸리에 변환을 여기에 사용해보고자 합니다. 푸리에 변환으로 시간에 따른 스킬 사용 데이터를 주기에 따른 데이터로 변환할 수 있습니다. 그리고 이에 활용되는 푸리에 급수는 모든 주기성 함수를 sin과 cos의 급수로 표현할 수 있습니다. 즉, 어떤 함수를 푸리에로 표현하고자 할 때 sin, cos앞에 곱해지는 푸리에 계수를 찾아내는 방법이 바로 푸리에 변환이라고 할 수 있습니다.

 

푸리에 급수 공식 중 an, bn이 푸리에 계수입니다.

 

 

3. 푸리에 변환

위의 그림1)을 푸리에 변환한 결과입니다.

from scipy.fft import fft, fftfreq
from scipy.signal import detrend

x = skill_freq['time']
y = skill_freq['total_skill']

# 0Hz 지점의 peak문제 해결
dc_remove_signal = y - np.mean(y)
dc_remove_signal = detrend(dc_remove_signal)

strength = np.fft.fft(dc_remove_signal)/720
strength = abs(strength)
frequency = np.fft.fftfreq(720)

plt.figure(figsize=(20,10))
plt.plot(frequency, strength)
plt.xlim(0,); plt.ylim(0.05)
plt.xlabel('frequency', fontsize=20); plt.ylabel('amplitude', fontsize=20)
plt.show()

 

아무래도 데이터 수집을 수기로 하였고, 평활화가 파동 모형처럼 예쁘게 나오지 않아 위와 같은 결론이 나오게 되었습니다. 데이터 자체에서 잡음이 많다고 판단할 수 있습니다. 하지만 그 중에서도 튀는 4곳의 구간을 찾을 수 있었습니다. 

 

x축 frequency(진동수)는 주기적인 현상이 단위시간 동안 몇 번 일어났는가를 뜻합니다.

y축 amplitude(진폭) = 푸리에 계수(an,bn) 어떤 진폭을 가지는 신호들이 합쳐져 있는가를 나타냅니다.

  • 첫번째 튀는 x축 0.125Hz 주기는 1/0.125 = 8초에 1번 주기적인 현상이 일어남

즉, 720초로 수집된 데이터로 본다면 총 90번의 현상이 발생한다고 볼 수 있습니다.

 

 

4. PSD(Power Spectral Density) 전력스펙트럼 밀도

위너 킨친의 정리에 의해서 자기상관함수의 푸리에 변환은 전력밀도함수가 되고, 전력밀도함수의 역 푸리에 변환은 자기상관함수가 됩니다. 블로그에서는 푸리에 변환보다 더 명확한 주기성을 파악해 비주기, 잡음이 섞인 데이터에 이점이 있다고 설명하고 있습니다. 그래서 전력스펙트럼 밀도를 통해 분석한 결론은 아래와 같습니다.

푸리에 변환 당시에 잡음이 심해서 y축의 범위를 제한하고 peak튀는 부분만 표시했었습니다. 하지만 PSD를 사용해보니 확실히 완화되어서 표시된 것을 확인할 수 있었습니다.

  • autocorrelation의 데이터에서 90번 진동하는 신호가 가장 세다. (90Hz) autocorrelation데이터가 720개로 이루어져 있으므로 첫번째 주기는 8이다.(720/90)으로 해석할 수 있습니다.

 

여기까지 푸리에 변환을 직접활용해본 분석이었습니다.

 

인텔리전스랩스의 블로그처럼 일반, 어뷰징 유저가 섞여있는 상태라면 위의 분석 결과를 기반으로 유저를 샘플링해 탐지할 수 있을 것입니다. 추가로 유저들의 직업에 따라 스킬 쿨타임, 사용 빈도 등이 다를 것입니다. 그렇기 때문에 직업별로 위의 분석을 시행하여 정형화시켜둔다면 탐지에 용이할 것입니다.

 

 

5. 배운 점/ 아쉬운 점

 

배운 점

- 직접 수집한 데이터로 어뷰징의심유저의 스킬 사용주기와 같은 인사이트를 얻을 수 있었음

 

아쉬운 점

- 수기로 수집하여 파동의 형태로 나타내지 못해 잡음이 많았던 점

- 유저별 로그 데이터가 있다면 결과를 기반으로 어뷰징유저를 탐지할 수 있었을텐데 1명의 데이터밖에 수집하지 못한 점

- 실제 데이터에 사용된 코드를 보면서 공부하고 싶었지만, 거의 대부분 임의로 만들어낸 분석을 참고해 아쉬움

 

 

 

참고자료:

푸리에 변환

1) https://www.intelligencelabs.tech/4ee8c73c-b05f-4c77-a5d3-a2145ee4d7b1?_gl=1*1032rne*_ga*MjAwOTc3Mzk3OS4xNjU4NzA5MDY4*_ga_099BZY6PMG*MTY1OTY3MTQ0OC42LjEuMTY1OTY3MTUxNi42MA 

2) https://medium.com/crocusenergy/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%AC%EC%9D%B4%EC%96%B8%EC%8A%A4%EB%A5%BC-%EC%9C%84%ED%95%9C-%ED%91%B8%EB%A6%AC%EC%97%90-%EB%B3%80%ED%99%98-d7800805f80b

3) https://www.dacon.io/competitions/official/235757/codeshare/3590

4) https://sdc-james.gitbook.io/onebook/4.-numpy-and-scipy/4.3-scipy/4.3.3.-fast-fourier-transforms-scipy.fftpack

 

 

PSD

1) https://www.youtube.com/watch?v=Rn4_d90rq7s

2) https://scicoding.com/calculating-power-spectral-density-in-python/

3)https://datascienceschool.net/03%20machine%20learning/03.03.02%20%ED%91%B8%EB%A6%AC%EC%97%90%20%EB%B3%80%ED%99%98%EA%B3%BC%20%EC%8A%A4%ED%8E%99%ED%8A%B8%EB%9F%BC.html

4) https://rfriend.tistory.com/690

반응형
LIST